(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Slack で動く bot を作る(特定の文字列に反応するようにする)

Slack で動く bot を作る(とりあえず発言だけ) - (define -ayalog '())
ということで今回もサクッと。

Slack で bot 作ってという無茶ぶりを某 naoiwata-san に言われたので、とりあえず API とか調べてたら思いの外簡単に出来そうだったのでやってみたという話です。軽くググると Heroku + Hubot あたりでやったという記事が幾つかあるので、多分世の中的にはそれでベターなんでしょうけど、なんとなくそれでやっても自分で作った感が皆無になってしまうのでわざわざ作ってみました。

とは言うものの、そんなに難しくないです。っていうか難しくないです。

まず Integrations から Outgoing WebHooks を選択して追加します。
https://my-account.slack.com/services/new
この URL のページですね。 my-account ってなってる部分を自分たちのチーム名に変えてくださいね。

で、あとは Outgoint WebHooks のページに書いてある手順に従いましょう。はい、出来たー(ぇ

この WebHook は何をしてくれるかというと、 POST でデータを飛ばしてあげるから JSON 形式のフォーマットでレスポンス返してくれれば表示してやるよ!ってやつです。
POST のデータは書いてあるとおりこんな感じでやってくるらしく、基本的に必要なのは token と text あたりかなぁと。勿論、外のデータも必要に応じて使えると思いますが。

token=xxxxxxxxxxxxxxxxxxxxxxxx
team_id=T0001
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:

Response については text のキーを持った JSON を返せばとりあえず良さそうです。外にも username とか icon_emoji とか設定出来ますが、まぁそんなに重要じゃない。

Integration Settings のとこでは hook したい Channel とトリガーにしたい Trigger Word を設定しましょう。 Trigger Word は複数設定可能でカンマ(,)区切りみたいですね。 URL も複数設定出来ます。 Label は特に意味はなく、 Existing Integrations をページで説明として表示したいものを書いておくのが良さそう。まぁまんまラベルって感じ。その下の Message Appearance では bot の名前と icon を設定することができるのでデフォルトが嫌なら変更可能です。

さて、設定も済んだところで Server Side のコードを書いてしまいます。

require 'json'

LispAlien::App.controllers :lisp_alien do
  post :alien do
    JSON.generate({text: "< Hello, world!!"})
  end
end

今回 Padrino を使っていて適当なコントローラを作ってそこに、 Integration Settings で設定した URL になるようなものを適当に作ってます。この例では POST でとにかく投げられたらレスポンスを返すという一番シンプルなやつを書いていますが、ここに text のキーで受け取った値を使ってゴリゴリ書けば、まぁ自由に bot ぽい bot が作れる寸法です。

実際に動かすとこんな感じ。
f:id:ayato0211:20140817194008p:plain
可愛いですね。まぁこのレベルだったら Integrations の中にある SlackBot くらいでも全然良いんですが、ちょっとおもしろいことやろうと思うなら Hubot 使うかこんな感じで自分で書いちゃうかのどちらかでしょうね。そんな感じで Slack に bot を作るという話でしたー。