Node.js Tips

Hubotでツイート駆動のBotを作る

Node.jsで作られたフレームワーク——HubotでTwitterのBotがお手軽に〈Node.jsシリーズ vol.8〉

最近、Node.jsで書かれたアプリケーションやフレームワークを多く見かけるようになりました。 今回はそのひとつである「Hubot」を使って少し遊んでみたいと思います。

Hubotとは

Hubotとは、IRCやSlackなどのチャットツールやTwitterなどにおいて、特定の処理に反応して出力や返答などを行う「Bot(ボット)」の開発に特化したフレームワークです。

GitHubがもともと社内用のシステムとして使用していたものがオープンソース化されたもので、サーバーなどの監視にチャットツールを使用していたOpsエンジニアを中心に人気が広がっています。

このHubotはNode.jsで作られており、Botの挙動の定義に「CoffeeScript」を使用します。

CoffeeScriptとは

CoffeeScript」は、JavaScriptにコンパイルされて動作するRubyライクなスクリプト言語で、従来のJavaScriptよりも短い構文で処理を記述することができます。

JavaScriptユーザーの多くがまたこのCoffeeScriptを愛用し始めているため、今回は姉妹編ということで取り上げてみたいと思います。

Hubot環境のセットアップ

Hubotを動作させるためには、Node.jsに加えて以下の環境が必要となります。

  • Redis(NoSQLデータベース)
  • CoffeeScript
  • Yeoman(プロジェクトひな形作成ツール)
  • generator-hubot(Hubotのプロジェクト生成ツール)

それぞれあらかじめインストールしておきましょう。
先にRedisを入れておき、CoffeeScript以下はHubotとともにnpmでインストールします。

Redisのインストール

今回はredisをソースからインストールする方法をご案内します。 yumやapt-get、MacPortsなどさまざまなインストール方法がありますので、それぞれの環境に応じたものを試して下さい。

1
2
3
4
5
6
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar zxvf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ make test
$ sudo make install

インストール後、redis-serverコマンドでサーバーを起動しておきます。

Hubot、CoffeeScript、Yeoman、generator-hubotのインストール

Hubot、CoffeeScript、Yeoman、generator-hubotは、いずれもnpmからインストールできます。
$ sudo npm install -g hubot coffee-script yo generator-hubot-gをつけてグローバルインストールしましょう。

Botをつくる

インストールが終わったら、さっそくBotづくりに入りましょう。

Botの動作はCoffeeScriptでスクリプトを記述し、定義します。

ひな形を生成する

Botを記述するには、Yeomanのyoコマンドを使ってBotのひな形を生成し、そのなかで動作を定義するスクリプトを記述します。

今回は適当な名前でディレクトリを作り、そのなかでひな形を生成します。

1
2
3
4
5
6
7
8
$ mkdir testbot
$ cd testbot
$ yo hubot

? Owner: (User <user@example.com>) hoge@example.com
? Bot name: (testbot) (変更なければエンター)
? Description: (A simple helpful robot for your Company) (指定なければエンター)
? Bot adapter: twitter

「Bot adapter」というのは、Hubotのうえで動いたBotのメッセージの入出力先インターフェース(adapter)を決めるものです。

HubotはさまざまなチャットやSNSツールに対応していますが、今回は「twitter」と指定します。

adapterがインストールされていない場合は、自動的にインストールが始まります。

動作確認

諸々コマンドの動作が終わると、Botのひな形が出来た状態となります。
実際に動くかどうか、Botにテストコマンドを打って確かめてみましょう。

Botのディレクトリに入りhubotコマンドを打つと、コマンド待機状態となります。

このようになったら、以下のようにテストコマンド「ping」を打ってみます。

PONGと返してくれれば、正常に動いているということが確認できます。

Botスクリプトを記述する

それでは、Botの挙動を定義するスクリプトを書きましょう。

今回は、Twitterで「こんにちは」と発言すると、「こんにちはー。元気?」と返す、シンプルなBotを作りたいと思います。

スクリプトは、Botのディレクトリのscriptsディレクトリの中に置きます。

testbot.coffee

1
2
3
module.exports = (robot) ->
    robot.respond /こんにちは/i, (msg) ->
        msg.send "こんにちはー。元気?"

コード中の(robot) ->は、Node.jsのfunction(robot)に読み替えましょう。

robot.respondで、認識対象となるメッセージのパターンを正規表現で記述し、それに対するレスポンスとして、発言者の名前をmsg.sendで返します。

スクリプトを配置したら、hubotコマンド上で動作確認してみましょう。ちゃんと発言者の名前が返ってきましたか?

Twitter上で動作させる

このBotをTwitter上で動作させてみましょう。

動作させるには、環境変数Twitterのアクセストークンなどを定義し、hubotを起動させる必要があります。

以下の様な起動スクリプトを書き、立ち上げてみましょう。

testbot_run.sh

1
2
3
4
5
6
7
8
#!/bin/sh

export HUBOT_TWITTER_KEY="【Consumer Keyの内容】"
export HUBOT_TWITTER_SECRET="【Secret Keyの内容】"
export HUBOT_TWITTER_TOKEN="【Access Token Keyの内容】"
export HUBOT_TWITTER_TOKEN_SECRET="【Access Token Secret Keyの内容】"

bin/hubot -a twitter -n testbot

一番最後の行のhubotコマンド、-aでadapter(今回はtwitter)を指定、-nで、発言時の呼び出し先とするBot名を指定します。

スクリプトに実行権限を与えて、実行します。

1
2
$ chomod +x testbot_run.sh
$ ./testbot_run.sh

これで待機状態となります。

それではつぶやいてみましょう。

Hubotのコンソールには

1
2
3
4
received testbot こんにちは from ****
Sending strings to user: undefined
send twitt to **** with text こんにちはー。元気?
Status 200

とログが。 Twitterを見てみると……

Botからのレスポンスが表示されました!

お手軽なBotのできあがりです。

前回の記事でもご紹介したようにforeverでデーモン化すれば、継続的にBotサーバーとして機能させることも可能です。

Tech Blog

(編集部)

株式会社リクルートライフスタイルのTech Blog編集部です。いま流行りのTechネタやちょっと使えるTipsなどをお届けしていきます。

NEXT