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

# はじめに
最近コレを読んで、無性にChatBotを作りたくなった。
[Software Design 2016年1月号｜技術評論社](http://gihyo.jp/magazine/SD/archive/2016/201601)
[Slackでらくらく工数管理 « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2015/12/16/slack-de-manhour/)

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

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

# hubotの追加
ここからIntegrationするAppを選べる。
[App Directory | Slack](https://slack.com/apps)
![スクリーンショット 2016-01-28 0.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/64811/92369f7c-d030-4d54-8e90-abc55ee26b7c.png)

`hubot`で検索するとAppが出てくるので、導入するチームを選ぶ。
[Hubot | Slack](https://slack.com/apps/A0F7XDU93-hubot)
![スクリーンショット_2016-01-28_0_13_58.png](https://qiita-image-store.s3.amazonaws.com/0/64811/dded8395-333a-9308-7949-fb2a7e34d912.png)

APIトークンやらBotの名前やらいろいろ設定できる画面に飛ぶので、適当に名前をつけてアイコンを設定すると、とりあえずbotユーザが追加された。
![スクリーンショット 2016-01-28 0.25.10.png](https://qiita-image-store.s3.amazonaws.com/0/64811/5bc173d2-1fce-2b84-bb3e-e0d92770a890.png)

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

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

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

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

```bash
$ npm install -g hubot yo generator-hubot coffee-script
```

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

```bash
$ 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絡みのエラーが出ているようだが、一旦無視して良さそうな感じ。

```bash
$ ./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の新料金について](http://www.slideshare.net/gecko655/w8lt2)

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

![スクリーンショット_2016-01-28_1_28_17.png](https://qiita-image-store.s3.amazonaws.com/0/64811/1e3055a5-094e-7ea9-de51-5130a90998f5.png)

```bash
$ export HUBOT_SLACK_TOKEN=<API Token>
```

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

```bash
$ ./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](https://qiita-image-store.s3.amazonaws.com/0/64811/10464d25-769f-c3fc-cb3d-68845799ac83.png)

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

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

![スクリーンショット_2016-01-28_1_39_28.png](https://qiita-image-store.s3.amazonaws.com/0/64811/c4b0e35b-ed09-8fcc-63c1-a02a18e4a9e5.png)

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

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


# 参考
[こんな僕でも30分でSlackのbotを作れた。 - アラタナエンジニアブログ](http://lab.aratana.jp/entry/2014/12/04/185053)
[Slack で Hubot を使えるようにする - Qiita](http://qiita.com/misopeso/items/1f418dd02e89234499b3)
[Hubot のインストール - Qiita](http://qiita.com/bouzuya/items/11c0c6da2b3ad54b827f#hubot-echo)
[Software Design 2016年1月号｜技術評論社](http://gihyo.jp/magazine/SD/archive/2016/201601)