SEEDS Creator's Blog

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

HubotでSlackのボットを作成する

IT js プログラミング

Hubotとは

Hubotは、Github社が開発したBot作成フレームワークです。 今回は、Hubotを使用してSlackボットを作成する方法をご紹介します。

Slack https://slack.com/ Hubot https://github.com/github/hubot

HubotはNode.jsのモジュールですので、Node.jsのインストールから始めます。

Node.jsのインストール

複数のNode.jsを管理するnvmコマンド経由で、Node.jsをインストールします。

nvmコマンドのインストール。

git clone git://github.com/creationix/nvm.git ~/.nvm

nvmのコマンドを使えるように、.bashrcにスクリプトを追記します。

if [[ -s ~/.nvm/nvm.sh ]]; then
    source ~/.nvm/nvm.sh
fi

以上で、nvmコマンドが使えるようになります。

次にNode.jsをインストールします。 今回の例では、バージョン0.11.13をインストールします。

npm install 0.11.13
npm use v0.11.13

以上で、Node.js関連のコマンドが使えるようになります。

nvmの他の機能が気になる方は、 nvm単体で実行するとヘルプが表示されるので、そちらをご参照ください。

Hubotのインストール

npmコマンドでHubotをインストールします。 また、必要なモジュールもインストールします。

npm install -g hubot hubot-slack yo generator-hubot coffee-script

上記のコマンドでインストールしたモジュールの情報は以下のとおりになっています。

モジュール名 説明
hubot Hubot本体。hubotコマンドが使用できるようになる。
hubot-slack HubotのSlack用アダプタ。HubotをSlackに対応させるために使用する。
yo ひな形生成ツール。
generator-hubot yoでHubotプロジェクトのひな形を生成するために使用する。
coffee-script CoffeeScript。HubotのスクリプトはCoffeeScriptで記述する。

HubotでHello World

「Hello」と呼びかけたら「World」と返すボットを作成します。

まずはHubotのひな形作成します。

$ mkdir hellobot
$ cd hellobot
$ yo hubot
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

? Owner: Uchiyama 
? Bot name: hellobot
? Description: (A simple helpful robot for your Company)
? Bot adapter: (campfire) slack
? Bot adapter: slack

ひな形ができたら、scriptsディレクトリ下にスクリプトを作成します。 今回はscripts/helloworld.coffeeとしました。

# scripts/helloworld.coffee
module.exports = (robot) ->
  robot.respond /HELLO$/i, (msg) ->
    msg.send "world"

ざっくり説明すると、 「robot.respond /HELLO$/i」で、正規表現で反応する文字列をマッチさせ、 「msg.send "world"」で、レスポンスを返しています。

チャットからのメッセージを受信したり返信したりする処理は、Hubot側で行ってくれています。

Hubotのコンソールを立ち上げて、このスクリプトの動作確認をしてみます。 以下のコマンドを実行します。

$ bin/hubot

Heroku関連の環境変数の設定に関するエラーが出てきますが、 現状は問題ないのでエンターを押して、コマンドプロンプトを復活させます。

以下のようにHubotにメッセージを送信すると、メッセージが返ってきます。

Hubot> Hubot hello
Hubot> world!
Hubot>

このように、実際にSlack上で実行する前に、コンソールで動作確認することができます。

Slackと連携するBotを作成

SlackのIntegrationページでHubotと連携するための設定を行います。

「Hubot URL」は、Hubot設置予定のURLを設定します。

あとで参照するので、「HUBOT_SLACK_TOKEN」などの環境変数は覚えておきます。

今回のSlackボットは、Slack上で挨拶された場合に挨拶を返す仕様にします。 コードは以下のようになります。

# scripts/slack-hello.coffee
module.exports = (robot) ->
  robot.hear /@hubot Hello/i, (msg) ->
    username = msg.message.user.name
    msg.send "Hello, " + username

robot.hear /@hubot Hello/i, (msg) ->」で、反応するメッセージを検出し、 「username = msg.message.user.name」で、ユーザー名を取得し、 「msg.send "Hello, " + username」で、レスポンスしています。

このスクリプトをコンソール上で動作確認してみます。

$ bin/hubot
Hubot> hubot @hubot hello
Hubot> Hello, Shell
Hubot>

ということで、挨拶を返してくれました。

Slackと連携するBotを実行

本番でSlackと連携する場合は、実行時のオプション指定などが必要になってきます。 結論から言いますと、コマンドは以下のようになります。

HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxx \
HUBOT_SLACK_TEAM=xxxx \
HUBOT_SLACK_BOTNAME=hubot \
bin/hubot --adapter slack

HUBOT_SLACK_TOKEN」「HUBOT_SLACK_TEAM」「HUBOT_SLACK_BOTNAME」といった環境変数を設定しています。 これらはSlackのIntegration画面にありましたね。

また、--adapterオプションでアダプタ(slack)を指定しています。

これで、Hubotが立ち上がったと思います。 この状態で、Slack上に「@hubot hello」と打ち込めば返信が返ってくるはずです。

まとめ

Hubotでボットを作成する方法をご紹介しました。 scriptsディレクトリ下にスクリプトを追加していけば、 ボットの機能を増やしていけます。 慣れてくると気軽に開発できるので、ボットづくりが捗ります。 色々連携させて効率化していきましょう。