Slack用botをbotkit+Heroku+RedisCloudで動かす

f:id:horimislime:20160111232309p:plain

年末にSlackのプラットフォーム化とともに発表されたbotkitを使ってChatBotを作ってみました。

内容はチャット上でタスクの開始と終了時刻を記録してどれくらい時間を使ったか振り返れるというもの。前から時間管理のためにいくつかアプリを試したり、ポモドーロもやってみたものの手になじまず、また最近はSlack上で分報チャンネルを作りそこにタスク一覧をまとめたりメモを書いていたので、時間管理もSlack上でやれたらと思ったのがbotを作ったきっかけです。今のところ便利に使えています。

botは現在Herokuで動かしており、チャットに書き込んだタスクはRedisCloudで永続化するという形をとっています。せっかくなので似たようなデータの永続化を伴うBotを簡単に試せるようにサンプルを作って公開しました。Deploy to Herokuボタンですぐに試せます。

horimislime/botkit-heroku-redis-example

free dynoで動かし続けるために

無料プランで30分以上Webのトラフィックがないとdynoがスリープしてしまいます。Botはそもそも外部からのトラフィックが無いのですぐに寝てしまう事になります。なのでわざとHTTPサーバを立ち上げ、Heroku Schedulerから定期的にアプリへcurlしてdynoを起こしておくようにしています。

http.createServer(function(request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Ok, dyno is awake.');
}).listen(process.env.PORT || 5000);

Schedulerは以下のように。[Heroku] 特定の時間帯にDynoを起動させておくためのワンライナー (Heroku Scheduler用) - Qiitaを参考にさせてもらいました。

# botを使いそうな時間帯、10:00 - 22:00 JST (1:00 - 13:00 UTC)にcurlする
seq 1 13 | grep -qw $((10#`date -u "+%H"`)) && curl http://your-app-name.herokuapp.com > /dev/null 2>&1

これを10分おきに実行しておけばOK。

botkit雑感

SlackのChatbotを作るのに特化しているだけあり、emojiリアクションを付けたりSlackappを作ったりするのがとても簡単です。Slack上で使う前提ならHubotをあえて選ぶ理由はあまり無いかも。

また会話の実装がとても簡単にできるのも気に入っています。

controller.hears('^デプロイして$', 'direct_mention,mention', function(bot, message) {
    bot.startConversation(message, function(response, convo) {
        convo.ask("デプロイ開始します。OK?", [
            {
                pattern: 'ok',
                callback: function(response,convo) {
                    convo.say('開始します');
                    // デプロイ処理
                    convo.next();
                }
            },
            {
                pattern: 'キャンセル',
                callback: function(response,convo) {
                    convo.say('やめときます');
                    convo.next();
                }
            }
        ]);
    });
});

特定のmentionで会話を開始し、続くメッセージ(okか、キャンセルか)に応じてBotがリアクションを取るというもの。自力でこれを実装すると考えるとしんどいですが、botkit だと簡単。こうした対話形式はchatopsで活用できそうですね。

今のところタスクの管理だけで満足してますが、少しずつ便利な機能を追加していこうと思います。