Hubotとは
HubotとはGithub社が開発したNode.js上で動くBotアプリケーションを作成するためのフレームワークです。
Hubotは、Hubot本体
、アダプター
、拡張スクリプト
から構成されます。
Hubot本体とチャットアプリの間を仲介するアダプターが存在するため、slack、chatworkなどの様々なチャットツールとHubotを連携することが可能です。
Bot作成フレームワークはHubot以外にも存在しますが、Hubotは様々なチャットツールと連携できる点が他のものと比べて大きな特徴です。
GitHub社謹製! bot開発・実行フレームワーク「Hubot」より引用
Hubotを使うことにより、複雑な振る舞いをするBotを作成することが可能です。
slackの既存機能だけでもslack上で"hello"と発言すれば、Botが"hi"と返すような単純な振る舞いであれば可能ですが、それ以上複雑になると対応できません。
Hubotを使えば、
・決められた時刻に発言
・あるサイトから内容をスクレイピングで取得してチャットツール上に表示
・ある発言をするとapiを経由してGoogleカレンダーに予定を登録
が可能になります。
やること
- Hubotアプリケーションの作成
- Hubot Integrationの設定してHubotとslackを連携
- Heroku上でHubotアプリケーションを動かす
1.Hubotアプリケーションの作成
Hubotアプリケーションを新規作成
node.jsとnpmが入っている確認
node -v
npm -v
yoemanとhubotジェネレータをインストールします。yo
とはyoeman(ヨーマン)と呼ばれるクライアント側のwebアプリケーション作成ツールです。
yoemanを使ってhubotアプリケーションを作成します。
npm install -g yo generator-hubot
mkdir myhubot
cd myhubot
yo hubot
yo hubot
を実行すると以下のものがターミナル上に表示されます。
4つ質問がされるので以下の通り答えていきます。
Owner→Enter
Bot name→Enter
Description→Enter
Bot adapter→今回はslackと連携したbotを作るので「slack」と入力
これでHubotアプリケーションの雛形が作成できました。
注意
別の記事ではhubot --create myhubot
を使ったhubotアプリケーションの作成を紹介しているが、実際にコマンドを実行すると以下のエラーが発生する。'hubot --create'
は非推奨になったみたい。
指示通りにyoemanを使ってhubotを作成する。
'hubot --create' is deprecated. Use the yeoman generator instead:
npm install -g yo generator-hubot
mkdir -p myhubot
cd myhubot
yo hubot
See https://github.com/github/hubot/blob/master/docs/index.md for more details on getting started.
Hubotをローカルで起動
Hubotをローカルで起動して、動作確認をしていきます。
pwd #mybotディレクトリにいることを確認
bin/hubot
bin/hubot
はmyhubotディレクトリ内にあるシェルスクリプトhubot
を実行しています。bin/hubot
では、npm install
でpackage.json
に記述されたパッケージをインストールし、その後Hubot本体を起動しています。
hubot起動時に使用するアダプターを明示していないと、対話モードでHubotが起動します。
まだ独自のスクリプトを作成していませんが、Hubotではデフォルトでスクリプトが登録されています。mybubot echo "ping"
と打って、"ping"
と返ってくることを確認しましょう。
mybubot> mybubot echo "ping"
mybubot> "ping"
Hubotの独自スクリプト作成
hello
と打つとhi
を返してくる独自のBotスクリプトを作成してみましょう。
module.exports=(robot)->robot.hear(/hello/i,(res)->res.reply("hi"))
Robotクラスのhearメソッドは、hear(マッチさせたい正規表現, コールバック関数)
Responseクラスのreplyメソッドは、reply(発言内容)
robot.hear(/hello/i, (res)
で"hello"という文字列が渡ってくると、第2引数のコールバック関数を実行します。res.reply("hi")
で"hi"という文字列をチャットツール側で発言するようにしています。
2.Hubot Integrationの設定してHubotとslackを連携
次はローカルで動くHubotとslackを連携して、slack上にbotを導入してみましょう。
Hubot Integrationの設定
slackのアプリディレクトリからHubotを選択して、HubotのBotユーザを作成します。
ここで入力されたユーザ名が、slack上で発言するBotのユーザ名になります。
HubotアダプターのAPIトークンが表示されるので、メモしておきます。
アダプターを指定してHubotを起動
slackと連携したHubotをローカル上に起動するために、以下コマンドでHubotを起動します。
HUBOT_SLACK_TOKEN=上記でメモしたHubotアダプターのAPIトークン ./bin/hubot --adapter slack
slack上でhello
と発言するとBotがhi
と返してくれるようになりました。
ちなみに、slackチャンネル上でBotを動かすには、チャンネルにBotを/invite @ユーザ名
で招待しておく必要があります。
3.Heroku上でHubotアプリケーションを動かす
今まではローカル上でHubotを起動していました。
しかしこれだと、常にローカルPCを起動させておく必要がありますし、もしローカルのPCを閉じるとBotが動かなくなります。
そこでHeroku上でHubotを動かしておくことにします。
Herokuに登録
Herokuの登録自体は多くの記事がありますので、ここでは説明を省略します。
以下などの記事を参考に3まで完了させてください。
【Rails】Herokuの登録&初期設定からデプロイ方法までまとめ
1.Herokuのアカウント登録
2.Toolbeltインストール
3.heroku login
Herokuに環境変数設定&Push
Herokuに環境変数HUBOT_SLACK_TOKENを設定します。
heroku config:set HUBOT_SLACK_TOKEN=hoge
Hubotアプリケーションのcommit
git init
git add .
git commit -m "first commit"
git push heroku master #herokuにmasterブランチをpushする
するとBuild failed
エラーが発生。
% git push heroku master
Total 0 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Node.js app detected
remote:
remote: -----> Creating runtime environment
remote:
remote: NPM_CONFIG_LOGLEVEL=error
remote: NODE_ENV=production
remote: NODE_MODULES_CACHE=true
remote: NODE_VERBOSE=false
remote:
remote: -----> Installing binaries
remote: engines.node (package.json): 0.10.x
remote: engines.npm (package.json): unspecified (use default)
remote:
remote: Resolving node version 0.10.x...
remote: Downloading and installing node 0.10.48...
remote: Detected package-lock.json: defaulting npm to version 5.x.x
remote: Bootstrapping npm 5.x.x (replacing 2.15.1)...
remote: npm 5.x.x installed
remote:
remote: /tmp/build_9e550049100749e72c047c136d3131ae/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote: var notifier = require('update-notifier')({pkg})
remote: ^
remote: SyntaxError: Unexpected token }
remote: at Module._compile (module.js:439:25)
remote: at Object.Module._extensions..js (module.js:474:10)
remote: at Module.load (module.js:356:32)
remote: at Function.Module._load (module.js:312:12)
remote: at Function.Module.runMain (module.js:497:10)
remote: at startup (node.js:119:16)
remote: at node.js:945:3
remote:
remote: /tmp/build_9e550049100749e72c047c136d3131ae/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote: var notifier = require('update-notifier')({pkg})
remote: ^
remote: SyntaxError: Unexpected token }
remote: at Module._compile (module.js:439:25)
remote: at Object.Module._extensions..js (module.js:474:10)
remote: at Module.load (module.js:356:32)
remote: at Function.Module._load (module.js:312:12)
remote: at Function.Module.runMain (module.js:497:10)
remote: at startup (node.js:119:16)
remote: at node.js:945:3
remote:
remote: /tmp/build_9e550049100749e72c047c136d3131ae/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote: var notifier = require('update-notifier')({pkg})
remote: ^
remote: SyntaxError: Unexpected token }
remote: at Module._compile (module.js:439:25)
remote: at Object.Module._extensions..js (module.js:474:10)
remote: at Module.load (module.js:356:32)
remote: at Function.Module._load (module.js:312:12)
remote: at Function.Module.runMain (module.js:497:10)
remote: at startup (node.js:119:16)
remote: at node.js:945:3
remote:
remote: -----> Build failed
remote:
remote: We're sorry this build is failing! You can troubleshoot common issues here:
remote: https://devcenter.heroku.com/articles/troubleshooting-node-deploys
remote:
remote: If you're stuck, please submit a ticket so we can help:
remote: https://help.heroku.com/
remote:
remote: Love,
remote: Heroku
remote:
remote: ! Push rejected, failed to compile Node.js app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to rocky-gorge-05187.
remote:
To https://git.heroku.com/rocky-gorge-05187.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/rocky-gorge-05187.git'
You can troubleshoot common issues here: https://devcenter.heroku.com/articles/troubleshooting-node-deploys
このURL見れば同じ問題を解決できるよーと言われているので、見てみる。
まずはbuildpackを設定して再実行。build failedは解消できず。
heroku buildpacks:set heroku/nodejs
次に章のCompare Node and npm Versions
では開発環境と本番環境でNodeとnpmのversionを揃えなさいと言われているので、まずはローカルでnodeとnpmのバージョンを見る。
node --version
npm --version
表示されたバージョンをpackage.jsonに設定。
nodeとnpmのバージョンを指定。
"engines":{"node":"10.16.0","npm":"6.9.0"}
再度、git push heroku master
でbuild成功。
参考文献
GitHub社謹製! bot開発・実行フレームワーク「Hubot」
https://gihyo.jp/dev/serial/01/hubot/0001
Hubotを使ってSlackへBotを投げる
https://qiita.com/shosho/items/057d7b67d1dd3a700554