🔍 概要
SlackのメッセージログなどをRailsアプリで受け取るには、Slack APIのEvent Subscriptions(イベントサブスクリプション)を利用します。
この記事では、Slackイベントを ChatsController#create
に送る設定と、実装時にハマりがちなポイントをまとめます。
⚙️ 前提:Slackのイベント通知の仕組み
Slackからイベントを受け取るには、Slack Appの管理画面でEvent Subscriptionsを有効にし、
その送信先としてRails側のエンドポイントURL(例: /chats
)を設定する必要があります。
Slackは設定時に“challenge” トークンをPOSTで送信してきます。
このトークンをそのままレスポンスすることで、SlackがURLの正当性を確認します。
🚧 ローカル開発では動作しない?
Slackからのリクエストは外部からアクセス可能なサーバーにしか送られません。
そのため、ローカル開発では動作確認ができません。
ステージング環境などを使って確認してください。
ただし、URLを変えるごとに“challenge”リクエストをする必要があるので、本番環境にURLを変える時は再度“challenge”リクエストをしてください。
✅ Rails側の実装
Slackからの"challenge"検証に対応するコードは以下のようになります。
class ChatsController < ApplicationController
# Slackの検証のため、認証をスキップする(後述)
skip_before_action :authenticate_verify, only: [:create]
def create
# SlackからのURL検証
if params["challenge"]
render json: { challenge: params["challenge"] }, status: :ok
return
end
# ここにSlackイベント受信後の処理を書く
end
end
⚠️ 注意点:独自認証との干渉に注意
Railsアプリ側で before_action による認証を使っている場合(例:authenticate_verify など)、Slackのchallengeリクエストが弾かれてしまいます。
これを回避するために、該当アクションではスキップする必要があります。
# challenge検証中は認証をスキップ
skip_before_action :authenticate_verify, only: [:create]
📝 challengeの検証が終わったら?
Slack側でURL検証(challenge)が成功すると、以降はイベント通知が送られるようになります。
その後は、params["challenge"]の処理は不要なので、コメントアウトまたは削除しておいても構いません。
# skip_before_action :authenticate_verify, only: [:create]
# if params["challenge"]
# render json: { challenge: params["challenge"] }, status: :ok
# return
# end
💡 まとめ
-
Slackのイベント通知を受け取るには、Event Subscriptionsと外部アクセス可能なエンドポイントが必要
-
Railsでは params["challenge"] をそのまま返す実装が必要
-
before_action で独自認証をしている場合は、Slackリクエストに対してスキップ指定が必要
-
challenge検証後は該当コードをコメントアウト or 削除してOK
📌 余談:ボットユーザーがいないというエラーについて
Slack App のインストール時に、「インストールするボットユーザーがありません」というエラーに直面することがあります。
私もこの問題に遭遇しましたが、以下の記事が非常に参考になりました。
お困りの方は、ぜひ一読をおすすめします。