github社製ボットフレームワーク、hubotをIRCボットとして導入した話(修正あり
インストール
hubotはnode.jsとcoffescriptで書かれたgithub社製のボットフレームワーク。IRCに限らず、campfireやtwitterなどいくつかのアダプタに対応しているが、ここではIRCで利用するための導入手順を記す。
あらかじめnode.jsとnpmをインストールしておいて、hubotをインストールする。
$ git clone git://github.com/github/hubot.git $ cd hubot $ npm install
hubotは、ボットが扱うデータを永続化するためにredisというKVSを利用する。redisが入っていない時はエラーになるので動かす前にインストールする。
ちょっと試してみたいけどredisまで入れるのは面倒という時は、hubot/hubot-scripts.jsonから "redis-brain.coffee" を取り除く。
$ cat hubot-script.json ["redis-brain.coffee", "tweet.coffee", "shipit.coffee"] $ vim hubot-script.json $ cat hubot-script.json ["tweet.coffee", "shipit.coffee"]
ここできちんとインストールできたかどうか試すために以下みたいにhubotを起動してみる。
$ cd hubot $ ./bin/hubot Hubot>
このコマンドラインインターフェイスは、主にデバッグ用や動作確認用に利用する。特にエラーが出なければ成功。最初から利用できるコマンドの一覧はhubot helpで見る。
Hubot> hubot help Hubot> <keyword> tweet - Returns a link to a tweet about <keyword> <user> is a badass guitarist - assign a role to a user <user> is not a badass guitarist - remove a role from a user (中略) who is <user> - see what roles a user has youtube me <query> - Searches YouTube for the query and returns the video
試しにhubot img hogeとかやってみると、hogeで検索して出てくる画像のurlが帰ってくる。
Hubot> hubot img hoge http://www.wrapupp.com/wp-content/uploads/2011/08/DM_090513_NFL_HOGEonTAYLOR.jpg#.png
hubot用のスクリプトはhubot-scriptsという別のリポジトリにたくさん収められているので適当に物色する。
IRCアダプタの導入
次はhubotをIRCチャンネル上で動かすためのアダプタを導入する。
IRC用のアダプタはgithubの別のリポジトリに公開されているので、それのインストール手順に従って、hubot/package.jsonの依存関係にhubot-ircを追加してnpm installすると導入できる。
$ cd hubot $ cat package.json | tail -n 8 "dependencies": { "hubot": "2.1.0", "hubot-scripts": "2.0.2", "optparse": "1.0.3", "hubot-irc": "0.0.6" // 追加 } } $ npm install
どのIRCサーバとチャンネルで利用するかなどの設定を含んだ以下のような起動スクリプトを書く。
#!/bin/bash # runhubot export HUBOT_IRC_NICK="hubot" export HUBOT_IRC_ROOMS="#all,#hoge,#fuga" export HUBOT_IRC_SERVER="irc.example.com" export HUBOT_IRC_PASSWORD="hoge" /path/to/hubot/bin/hubot -a irc
起動。
$ ./runhubot &
IRCチャンネルを確認してhubotがいれば成功。
hubotを使ってコマンドを書く
hubotはボットフレームワークであるので、適当に自分でなんかコマンドを作ることが出来る。手っ取り早く何かコマンドを作る場合は、hubot/scirptsディレクトリ以下に.coffeeファイルか.jsファイルを置くと起動時に読み込んでくれる。
以下は、hello worldとチャットに書くと「こんにちは世界!」と返してくれるコマンドの例。インストールした先のhubot/scripts以下にはすでにデフォルトで利用できるコマンドがたくさんあるのでそれらを見つつコマンドを作っていくと良い。
# helloworld.coffee module.exports = (robot) -> robot.hear /hello world/, (msg) -> msg.send "こんにちは世界!"
hubotを再起動して試してみる。
$ ./bin/hubot Hubot> hello world Hubot> こんにちは世界!
coffeescript使いたくないおとかいう人は普通にJavaScriptでも書ける。
// hoge.js module.exports = function(robot) { robot.hear(/hoge/, function(msg) { msg.send('hogehoge-'); }); };
ボットのデータを永続化する
hubotを起動しなおしても、以前のデータを保持し続けたい場合は、以下みたいにrobot.brain.data以下にデータを登録して、robot.brain.save()するとデータが永続化される。
module.exports = (robot) -> robot.hear /hoge/, (msg) -> unless robot.brain.data.hoge robot.brain.data.hoge = '' robot.brain.data.hoge += "hogehoge" robot.brain.save msg.send robot.brain.data.hoge
試してみたのが以下。
$ ./bin/hubot Hubot> hoge hogehoge Hubot> hoge hogehogehogehoge Hubot> exit $ ./bin/hubot Hubot> hoge hogehogehogehogehogehoge
再起動してもデータが消えていないことがわかる。
定期的になにか喋ってもらうためにnode-cronを導入する
hubotだと、今のところ何らかのユーザ側の発言が無ければ何もアクションを起こしてくれない。ボットに朝の挨拶をしたり定期的に何かのURLを流したりして欲しかったのでnode-cronを導入した。
$ cd hubot $ npm install cron
んで、定期的に何かを喋らせる例が以下。これもまたhubot/scripts以下に置く。
cron = require('cron').CronJob module.exports = (robot) -> # utility function send = (room, msg) -> (new robot.Response(robot, {user : {id : -1, name : room}, text : "none", done : false}, [])).send msg cron '0 0 11 * * *', () -> send "#all", "11時ですよー"
これで、ボットが定期的に挨拶してくれるようになった。