Hubotを使ってSlackのボットを作る

Hubot導入編

 Slackのボットを作ってみたくなったんですが、さっぱりわかりません。グーグル先生に聞いたら、Node.jsを使うらしいです。とゆーわけで「centos + node.js + npm + nvm インストール - Qiita」のページを参考に、Node.js諸々を導入します。

 まず、Node.jsを導入します。

# yum install epel-release
# yum install nodejs
# node -v

 次に、npmを導入します。

# yum install -y npm --enablerepo=epel

 どんどん、導入しちゃいます。

# npm install -g hubot yo generator-hubot coffee-script

 「SlackのBot(hubot)を作ってみる - Qiita」のページによると、

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

 ……だそうです。

 導入がうまくいかないときは、バージョンと導入場所を確認します。具体的には、アップデート/追加導入します。「Node.jsとnpmをアップデートする方法 – Rriver」を参考に、まずはNode.jsをアップデートします。

# npm install -g n
# n --latest

 次に、npmをアップデートします。

# npm update -g npm

 自分の場合は以下のコマンドで、すべてをアップデートしてしまいました。

# npm update -g

 それでも導入がうまくいかないとき(ERRが表示される)は、実行したいユーザーで「npm install」コマンドを実行します。その際、-gオプションは外します。

 Hubotの導入が終わったら、ボットを作成します。

# su - stic
$ mkdir slack_bot
$ cd slack_bot
$ yo hubot

 質問に答えていくと、ボットが作成されます。完了したら、動作確認です。

$ bin/hubot

 Enterキーを押してプロンプトが出たら、「ボット名 PING」と話しかけると「PONG」と返事してくれます。

 これだけだとつまらないので、追加の動作確認。「CoffeeScript? なにそれ? ミルクと砂糖は入れてね」ぐらい、全然わかっていない状態なので、以下のサンプルスクリプトを使わせてもらいます。

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '[IPアドレス]');
console.log('Server running at http://[IPアドレス]:1337/');

 [IPアドレス]のところは書き換えます。1337ポートを開けておきます。

$ vi helloworld.js

 上のサンプルスクリプトを書きます。

$ node helloworld.js

 Webブラウザーから http://[IPアドレス]:1337/ へアクセスして、「Hello World」と表示されたらOKです。

Slack連携編

 ボットを作ったら、Slackと連携させてみましょう。

  1. Slackにアクセスします。
  2. ボットユーザーを作成します。
  3. API Tokenをコピーしておきます。

 以下のコマンドを実行します。

$ cd slack_bot
$ export HUBOT_SLACK_TOKEN=[コピーしておいたAPI Token]
$ bin/hubot --adapter slack

 Slack上で、ボットユーザー名の左側が緑丸(●)=有効になったらOKです。

Heroku連携編

 その後、色々ありました。

  1. ソースコードをGitHubに載せる。
  2. 実行環境をCentOSからHerokuへ移す。
  3. 実行環境をHerokuからIBM Bluemixへ移す。

 IBM Bluemix上で動作しているSlackのボットを、IBM Bluemix DevOps Servicesからデプロイしようとした……ら失敗して、ボットのプロセスが起動しなくなってしまいました。色々な意味で「いい」タイミングなので「HerokuとCloud9を利用してiPad開発 - Qiita」のページを参考に、Heroku + Cloud9 + GitHubの環境で再構築しました。以下、それぞれのサービスのアカウントは、すでに持っている前提です。

 まずは、Cloud9で「Create a new Workspace」します。「Clone from Git or Mercurial URL」は、GitHubのURLを設定します。「Choose a template」は、GitHubからソースコードをCloneしてくるので「Blank」を選択します。そして、Herokuへログインします。

$ heroku login

 必要なかったみたいですが、Gitを作成します。

$ git init

 Herokuのアプリを作成します。

$ heroku create [アプリ名称]

 Gitでコミットしておいて、Herokuへデプロイします。

$ git add .
$ git commit -m 'Heroku Deploy'
$ git remote add heroku [HerokuのgitのURL]
$ git push heroku master

 Slack側で、ボットがアクティブになりません……Slackのボットなので、API Tokenを設定しないといけませんでした。HerokuにWebブラウザーからログインして、該当アプリの「Settings」から「Config Variales」→「Reveal Config Vars」と来て、KEYに「HUBOT_SLACK_TOKEN」を設定して、VALUEにはコピーしておいたAPI Tokenを設定します。右上の「Mores」から「Restart all dynos」を選択すると、Slack側でボットがアクティブになりました。

 Cloud9上でコードを追加/編集/削除した場合は、GitHubにも反映させておきます。

$ git remote add github [GitHubのgitのURL]
$ git push github master

 リンク先記事のように、GitHubにpushされたらHerokuにも自動的にpushしたいです。HerokuにWebブラウザーからログインして、該当アプリの「Deploy」から「Deployment method」→「Connect to GitHub」と来て、GitHubへログインして対象のリポジトリを選択します。自動でデプロイされるように、「Automatic deploys」の「Enable Automatic Deploys」ボタンをクリックして有効にします。

 今後は、以下だけでHerokuへアプリが自動的にデプロイされる……はず。

  1. Cloud9でコードを編集する。
  2. GitHubへpushする。

 最後に、Herokuのアプリが30分でスリープしないように「hubot-heroku-keepalive」を導入します……といっても、Cloud9のbashで以下のコマンドを実行するだけです。

$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web-url | cut -d= -f2)

 ところが、なぜかスリープしてしまいます。Webから設定画面で確認したら、VALUEが空でした。アプリのURLは「Open app」で、わかります。これを、KEY「HUBOT_HEROKU_KEEPALIVE_URL」のVALUEに設定します。

# 2017/02/28


Back to Top Page