hubot使ってローカルでslackのボットを作った話

#はじめに
大学の部活で活用しているslackに誰にも望まれていないのにbotを導入しました。
思ったよりbotを作るのが楽しくてbot作りにはまってしまいました。**botに没頭**してしまったわけです。**botに没頭**。
……まあ、楽しいことは共有せなアカンということで、部員の他の人にもbotを弄ってもらえるように僕のノウハウをqiitaに投稿したわけです。


##導入の際に参考にしたサイト
[初心者がHubotを使ってHeroku上で動くSlack bot作ってみた（導入編）](http://qiita.com/susuwatarin/items/019e0e701754161f7c4c)
素晴らしく丁寧に導入の仕方を載せています。ありがたいです・・・

#導入
偉大な先人の方々がたくさんいるので導入だけでしたら情報に困らないと思います。
今回はローカルサーバーでの実装を目指します。

##インストール
とりあえず、これだけはやっておけと言うのを羅列します。
###nodeのインストール
Homebrewというツールを使ってnode.jsをインストールします。
そもそもHomebrewがわからないという人はGoogle大先生に聞いていただけると幸いです。

```bash
$ brew install node
```

これでインストールOKです。

```bash
$ node -v
```

本当に入っているのか不安ならこれで確認しましょう。

###hubotとCoffeeScriptをインストール
node.jsをインストールしたら`npm`とかいうツールが使えるようになっています。
いろんなパッケージを簡単に入れることできるのがnode.jsの素晴らしいところですね。
今回もその恩恵にあやかって`hubot`そのものとコードを記述する際に必要となる言語`coffee-script`をインストールしましょう。javascriptでも記述できるらしいけど。

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

これでOKです。`hubot`と`coffee-script`同時にインストールしました。
不安ならバージョン確認して存在を確認しましょう。

```bash
$ hubot -v
```

ちなみに `-g`というオプションはグローバルインストールをするよという意味で、npmの場所にパッケージをインストールするらしいです。
グローバルがあるということはローカルもあると言うことで、このオプションをつけなければカレントディレクトリ内のnode_modules内にインストールされます。

###yoとgenerator-hubotをインストール
どんどん行きましょう。
次は`yo`と`generator-hubot`をインストールをします。これは初めてhubotを作るときに必要なものです。

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

###hubot-slackをインストール
hubotをslackに対応させるアダプタ。

```bash
$ npm install -g hubot-slack
```

##超単純なbotを作ろう
ひとまず、これでインストール地獄は終わりです。お疲れ様でした。
これであなたもbotが作れるようになっています。
じゃあ作ってみるぞ、ということで作りましょー

```bash
#bot用のディレクトリを作る
$ mkdir testbot
$ cd testbot

#botをセットアップする
$ yo hubot
```

最後のコマンドを打つとこんな感じのやつが出てくると思います。

```bash
                     _____________________________  
                    /                             \ 
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             / 
 ======= |[^_/\_]|   /----------------------------  
  |   | _|___@@__|__                                
  +===+/  ///     \_\                               
   | |_\ /// HUBOT/\\                             
   |___/\//      /  \\                            
         \      /   +---+                            
          \____/    |   |                            
           | //|    +===+                            
            \//      |xx|                            

```

こいつがhubot作ってくれる君でいろんな質問してきます。
質問に適切な感じに答えてあげてください。
注意として`? Bot adapter: `という質問には`slack`と答えてください。
全ての質問に答えると色々作られたかと思います。

これはbotのひな形で、実際の処理はまだ書かれていません。
なのでbotにHelloと尋ねたらHelloWorldと返すだけの簡単な処理を追加したいと思います。

`scripts`というフォルダができるていると思いますので、そこにこのコードを追加します。

```coffeescript:scripts/hello-world.coffee
module.exports = (robot) ->
  robot.respond /Hello/i, (msg) ->
    msg.send "HelloWorld"
```

これで処理の追加はOKです。
実際に動いているのかテストしてみましょう。

```bash
$ bin/hubot
```

これでbotの起動ができます。
現状では色々エラーがでると思いますが、問題はないのでエンターを押して進めましょう。
そうすると、

```bash
testbot> 
```

入力待ちの状態になるので`testbot Hello`と入力すると`Helloworld`と返してくれます。

```bash:こんな感じ
testbot> testbot Hello
testbot> HelloWorld
```

入力画面から抜け出すには`exit`でOKです。

これでひとまず、超単純なbotの完成ですね。


###エラー消し
エラーが気になるという人もいると思うのでエラーを消し方を書きます。~~強引だけど~~
エラーを読むとこう書かれています。
`Your hubot-scripts.json is empty, so you just need to remove it.`
hubot-scripts.jsonが空なので消してくださいということみたいですね。
hubot-scripts.json自体を消すことで解決しました。

次に`ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL.`というエラーがあると思います。
これは環境変数が設定されていないから発生するエラーです。
external-scripts.jsonというファイル内の`"hubot-heroku-keepalive",`という記述を消すことで解決しました。これはエラーを出していた機能そのものを削ったということです。~~強引ですね~~

#slackと連携
##hubotを作る
ボットを作るためには、自分の代わりにチャットをしてくれる実態が必要となります。

Integrationにhubotを追加して、
![image](https://qiita-image-store.s3.amazonaws.com/0/78379/5cb2a1ac-9a04-2001-d53d-38a9bb17f325.png)
ここのボタンを押すとボットの実態を作ることができます。

次に作ったボットと実態を繋げたいと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/78379/42856677-96a9-cda7-d81e-7b4bd8a39a8a.png)
この部分をコピーします。

これはトークンと言われ、ボットの身分証明証みたいなものです。この数英の羅列をパスワードのように使うことによってボットの名義でチャットなどができたりすることができるわけですね。

#ローカルサーバーを立ち上げる
では、ターミナルの方に戻って以下のコマンドを叩いてみてください。

```bash
$ HUBOT_SLACK_TOKEN=<ボットのトークン> ./bin/hubot -a slack
```

そうするとローカルサーバーが立ち上がります。
これでもうスラックに存在するボットが稼働しています。
slack上でボットがいる部屋に

```
<ボットのUsername> Hello
```
とチャットしてみてください。 すると`HelloWorld`と返ってくるはずです。
(ダイレクトメッセージでチャットする場合は<ボットのUsername>は不要です)
これはダイレクトメッセージの場合チャットの文頭にユーザーには隠されている<Username>があるためです。

これでローカルサーバーは以上となります。

##環境変数

```bash
$ HUBOT_SLACK_TOKEN=<ボットのトークン> ./bin/hubot -a slack
```
このコマンドの`HUBOT_SLACK_TOKEN=<ボットのトークン>`の部分は環境変数と言われるものです。
プログラムに変数として使えるわけですね。

ちょっと実験してみましょう。
以下のようにプログラムを変更してみてください。

```coffeescript:scripts/hello-world.coffee
module.exports = (robot) ->
  robot.respond /Hello/i, (msg) ->
    msg.send process.env.HOGE_TEXT
```

そして次のコマンドを叩いてみてください。

```bash
$ HUBOT_SLACK_TOKEN=<ボットのトークン> HOGE_TEXT=てすとだよ  ./bin/hubot -a slack
```
そしてslackに`Hello`とチャットすると`てすとだよ`という返事が返ってくると思います。

##シェルスクリプト

基本普通の変数で良いと思いますが、そのうち環境変数をもっと増やしたく場面が出てくるかもしれません。
そのたびにコマンドが長くなってきたら困りますよね。
その場合はシェルスクリプトを活用したいと思います。

```bash:local_run.sh
#!/bin/sh
export HUBOT_SLACK_TOKEN='<ボットのトークン>'
export HOGE_TEXT='てすとだよ'
bin/hubot -a slack
```
このようなシェルスクリプトを作って

```bash
$ bash local_run.sh 
```
を実行すると長ったらしいコマンドをいちいち打ち込まなくてもすみます。

#まとめ
今回はローカル実装だけでしたけど、興味があるならHerokuなどを使ってボット常駐させてみるのもいいかもしれません。