読者です 読者をやめる 読者になる 読者になる

github社製ボットフレームワーク、hubotをIRCボットとして導入した話(修正あり

修正: 2/10

node-cronを使ったコードの例が間違っていたので修正。

github社製のボットフレームワークhubotIRCボットとして導入する話。

インストール

hubotはnode.jscoffescriptで書かれたgithub社製のボットフレームワークIRCに限らず、campfireやtwitterなどいくつかのアダプタに対応しているが、ここではIRCで利用するための導入手順を記す。

あらかじめnode.jsnpmをインストールしておいて、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時ですよー"

これで、ボットが定期的に挨拶してくれるようになった。

日本語環境でhubotをIRCボットとして利用する際の注意

node.js自体が、UTF-8以外の文字コードを扱うのがあまり得意じゃないせいか、ISO-2022-JPIRCチャンネルを利用しているところでhubotを動かすと文字列の扱いがおかしくなる。っていうか普通に文字化けする。これはhubot-ircUTF-8以外の文字列を全く考慮していないせいなので、とりあえずの解決策としてISO-2022-JPで喋らせたい場合はtiarraなどのIRCプロクシを立ててそれを経由させるのが賢明かもしれない。

終わり

この記事では、github社製のボットフレームワークであるhubotをIRCボットとして導入するための手順などを書いた。IRCは開発者間のコミュニケーションのインフラとして利用できる。そのIRCをより便利に扱うためにIRCボットやikachanIRCBot Consoleなどの周辺ツールを導入することは、開発者間のコミュニケーションをより促進してくれるものと思われる、まる。