slackで @channel
メンションに消耗してる人のために 'at channel police' という Bot を作った.
メッセージの送信をトリガーにした slack bot を作るのが意外と面倒だったのでまとめた.タイトルにはぱっと作るって書いたけど,書いてみたら全然ぱっと作れなさそう.
サンプルコードはrailsだけど,slack上の設定の方が圧倒的にウェイトが重いので,そこを中心にまとめた.
ちなみにサンプルでは slack-ruby-client という公式のgemを使った.
Prepare
slack app を作る
https://api.slack.com/apps
App name と team を入力して作成,
https接続
callback URL が https でないといけないので, ngrokをつかうと便利.
ref: ngrokを使用してローカル環境を外部に公開する
表記について
slack の設定ページURLは
https://api.slack.com/apps/{APP_ID}/general
となっていてリンクをベタ書きしづらいので,サイドバーの名称をとって xx page と表記することにする.
↑これだったら Basic Information page と表記
Bot の作成
Bot Users page から Default username を設定して追加する
callback urlの設定, verify
このリンク先から auth 用 と Event API 用をそれぞれ設定する.
(at channel police では InteractiveMessage も使ったので Event Subscriptions の上の Interactive Messages からも callback の設定をしないといけなかった.)
Events API 用の callback を設定する時は verify が必要で,
{
"token": "Jhj5dZrVaK7ZwHHjRyZWjbDl",
"challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P",
"type": "url_verification"
}
ってリクエストが飛んでくるので, challenge をまんまオウム返しする必要がある.
rails で書くとこんな感じ.
class ReportController < ApplicationController
def callback
@body = JSON.parse(request.body.read)
case @body['type']
when 'url_verification'
render json: @body
when 'event_callback'
# ..
end
end
end
Events API
websocket を使った Real Time Messaging API というのがあったけど,今回は Events API で十分ぽかったのでコレを使った.
Subscribe する Event を Event Types を参考に Event Subscriptions page で設定する. 今回はユーザからの Message に反応したいだけなので, message.channels
のみでいいっぽい.
あわせて OAuth & Permissions page から Required Scope の設定もする.追加するのは channels:history
と,メッセージを送る chat.postMessage というAPIを使用するために chat:write:bot
を追加する. (bot
は Bot を有効にした時に自動で追加されてる. channels:write
はユーザをチャンネルから kick する時に必要だったやつ)
ref: OAuth Scopes
必要な token
使用する API によって必要な token が違う. Message の post をする chat.postMessage を使うためには bot
, workspace
, user
のどれかの token を使う.
bot token を使えば bot が post するし, user token を使えば authenticate したユーザが post する.tokenは OAuth & Permissions pageで両方見られる.
(ちなみにメンバーをチャンネルから kick する時は User token が必要だったので at channel police は post message と合わせて1つのアプリケーション内で2種類の token を使いわける実装になった.)
オウム返しする
これでオウム返しができるようになる.
def callback
@body = JSON.parse(request.body.read)
case @body['type']
when 'event_callback'
Slack.configure do |config|
config.token = ENV['SLACK_BOT_USER_TOKEN']
end
client.chat_postMessage(
as_user: 'true',
channel: @body['event']['channel'],
text: @body['event']['text']
)
end
head :ok
end
end
あとがき
ただオウム返しさせるだけでやること多くて疲れたし,設定ページで見たいリソースがどこにあるのかがわかりづらくていちいちたどるのに時間がかかった.
slack-ruby-client という公式のgemを使ったけど, chat_postMessage
とかいう名前のメソッドを見てつらい気持ちになった.
at channel police を完成させる元気はなくなってしまったけどこのまま成果ゼロは嫌だったので知見だけまとめた.