2015年末のSlack App Directoryの発表と同時に公開された、SlackのBotを作るためのフレームワーク Botkit の使い方を解説する。
Slackとプログラムの送受信部分はBotkitがやってくれるため、Botの本質的な部分に集中できるからオススメだ。
Contents
SlackでBot作成
まずはSlackにアクセスしてBotを作る。
Botの名前を聞かれるから、好みの名前を入れる。
Add Integrationを押してBotを作り終えると、Botの設定ページへ移る。
このページは、API TokenやBotの名前の変更など、Botにまつわる設定ができる。
Botを開発するため、ページ中ほどのAPI Tokenをコピーしよう。
Botkitのインストール
Botプロジェクトを作りたいフォルダーへ移り、Botkitを入れる。
1 |
git clone https://github.com/howdyai/botkit.git |
botkitフォルダーへ移り、依存パッケージをインストールする。
1 2 |
cd botkit sudo npm install |
サンプルBotを動かす
先ほどのAPI Tokenを使ってサンプルBotを動かしてみる。
※YOUR_API_TOKENを各自のトークンで差し替える。
1 |
token=YOUR_API_TOKEN node bot.js |
Botを作成したチームの好きなチャンネルに入り、Botを招待する。
※marvinは自分が設定したBot名で差し替える。
1 |
/invite @marvin |
首尾よく招待できたら、helloと言わせてみよう。
サンプルBotにはいくつかのコマンドがプリセットされている。遊んでみよう。
- @marvin hello
- @marvin call me <Other Name> ※<Other Name>には好きなワードを入れる
- @marvin who am I
- @marvin shutdown
- @marvin uptime
Botを実装する
いよいよBotを実装していこう。何を呼びかけても「hahaha」と返す、イカれたBotを作ってみる。
Slack Bot API [hears]
Botkitを落としてきたフォルダーにある、bot.jsを開くと、Botkitモジュールの宣言に初期化処理が続き、controller.hears()を呼んでいるのが見て取れると思う。ここに、コマンドと、それに対応した処理を書く。コマンドは正規表現でも設定できるから、かなり高機能なこともできるようになっている。
大まかにはこのような構造となっている。
hears(コマンド名, メッセージの種類, コマンドの処理)
hears 第一引数 コマンド名
hears()の第一引数は、どのようなコマンドの処理かを記述する。文字列か、あるいは文字列配列で複数のコマンド名を指定しよう。
例 : hears(‘Hello’~ or hears([‘Hello’, ‘Hey’ ~
このコマンド名には正規表現を使うこともできる。例えば、サンプルBotの call me <Other Name> というコマンドは、このようにコマンド名を設定している。
1 |
controller.hears(['call me (.*)'],'direct_message,direct_mention,mention',function(bot, message) { ~ } |
どのようなコマンドで呼ばれたかは、message.textに入っている。同じくcall me <Other Name>の処理では、メッセージを分解して、<Other Name>の部分を取り出している。
1 2 |
var matches = message.text.match(/call me (.*)/i); var name = matches[1]; |
hears 第二引数 メッセージの種類
どのような種類のメッセージでコマンドを実行するかをカンマ区切りの文字列で設定する。
メッセージの種類はこのとおり。
※カンマ区切りではなく、文字列配列でも良い。
- message_received : すべてのメッセージでコマンドを実行する。
- ambient : メンション以外のメッセージ
- direct_mention : “@marvin hello”のように、直接メンションされた場合
- mention : “hello @marvin”のように、メッセージ中でメンションされた場合
- direct_message : 1対1でメッセージされた場合
hears 第三引数 コマンドの処理
botとmessageを引数に取るコマンドの処理を記述する。
botを使ってSlackのAPIにアクセスしたり(bot.api.~)、botから返事させたりする。
例えば、サンプルBotの hello コマンドではこのように使っている。
1 2 3 4 5 6 7 |
controller.hears(['hello', 'hey'],'direct_message,direct_mention,mention',function(bot, message) { ~ 省略 ~ bot.reply(message,'Hello.'); ~省略~ } |
My Botの実装
bot.jsを開き、controller.hears()を全て消し、新たな処理を記述する。
1 2 3 |
controller.hears('', ['direct_mention'], function(bot, message) { bot.reply(message, 'hahaha'); }) |
hears()の第一引数を空文字にすれば、すべてのメッセージにマッチするようになる。
全体としてはこのようなコードとなった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
if (!process.env.token) { console.log('Error: Specify token in environment'); process.exit(1); } var Botkit = require('./lib/Botkit.js'); var os = require('os'); var controller = Botkit.slackbot({ debug: true, }); var bot = controller.spawn({ token: process.env.token }).startRTM(); controller.hears('', ['direct_mention'], function(bot, message) { bot.reply(message, 'hahaha'); }); |
実行するとこう。毒にも薬にもならないけれど、絶妙にイライラさせてくれるBotが出来上がった。
Webクローラーを作ることを通して、JavaScriptとNode.jsの様々な技術に触れることができる、入門〜中級レベルの本。
ECMAScript6 (ES6) のキャッチアップにはこちらがおすすめ。
One Response
DC
触ってみていただいて、ありがとうごございます!botkitの開発チームSlackチャットルームの中で、「日本でもBotktiが使われてます!」と、ビックリしながら、嬉しい話がありました。何かの使い方の質問ありましたら是非 http://dev4slack.xoxco.com/ の中気軽に聞いてくださいませ! よろしくお願いします!