Bot の発言に反応する Slack Bot を Ruby で作ってました。
2 月から転職して新しい職場でバタバタしたり、風邪でダウンしたりでなかなかブログが書けませんでした。 いろいろ落ち着いてきたので、これからは週1くらいで何か書けたらなと思っています。
ことのはじまり
https://your-workspace.slack.com/customize/slackbot
つくりました
動作に必要な環境
- docker
- docker-compose
- WebSocket が通信できる環境
準備
1. Bot を Workspace に追加する
追加すると API Token が見れるので、控えておく。
反応するチャンネルに Bot を招待する
2. コードを clone
して .env
をつくる
$ git clone https://github.com/ikasam/slack-bot.git
$ cd slack-bot
$ cp .env.sample .env
.env
に設定する項目
SLACK_BOT_TOKEN=xoxp-XXXXXXXXXXX <- さっき控えた API Token SLACK_CHANNEL=#general <- 反応するチャンネル SLACK_CHANNEL_OPS=#bot-test <- (省略可) 接続成功をお知らせするチャンネル KEYWORD=hoge <- 反応するキーワード
これで準備は完了。
実行
$ docker-compose up -d
これだけ。
動作確認
SLACK_CHANNEL_OPS
を設定しているときは、接続成功時に以下のようにメッセージが飛んできます。
Bot の発言にも反応してくれている!
解説
slack-ruby-client とう gem をつかって作りました。
- Real Time Messaging API というものを使います。WebSocket で通信するので、プロキシ環境下だと動かないかも。
# RTM Connection client = Slack::RealTime::Client.new
- 接続がうまくいったら、Slack が
hello
を送信してきます。
client.on :hello do # 接続時の処理 end
- あらゆるイベントは
message
で送られてきます。
client.on :message do |data| if (not KEYWORD.empty?) and data.channel == CHANNEL_ID case data.text when /#{KEYWORD}/ then client.message channel: data.channel, text: "<!channel> yo!" when /#{BOT_USER_ID}/ then client.message channel: data.channel, text: "<@#{data.user}> Hi." end end end
もっと細かいことをしたいなら、Slack API のドキュメントを読みながらやると良いと思います。
参考
Slack API のドキュメント api.slack.com
slack-ruby-client を使わない実装。Real Time Messaging API の勉強になる。 studio-andy.hatenablog.com