ikasama over technology

忘れたくないことを忘れないために

Bot の発言に反応する Slack Bot を Ruby で作ってました。

2 月から転職して新しい職場でバタバタしたり、風邪でダウンしたりでなかなかブログが書けませんでした。 いろいろ落ち着いてきたので、これからは週1くらいで何か書けたらなと思っています。

ことのはじまり

  • Bot の発言に反応してくれる Bot を作りたい
  • デフォルトで slackbot というものがある

https://your-workspace.slack.com/customize/slackbot f:id:ikasamak503:20180226022651p:plain

  • でも slackbot は Bot の発言には反応してくれない
    • Bot 同士で無限に反応してしまうのを防ぐため?
  • Bot に反応する Bot がないなら作ろう! ← イマココ

つくりました

github.com

動作に必要な環境

  • docker
  • docker-compose
  • WebSocket が通信できる環境

準備

1. Bot を Workspace に追加する

ikasama.slack.com

f:id:ikasamak503:20180226023624p:plain

追加すると API Token が見れるので、控えておく。

f:id:ikasamak503:20180226023853p:plain

反応するチャンネルに Bot を招待する

f:id:ikasamak503:20180226024722p:plain

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 を設定しているときは、接続成功時に以下のようにメッセージが飛んできます。

f:id:ikasamak503:20180226025754p:plain

Bot の発言にも反応してくれている!

f:id:ikasamak503:20180226030131p:plain

解説

slack-ruby-client とう gem をつかって作りました。

github.com

  • 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 のドキュメントを読みながらやると良いと思います。

参考