こんにちは、こんばんは医師崎です。
業務でslack event apiを使ったのでその時に設定した事などをまとめます。
slack event api とは
EventAPIは、Slack内で起きたイベントをトリガーに、発生した内容をApp指定のURLに送る仕組みです。インターネット経由でコールバックを受ける仕組みです。Slackが送信元になり、HTTPSで待ち受ける形式です。
slack appの設定
まずは Slack API: Applications | Slack にアクセスし、Create New Appからslack appを作成します。
slack appの権限設定
左側のメニューからOAuth & Permissionsをクリックし、Bot Token ScopesのAdd an OAuth Scopeをクリックし、必要な権限のScopeを追加します。
scopeはappに必要なものを以下から探して付けました。
自分が追加したscopeは以下のものになります * channels:history * chat:write * incoming-webhook * reactions:read
Event APIの設定
左側のメニューからEvent SubscriptionsをクリックしEnable EventsをOnにRequest URLに自分で作成したapiのURLを書きます。こちらは、次に説明するapiの作成で適切なapiが作られていないと確認が通らなく承認されないので注意。
また、Subscribe to bot eventsのAdd User Bot EventにてEvent name: message.channelsを追加。message.channelsを追加するにはslack appの権限設定で「channels:history」のscopeを追加しておく必要があります。
apiの作成
自分はnodejs, expressを使用してapiを作成しました。bodyの中にあるchallengeをそのままresponseとして返して上げる必要があります。
router.post('/event_test', (req, res, next) => { console.log(req.body); // その他色々処理をしたいところ。 res.end(req.body.challenge); } );
local上で立ち上げたapiを上記のRequest URLに登録する場合、 https://ngrok.com/ を使うと便利です。
アプリをslackに追加
左メニューのBasic Information > Install your app > Install to Workspaceをクリック。連携するchannelを選択しAllowを押し連携完了。
slack側からもslack画面のチャンネル名でチャンネル詳細を表示し、Integrations > Add appsで作成したappをchannelに追加。
### slack書き込み後のreq.bodyの中を見てみる
試しにappを追加したchannel上で「送信テスト!」と書いてみると以下のようなbodyが送られて来ることを確認できます。
{ token: 'XXXXXXXXXX', team_id: 'XXXXXXXXXX', api_app_id: 'XXXXXXXXXX', event: { client_msg_id: 'XXXXXXXXXX', type: 'message', text: '送信テスト!', user: 'XXXXXXXXXX', ts: '1648536249.637289', team: 'XXXXXXXXXX', blocks: [ [Object] ], channel: 'XXXXXXXXXX', event_ts: '1648536249.637289', channel_type: 'channel' }, type: 'event_callback', event_id: 'XXXXXXXXXX', event_time: 1648536249, authorizations: [ { enterprise_id: null, team_id: 'XXXXXXXXXX', user_id: 'XXXXXXXXXX', is_bot: true, is_enterprise_install: false } ], is_ext_shared_channel: false, event_context: 'XXXXXXXXXXXXXx }
まとめ
あとはapiの中身を良い感じにいじれば、slackの投稿内容に対して色々できると思います。 自分はSocket.IOを使ったチャットとslackのthreadを紐付けてスレッド単位でブラウザとのチャットができるような実装を行ってみたりしました。
以上になります。