hello people

Posted

HubotとHerokuを使ってSlackのbotをつくってみる

普段の業務ではチャットツールにSlackを使っているのですが、botで定期投稿できる仕組みを作っておくと色々と楽になるかも?という事で今回はHubotとHerokuを使用して、Slackに定期投稿してくれるbotを作ろうと思います。

Hubotとは

HubotはGithub社が開発したチャット用のbot開発向けフレームワークです。

HUBOT

公式HPでは以下のように書かれています。

Hubot is your company’s robot. Install him in your company to dramatically improve and reduce employee efficiency.

作業を効率化してくれるロボットらしいです。

Herokuとは

Herokuはアプリケーションを実行するためのプラットフォームです。

Heroku

アプリケーションを実行するための環境を提供します。アプリケーションを実行するためには以下のようなものが含まれます。

  • ハードウェア
  • ネットワーク
  • 仮想化環境
  • OS
  • データベース
  • アプリケーションフレームワーク

AWSと同じようにPaaS(Platform as a Service)といわれるクラウド型のサービスです。

環境構築から実行までの流れ

bot開発はおおまかに以下の流れで進めていきます。

  1. Slackのチームアカウントを作成する
  2. Herokuをデプロイする
  3. Hubotをインストールする
  4. HubotとSlackを連携する
  5. Hubotを使って投稿してみる
  6. Hubotから定期投稿できるように設定する

Slackのチームアカウントを作成する

Slackのサイト上の「Create a new team」からチームのアカウントを作成します。詳細は割愛しますが、そのまま進めていくとチャット画面が表示されるので、そこまで出来たらOKです。

Slackのチャット画面

Herokuをデプロイする

Herokuのサイトからアカウントを作成します。
アカウントを作成すると管理画面にアクセスできます。

Heroku

※アカウント作成後、管理画面上でクレジットカードの情報を登録する必要があります。無料で使う場合でもクレジットカードが登録されていないとGitやaddonが使用できません。

管理画面の右上の+ボタンから「Create new app」を選択し、アプリケーションを新規作成します。

Heroku - create new app

今回は”mo-hubot”という名前でアプリケーションを作成しました。
アプリケーション作成後は「Deploy」メニューを選択し、”Deploy using Heroku Git”の手順を参考にHeroku ToolbetのインストールからGitのCloneまでを行います。

Heroku Deploy

HubotはRedisを使用するので、Herokuの管理画面のaddonメニューを選択し、アプリケーションに”Redis To Go”をインストールしておきます。

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をインストールします。

Slack - 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を指定します。

Heroku - Scheduler

これで自動的にHubotを稼働させる事ができ、決まった時間にSlackに投稿してくれるようになります。
今回はHubotに対して簡単な命令しか行っていませんが、WebサービスのAPIと組み合わせる事によって色々な事ができるようになります。

物凄い駆け足で進めてしまったので、色々と不足しているかもしれませんが、以下の記事が参考になりますので、併せてご覧ください。