イモケンピウスの辞書

脳の記憶容量がフロッピーディスク2枚分しかないのでここに残しておくことにしました。Android、Unityについての記事が多いです

Typetalk用Botを作成する ~hubot入門その2~

前回の続きです。

今回で一応実装完了となります。衝撃のラストを見逃すな!

定期実行できるようにする

定期実行するにはcronライブラリと実行時間を日本時間に合わせるためのtimeライブラリをインストールします。

$ npm install cron --save
$ npm install time --save

これで定期実行の準備はできましたので、実際に

  • 9時に「おはよう」
  • 5時半に「お疲れさまでした」
  • 毎週月・木に「今日は燃えるゴミの日です」

この発言を行うようにソースを作成します。

まずディレクトリの scripts の中に".coffee"拡張子のファイルを一つ作成します

僕は"cron_task.coffee"というファイル名にしましたが、適当です。

ちなみにこのscriptsファイルの中にはもともと example.coffee というソースファイルが一つだけ入っています。

このソースは読んで字のごとくhubotの発言を実装するためのサンプルソースです。一見しておくと理解が深まるかと。

では scripts/cron_task.coffee を編集します。

下のソースをまるっとコピペしちゃってください。

# Description:
#   Utility commands surrounding Hubot uptime.
cronJob = require('cron').CronJob

module.exports = (robot) ->
  # 朝のおはよう
  morning = new cronJob(
    cronTime: "0 0 9 * * 1-5"   # 実行時間
    start:    true              # すぐにcronのjobを実行するか
    timeZone: "Asia/Tokyo"      # タイムゾーン指定
    onTick: ->                  # 時間が来た時に実行する処理
      robot.send {room: "トピックのID"}, "おはようございます!9時です。"
    )

  # 夜のおつかれさま
  evening = new cronJob(
    cronTime: "0 30 17 * * 1-5"
    start:    true
    timeZone: "Asia/Tokyo"
    onTick: ->
      robot.send {room: "トピックのID"}, "お疲れさまでした!"
    )

  # ゴミの日
  gominohi = new cronJob(
    cronTime: "0 0 17 * * 1,4"
    start:    true
    timeZone: "Asia/Tokyo"
    onTick: ->
      robot.send {room: "トピックのID"}, "今日は燃えるゴミの日ですよ"
    )

これでおはよう、お疲れ様、ゴミの日ですよの発言をbotが行ってくれます。

トピックのIDは忘れずに変えてくださいね。

試しにローカルで実行してみましょう。

実行されたらあとはHerokuにアップロードするだけですね。

Herokuで実行する

では次にHerokuにソースをアップします。

アップ方法はHerokuのツールであるHeroku Toolbeltを利用します。

Gitで管理しているソースを管理しているみたいで、プッシュしたら自動的に変更が反映されるようです。

ちなみにですがHerokuの無料プランだと利用制限があります。

この利用制限のおかげで、なんと僕はHerokuの利用を諦めました。

この記事の趣旨は Typetalk連携したhubot製のBotをHeroku上で実行することですので

Heroku上で実行できるようになるまでは続けます。

下記手順でソースをアップしましょう

  • HerokuサイトからHerokuアカウントを作成する
  • Heroku Toolbeltをインストールする
  • hubotのディレクトリで下のコマンドを上から順番に実行する
$ git init

$ git add .

$ git commit -m "Initial commit"

$ heroku login

$ heroku create

$ heroku config:set HUBOT_TYPETALK_CLIENT_ID='ここにID'
$ heroku config:set HUBOT_TYPETALK_CLIENT_SECRET='ここにシークレットキー'
$ heroku config:set HUBOT_TYPETALK_ROOMS='ここにトピックID'

$ git push heroku master

すべて実行すると、heroku上ですでにhubotが起動しています。

Typetalkでhubotからレスポンスがあるか試してみてください。

レスポンスが返ってきたら一応実装は完了ということで。

アイドリング状態にさせない

Heroku上のhubotは30分以上なにも活動しないと勝手にスリープします。それは困る。

それを防ぎましょう。

hubot-heroku-keepaliveというスクリプトをインストールしてでスリープを防ぎます。

$ npm install hubot-heroku-keepalive --save

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

$ heroku config:add TZ="Asia/Tokyo"

おや、僕の場合はすでにインストールされてました。

hubot-heroku-keepaliveを使用して1日最大18時間までスリープせずに稼働できるとのこと。

デフォルトでは朝の6時から夜の22時までが稼働時間です。

変更したい場合はそれぞれ

  • HUBOT_HEROKU_WAKEUP_TIME
  • HUBOT_HEROKU_SLEEP_TIME

に HH:MM (例 6:00)のフォーマットで指定をすれば良いそうです。

ここで問題発生!

さきほど「hubot-heroku-keepaliveを使用して1日最大18時間までスリープせずに稼働できる」と言いました。

もう少し詳しく説明するとHerokuの無料プランでは2つの制限があります

  • 30分間なにも活動しないとスリープする
  • 1日6時間スリープしなくてはならない

hubot-heroku-keepalive ライブラリは1つ目の「30分間なにも活動しないとスリープする」の対策です。

一定間隔ごと(デフォルトは5分)に「寝るなよー」と命令して、あたかも活動してるように装いスリープを防ぐ仕組みです。

問題は2つ目です。

6時間という社会人みたいな睡眠時間を必要とするHeroku。

一度寝てしまうと自動で起こすことは初期設定ではできません。

つまりこのままでは朝の9時のおはよう発言の前にHerokuをいちいち手動で起こす必要があるのです。

そんなのBotじゃない。僕の知ってるBotじゃない。

もちろん、自動で起こすアドオンは存在するそうなのですが、ここで問題が発生しました。

その[アドオン] (https://devcenter.heroku.com/articles/scheduler#dyno-hour-costs)を追加するのに...

クレジットカードが必要なのです!

クレジットカード持ってないのです!!

知らなかった。

全然開発と関係ないところでつまづいてしまいました。

でももうクレジットカード持ってるみなさんならあとの残りのアドオン追加で完成版Botを作成できるかと。

僕はHerokuが嫌いになったのでクレジットカードを契約して、レンタルサーバーを借りますw

ひとまずここまで。