SlackのBot(hubot)を作ってみる

  • 94
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

最近コレを読んで、無性にChatBotを作りたくなった。
Software Design 2016年1月号|技術評論社
Slackでらくらく工数管理 « サーバーワークス エンジニアブログ

ので、手始めにSlackのbot作りをしてみようと思う。

botの種類

おもむろにslack botでググってみたところ、hubotなるものが一般的らしい。
ほかにもWebHooksを使うものもあるようだが、次のステップにしようと思う。

hubotの追加

ここからIntegrationするAppを選べる。
App Directory | Slack
スクリーンショット 2016-01-28 0.11.50.png

hubotで検索するとAppが出てくるので、導入するチームを選ぶ。
Hubot | Slack
スクリーンショット_2016-01-28_0_13_58.png

APIトークンやらBotの名前やらいろいろ設定できる画面に飛ぶので、適当に名前をつけてアイコンを設定すると、とりあえずbotユーザが追加された。
スクリーンショット 2016-01-28 0.25.10.png

botの中身を作る

botのハコはできたので、次に中身を作る。
まずは手元のMacbookで組み立てる。
どうやらNode.jsが動く環境とnpmが必要らしい。
手元の環境は既に導入済みだったので、導入方法は割愛する。

$ node -v
v0.12.7
$ npm -v
2.11.3

まずは開発に必要なモジュールをnpm経由でインストールする。
以下の4つが必要らしい。

  • hubot -> Hubot本体
  • yo -> Yeomanという雛形作成ツール
  • generator-hubot -> YeomanのHubot雛形ジェネレーター
  • coffee-script -> HubotはCoffeeScriptで書くらしい
$ npm install -g hubot yo generator-hubot coffee-script

長々と途中経過が流れるが無事インストール完了。
早速ジェネレータを叩いてみる。

$ mkdir hubot-sushi
$ cd hubot-sushi
$ yo hubot
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== (Y/n)
                      _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

? Owner 適当な名前 <適当なメールアドレス>
? Bot name sushi
? Description We Love sushi!!!
? Bot adapter (campfire) slackgot back false
? Bot adapter slack
   create bin/hubot
   create bin/hubot.cmd
   create Procfile
   create README.md
   create external-scripts.json
   create hubot-scripts.json
   create .gitignore
   create package.json
   create scripts/example.coffee             
   create .editorconfig
                     _____________________________
 _____              /                             \
 \    \             |   Self-replication process   |
 |    |    _____    |          complete...         |
 |__\\|   /_____\   \     Good luck with that.    /
   |//+  |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

(以下略)

途中いくつかbotの名前などを聞かれるが、いい感じに回答する。
インストールが完了したら、とりあえずHubotを動かしてみる。
heroku絡みのエラーが出ているようだが、一旦無視して良さそうな感じ。

$ ./bin/hubot
hubot-sushi> [Thu Jan 28 2016 01:10:58 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web-url | cut -d= -f2)`
[Thu Jan 28 2016 01:10:58 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379

sushi>
sushi> ping
sushi> sushi ping
sushi> PONG
sushi> exit

pingと打ったらPONGと返してくれた。
なお、名前を間違うと相手にしてくれない模様。

ハコと中身を繋ぐ

どうやら一般的にはherokuに突っ込むことが多いみたいだが、料金改定により無料枠で24時間稼働しっぱなしができなくなったらしい。
Herokuの新料金について

ので、一旦手元の環境(Macbook)をSlackを繋いでみる。
SlackのHubotの設定画面でAPIトークンを確認し、環境変数にセットする。

スクリーンショット_2016-01-28_1_28_17.png

$ export HUBOT_SLACK_TOKEN=<API Token>

Slackアダプターを指定し、Hubotを起動。

$ ./bin/hubot --adapter slack
[Thu Jan 28 2016 01:34:15 GMT+0900 (JST)] INFO Connecting...
[Thu Jan 28 2016 01:34:17 GMT+0900 (JST)] INFO Logged in as sushi of bdig, but not yet connected
[Thu Jan 28 2016 01:34:19 GMT+0900 (JST)] INFO Slack client now connected
[Thu Jan 28 2016 01:34:19 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web-url | cut -d= -f2)`
[Thu Jan 28 2016 01:34:20 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379

どうやら無事繋がったっぽい。相変わらずherokuのエラーは一旦無視して良さそう。
早速HubotとDirectMessageをやりあってみる。

スクリーンショット_2016-01-28_1_36_38.png

ちゃんと応答してくれた!
DMの場合はコマンドを投げるだけで良いみたい。

Channel内だとどうなるのか。
試しにHubotと二人のChannelを作り、コマンドを投げてみた。

スクリーンショット_2016-01-28_1_39_28.png

コマンド単体では応答してくれないようだ。
mentionなり、Hubotの名前を最初につけることで呼び出せるっぽい。

次回

まずはHubotの作り方、Slackとの連携の仕方までをやってみた。
このままだと手元のMacを繋ぎっぱなしにする必要が出てしまうので、次回はどこかのクラウド上にデプロイしてみようと思う。

参考

こんな僕でも30分でSlackのbotを作れた。 - アラタナエンジニアブログ
Slack で Hubot を使えるようにする - Qiita
Hubot のインストール - Qiita
Software Design 2016年1月号|技術評論社