Posted
HubotとHerokuを使ってSlackのbotをつくってみる
普段の業務ではチャットツールにSlackを使っているのですが、botで定期投稿できる仕組みを作っておくと色々と楽になるかも?という事で今回はHubotとHerokuを使用して、Slackに定期投稿してくれるbotを作ろうと思います。
Hubotとは
HubotはGithub社が開発したチャット用のbot開発向けフレームワークです。
公式HPでは以下のように書かれています。
Hubot is your company’s robot. Install him in your company to dramatically improve and reduce employee efficiency.
作業を効率化してくれるロボットらしいです。
Herokuとは
Herokuはアプリケーションを実行するためのプラットフォームです。
アプリケーションを実行するための環境を提供します。アプリケーションを実行するためには以下のようなものが含まれます。
- ハードウェア
- ネットワーク
- 仮想化環境
- OS
- データベース
- アプリケーションフレームワーク
AWSと同じようにPaaS(Platform as a Service)といわれるクラウド型のサービスです。
環境構築から実行までの流れ
bot開発はおおまかに以下の流れで進めていきます。
- Slackのチームアカウントを作成する
- Herokuをデプロイする
- Hubotをインストールする
- HubotとSlackを連携する
- Hubotを使って投稿してみる
- Hubotから定期投稿できるように設定する
Slackのチームアカウントを作成する
Slackのサイト上の「Create a new team」からチームのアカウントを作成します。詳細は割愛しますが、そのまま進めていくとチャット画面が表示されるので、そこまで出来たらOKです。
Herokuをデプロイする
Herokuのサイトからアカウントを作成します。
アカウントを作成すると管理画面にアクセスできます。
※アカウント作成後、管理画面上でクレジットカードの情報を登録する必要があります。無料で使う場合でもクレジットカードが登録されていないとGitやaddonが使用できません。
管理画面の右上の+ボタンから「Create new app」を選択し、アプリケーションを新規作成します。
今回は”mo-hubot”という名前でアプリケーションを作成しました。
アプリケーション作成後は「Deploy」メニューを選択し、”Deploy using Heroku Git”の手順を参考にHeroku ToolbetのインストールからGitのCloneまでを行います。
HubotはRedisを使用するので、Herokuの管理画面のaddonメニューを選択し、アプリケーションに”Redis To Go”をインストールしておきます。
また、無料で使用する場合は先人に倣ってコマンドライン上で以下のコマンドを実行しておきましょう。
heroku ps:scale web=1
Hubotをインストールする
コマンドラインから以下のコマンドを実行し、Hubotの動作に必要なモジュールをインストールしておきます。
- npm install -g hubot
- npm install -g yo generator-hubot
- npm install -g coffee-script
- brew install redis
以下のコマンドでRedisを起動します。
redis-server
Gitをクローンしたアプリケーションのディレクトリまで移動し、以下のコマンドを実行すると必要なパッケージ類がインストールされます。
yo hubot
インストールしたら、以下のコマンドを実行してローカル環境上でHubotを起動してみましょう。
bin/hubot
Hubotに対して送信テストを行います。pingと送って、PONGと返答があればOKです。
hubot > hubot ping hubot > PONG
HubotとSlackの連携を行う
Hubotをインストールしたディレクトリに存在する”Procfile”に以下を追記します。
web: bin/hubot --adapter slack
HubotとSlackを連携するためのパッケージをインストールします。
npm install hubot-slack --save
Slackの”Apps & Custom Integrations”からHubotをインストールします。
HubotをインストールしたらTOKENが取得できるので、コマンドラインで以下のコマンドを実行し、Herokuのconfigに追加します。
heroku config:add HUBOT_SLACK_TOKEN=[取得したTOKENを貼り付け]
Hubotを使ってSlackに投稿してみる
アプリケーションのディレクトリ内にあるscriptsフォルダの中に任意のcoffeeファイル(もしくはjsファイル)を作成します。Hubot起動時にscriptsフォルダ内のcoffee/jsファイルを読み込んでくれます。
module.exports = (robot) -> robot.hear /test/i, (msg) -> msg.send 'Hello!'
ファイルを作成したら、Gitリポジトリにプッシュします。
git add . git commit -m "initial commit" git push origin master
リポジトリにプッシュするとHeroku上でアプリケーションが自動的にデプロイされるので、Slack上でチャンネル内にHubotをメンバーに追加し、メンションを送ってみます。Hubotから”Hello!”と返事がきたらOKです。
Hubotから定期投稿できるように設定する
定期投稿するためには以下の設定が必要になります。
- Hubotに対して、Slackに定期投稿するためのプログラムを記述する
- HubotがIdling状態に入らないようにHerokuの設定を行う
まずはHubotに対して、Slackに定期投稿するためのプログラムを記述します。
定期投稿するためには、node-cronモジュールを使用します。
npm install cron --save
前述で作成したcoffeeファイルにcron用のプログラムを追加します。
cronJob = require('cron').CronJob module.exports = (robot) -> robot.hear /test/i, (msg) -> msg.send 'Hello!' cronJob = new cronJob('0 0 10 * * *', () => envelope = room: "#general" #Slackのチャンネル名 robot.send envelope, "test" ) cronJob.start()
また、Herokuで無料のプランを選択している場合、30分以上のアクセスが無ければ自動的にアプリケーションがIdling(Sleep)状態となってしまいます。
そのため、hubot-heroku-keepaliveを使用して定期的にアクセスさせる事により、Hubotを定期稼働させる事ができます。
まずはhubot-heroku-keepaliveをインストールします。
npm install hubot-heroku-keepalive --save
以下のコマンドで表示される”Git URL”をコピーします。
heroku apps:info
以下のコマンドを実行します。
heroku config:set HUBOT_SLACK_KEEPALIVE_URL=[Git URLを貼り付け]
ただし、2015年6月にHerokuの料金体系が変更され、24時間のうち6時間は必ずSleep状態にしなければいけないという制限ができました。そのため、hubot-heroku-keepaliveに対して以下のパラメータを指定する事で24時間はいかないまでも16~18時間は稼働させる事が可能です。
heroku config:add HUBOT_HEROKU_WAKEUP_TIME=8:00(開始時間) heroku config:add HUBOT_HEROKU_SLEEP_TIME=24:00(終了時間)
さらに以下のコマンドでaddonを追加します。
heroku addons:create scheduler:standard heroku addons:open scheduler
Schedulerの設定画面が表示されたら、”curl ${HUBOT_HEROKU_KEEPALIVE_URL}heroku/keepalive”と入力します。
また、起動時間の指定はUTC時間なので、日本時間の場合は9時間引いた時間を指定します。WAKEUP_TIMEに8:00を指定した場合は23:00を指定します。
これで自動的にHubotを稼働させる事ができ、決まった時間にSlackに投稿してくれるようになります。
今回はHubotに対して簡単な命令しか行っていませんが、WebサービスのAPIと組み合わせる事によって色々な事ができるようになります。
物凄い駆け足で進めてしまったので、色々と不足しているかもしれませんが、以下の記事が参考になりますので、併せてご覧ください。