読者です 読者をやめる 読者になる 読者になる

blog.toxn

あしあと

hubotでslackに妖精さんを召喚した

Web API

最近といってもだいぶ前から、仲間内のコミュニケーションツールSkypeからslackへと移行してきた。 他サービスと連携ができてエンジニアが好みそうというか、エンジニアにしか流行らなそうな。。。

んで、hubot & heroku & slackの連携をさせてみた。 殺伐とした(してないけど)TLに妖精さんが!

f:id:toxn:20140911073410j:plain

結構簡単に出来たので、手順を残しておくー。

概要

hubotについて↓

GitHub社謹製! bot開発・実行フレームワーク「Hubot」:連載|gihyo.jp … 技術評論社

hubotはエンジンとしてNode.jsとRedisを使用しているので、 その両方をサポートしているPaaSとして、herokuを使う。 herokuについて↓

Heroku - Wikipedia

用意するもの

  • npm, Node.js
  • redis(データ永続化のために必要なDB。エラーは出るものの必須ではない)
  • herokuアカウント, heroku Toolbelt(Toolbeltも必須ではない)

heroku Toolbeltは、コマンドラインからherokuの操作を行うためのツールなんで、Vimでコード書いてcommit→デプロイが一気に出来て楽。 ブラウザからでも同じことができるけども。

Heroku Toolbelt

まずは、hubotとcoffee-scriptをインストールして、適当な名前でhubotをcreateすればその名前のフォルダができる。 今回は、yoseisanbotにします。 ↓で起動までできる。

$ sudo npm install -g hubot coffee-script
$ hubot --create yoseisanbot
$ cd yoseisanbot
$ ./bin/hubot

この時点でhubot PINGするとPONGされたり、デフォルトでも色々動くけど、 scriptsフォルダ下に、.coffeeファイルを置けば拡張ができる。

hubotを調教する(拡張コードを書く)

私ちゃんの如く「妖精さーん」と呼ぶと、妖精さんが現れて何か言うようにする。

#
# Description:
#   妖精さんbot
#  「妖精さーん」と呼びかけると答えてくれる。
#

random = (n) -> Math.floor(Math.random() * n)

module.exports = (robot) ->
  robot.hear /妖精さーん/, (msg) ->
    vocabulary = [
      'おめぇの席 ねえです',
      '僕ら無き後 怪我 病気事故 身投げ そういうことにご注意なさるです',
      '「重税」「圧政」「支配」「弾圧」',
      'しあわせの しろいこな!',
      'これたべても はっぴーにはなれぬです',
      'お菓子ないですかー',
      'ガムはおやつにはいりませんので',
      'コインいっこいっこいっこでおしあわせー',
      'ちくわ',
      'あじ、いります?'
    ]
    seed = vocabulary.length
    speech = vocabulary[random(seed)]
    msg.send "(・ワ・) < #{speech}"

書き方とかは省きます。

slack連携するためにhubot-slackをインストール。

slackhq/hubot-slack · GitHub

$ sudo npm install hubot-slack --save

次に、botフォルダの直下に置くProcfileを書く。

Procfileはherokuのプロセスタイプの設定ファイル。 bin/hubot--adapter slackオプションを付けて、slackアダプタ使うことを記述する。

web: bin/hubot --adapter slack

ファイルは揃ったので、git commitしておく。

デプロイ準備

herokuにAppを追加する。SSH-KEYの設定とか必要ですけど、省きます。 heroku Toolbeltを入れているなら、以下のコマンドでOK。ブラウザからでもよい。

$ heroku login
$ heroku create yoseisanbot

herokuにredisを追加するときは、heroku AddonのRedis To Goの無料版であるnanoサイズを使う。

$ heroku addons:add redistogo:nano

slack側で、hubotのIntegrationを追加すると、連携に必要な変数等が設定・取得できる。

Setup Instructions

heroku側に設定するので、コピーしておく。

HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxx
HUBOT_SLACK_TEAM=xxxxxxx
HUBOT_SLACK_BOTNAME=xxxxxxx

Service Configuration

herokuで作ったAppのURLを入力する。

http://yoseisanbot.herokuapp.com

Integration Settings

Botの画像を設定する。

デプロイ

herokuに戻って、slackのIntegrationsから指定されたToken等を変数設定する。

$ heroku config:add HEROKU_URL=http://yoseisanbot.herokuapp.com
$ heroku config:add HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxx
$ heroku config:add HUBOT_SLACK_TEAM=xxxxxxx
$ heroku config:add HUBOT_SLACK_BOTNAME=xxxxxxxxx

herokuでの受け入れ環境が整ったので、gitでherokuに対してpushして、1X Standard Dynosサイズのwebアプリを起動する。

$ git push heroku master
$ heroku ps:scale web=1

git pushすると、依存性のインストールとか起動とかしてくれる。

あとは、slackに行って、「妖精さーん」と発言するだけです!