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をいちいち手動で起こす必要があるのです。
もちろん、自動で起こすアドオンは存在するそうなのですが、ここで問題が発生しました。
その[アドオン] (https://devcenter.heroku.com/articles/scheduler#dyno-hour-costs)を追加するのに...
クレジットカードが必要なのです!
クレジットカード持ってないのです!!
知らなかった。
全然開発と関係ないところでつまづいてしまいました。
でももうクレジットカード持ってるみなさんならあとの残りのアドオン追加で完成版Botを作成できるかと。
僕はHerokuが嫌いになったのでクレジットカードを契約して、レンタルサーバーを借りますw
ひとまずここまで。