まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:botkit

BotKit を使って導入した Slack のボットの挙動を自分なりにカスタマイズしてみましょう。まずは以下のエントリを参考にして、BotKit を導入し、ボットがデフォルトの挙動で動くような状態を作っておいてください:
Slack の BotKit を使う


さて、ボットの実体は bot.js ファイルです。このファイルをテキストエディタで開くと、初期化処理などの後にこのような contoller.hears() の処理がいくつか定義されていることに気付きます:
controller.hears( コマンド, 種類, 処理 );

例えばコマンドとして ['hello','hi'] が定義されているものとして、このような記載を見つけることができます:
controller.hears( ['hello','hi'], 'direct_message,direct_mention,mention', function(bot, message){
       :
  (処理の中身)
       :
} );

これは次のような意味になります:
(1) 'hello' または 'hi' というコマンドを、
(2) 'direct_message'(1対1でのメッセージ)か、'direct_mention'(@XXX hello のように直接メンションされた場合)か、'mention'(hello @XXX のようにメッセージ中でメンションされた場合)に、
(3) function(bot,message){ ... } の内容を実行する

つまり前回のエントリでボットに対して @XXX hello というメッセージをダイレクトメンションで送った時に実行される処理がこれ、ということになります。


では簡単な処理でカスタマイズしてみましょう。bot.js 内に以下のようなコードを追加します:
controller.hears(['double (.*)'],'direct_mention',function(bot, message) {
    var matches = message.text.match(/double (.*)/i);
    var msg = matches[1];
    bot.reply(message,msg+' '+msg);
});

これはボットに対してダイレクトメンションで "@XXX double ABCDE" のようなメッセージが送られた時にハンドルし、"ABCDE ABCDE" のように double に続く部分を2度喋る、という処理をするようなコードです。

この bot.js を保存して実行(実行方法は前回のエントリ参照)し、"@XXX double Happy" のようにダイレクトメンションでメッセージを送ると、"Happy Happy" のような反応をしてくれるはずです:
2016031802


この例では処理内容がかなりシンプルな例でしたが、5行程度の追加でここまでは出来てしまいました。実際には受け取ったパラメータを元にデータベースや外部などから情報を作り出して返す、といったより本格的な Slack ボットを作ることもできると思っています。

応用編というわけではないのですが、REST API を使って外部から情報を取り出して表示する、というサンプルも1つ作ってみました。こちらも同様に bot.js に追加します:
   :
   :
controller.hears(['(usd|eur|gbp|aud|nzd|cad|chf)'],'direct_mention',function    (bot, message) {
  var matches = message.text.match(/(usd|eur|gbp|aud|nzd|cad|chf)/i);
  var cur = matches[0].toUpperCase() + "JPY";
  var request = require( 'request' );
  url = 'http://fx.mybluemix.net/';
  request( url, function( error, response, body ){
    if( !error && response.statusCode == 200 ){
      var json = JSON.parse( body );
      var dt = json['datetime'];
      var rate = json['rate'];
      var p = rate[cur];
      bot.reply( message, dt + ' ' + p );
    }
  });
});

以前作った為替の JSON サービス(http://fx.mybluemix.net/)を使い、ダイレクトメンションで USD(米ドル)EUR(ユーロ)GBP(英ポンド)AUD(豪ドル)NZD(NZドル)CAD(カナダドル)CHF(スイスフラン)のいずれかを受け取った場合、それらの通貨が日本円だといくらになるのか、をリアルタイムに計算して返信してくれる、というボットです:
2016032101


Node.js、というか JavaScript での実装に慣れない人がいるかもしれませんが、比較的簡単な言語だと思うので、この Slack ボットを作る機会と一緒に勉強して慣れておくと面白いと思います。


Slack のボットを作るためのフレームワークである BotKit の使い方(というか導入方法)を紹介します。


前提条件として、当然ですが Slack のアカウントは必要です。お持ちでない場合は Slack のページでサインアップおよびサインインを済ませておいてください。サインイン済みの環境に対してボットを作成します。

また BotKit は Node.js のアプリケーションとして動作するので、そのパッケージマネージャである npm が導入されている必要があります。(CentOS 環境用の内容ですが)以下のページを参照するなどして、npm コマンドが使える状態を作っておいてください:
CentOS に StrongLoop をインストールする


最初に Slack の Bot creation page にアクセスして、新しいボットを1つ作成します:
Bot creation page


アクセス先でボットの名前を指定(下図では @dotnsf_bot)して、"Add bot integration" ボタンをクリックすると、ボットが作成されます。ボットの名前は他の人が使っていると使えないので気をつけてください:
2016031701


ボットの作成に成功すると以下の様な画面になり、API Token が表示されます。この値を後で使います。メモ帳などにコピーしておきます:
2016031702


仮にこの API Token の値が xoxb-XXX(API Token)XXX であったとして以下を紹介します。適宜自分の環境と読み替えてください。

次に BotKit をダウンロードします。npm をセットアップしたシステムにログインし、適当なディレクトリ(以下の例では /usr/local/src/)で以下のコマンドを続けて実行し、必要なパッケージとその依存パッケージをダウンロードします:
# cd /usr/local/src
# git clone https://github.com/howdyai/botkit.git
# cd botkit
# npm install

全て導入が完了したら、上記で取得した API Token を使ってボットを動かします(以下を一行で実行します):
# token=xoxb-XXX(API Token)XXX node bot.js

すると以下の様な画面になって、ボットが起動します(途中でボットを強制終了させる場合は Ctrl+C で抜けます):
2016031703



デフォルトのボット(実体は bot.js)ではいくつかの決められた挙動をするように実装されています。いくつか試してみましょう。


まず自分の Slack ID で(ボットを作成した時の Slack ID で)Slack にアクセスし、適当なチャネル(例えば #general)に入ります:
2016031704


以下のコマンドをメッセージとして入力し、ボットをこのチャネルに招待します:
/invite @(ボットの名前)
2016031705


続けて "Hello" というメッセージをこのボット宛に送ります。頭に @(ボットの名前): を付けてメッセージを送ります:
@(ボットの名前): Hello


するとボットが反応し、Hello というメッセージを返してくれます。最初の会話が成立しました:
2016031706



続けて自分のことを聞いてみます。先程と同様にして "Who am i" というメッセージを送ってみますが、"I don't know yet!"(「まだ知らない」)という答が返ってきました。そりゃそうだ:
2016031707


というわけで自分のことを教えてあげましょう。"call me (名前)" というメッセージを送ります。「次からはそう呼ぶ」と分かってくれたっぽい感じ:
2016031708


では改めて "Who am i" と聞いてみます。今度は自分が指定した名前を返してくれました。一応覚えていてくれたっぽいです:
2016031709


最後にこのボットを Slack から終了する方法も紹介します。実行中のコマンドラインから Ctrl + C で強制終了することもできますが、"shutdown" と命令し、確認のメッセージに "Y" と回答するとボットはシャットダウンします(コマンドも終了します):
2016031801




と、デフォルトのボットの挙動はまあこんな感じです。この中身は bot.js の中で実装されていて、そのカスタマイズもこのファイルを編集することになりますが、それについては別のまた機会に。

(2016/Mar/22 追記)
続きはこちら


このページのトップヘ