slackbot

こんにちは、じょえずです。

「Slackでボットを作る」の第6回目です。ボット開発手順の第5段階、Botkitのカスタマイズについてお送りします。

一応Windows環境を前提にしています。全体概要は第1回目の概要編を参照下さい。

前回までのおさらい

BotKitをカスタムボットユーザーとしてSlackと連携させて、雛形ですがオリンジナルなボットをSlack上で動かしました。

今回は自分だけの機能をボットに実装します。

実装する機能

さて、まずは「どんな機能をボットに持たせるか」ですが、とりあえず、簡単な会話をしてみようと思います。あまりウケる機能を考えられませんでしたが、一応

「na!ka!ta!」と打ち込むと
「I'm a perfect human.」とボットが返してくれる

機能を実装してみます。

ボットロジックのソースファイル

前回前々回でBotkitをダウンロードしたディレクトリをみて下さい。その直下にjsファイルがいくつかあると思います。その中の「slack_bot.js」がボットの実体です。

(2016年6月時点でGitのMasterの場合。ファイル名はバージョンや時期によって若干違うと思います。)

メモ帳やエディタソフトで開いてみて下さい。先頭にコメント行で説明が載っています。

要約すると、

これはBotkitでつくられたSlackボットのサンプルです。

次のようなBotkitのコアな機能を多く示しています。

APIを使ってSlackに接続、話のパターンに基ずくメッセージの受信とその返信

質問に応えるような会話システムの作成やユーザー情報等のストレージへの取得・保存の構築に使用して下さい。

と、書いてあります。

また、その下には、前回までにやってきたBotkitの動かし方などがざっと書いてあります。詳しくはhttp://howdy.ai/botkitにものっています。英文ですが、ここに全ての情報があります。

ボットロジックのソースコード

それでは、ロジック部分を見てみましょう。

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(['hello', 'hi'], 'direct_message,direct_mention,mention', function(bot, message) {

    bot.api.reactions.add({
        timestamp: message.ts,
        channel: message.channel,
        name: 'robot_face',
    }, function(err, res) {
        if (err) {
            bot.botkit.log('Failed to add emoji reaction :(', err);
        }
    });


    controller.storage.users.get(message.user, function(err, user) {
        if (user && user.name) {
            bot.reply(message, 'Hello ' + user.name + '!!');
        } else {
            bot.reply(message, 'Hello.');
        }
    });
});

最初にnodeで実行したプロセスの実行時の環境変数tokenの内容をチェックして、設定されてなければ処理を終了しています。

そして、Botkitのモジュール群やOSなどを参照可能とし、環境変数のtokenを取込んでいますね。その下のロジックは何となく読めると思いますが、雛形となっていた会話機能的なものが並んでいます。

特に先頭にある「hello」の文字は、まさに「“hello”もしくは“hi”と呼べばHelloって返してくれる」あれですね。これをベースにロジックを組み込めばオリジナルな会話機能が実装できそうですね。

hears()コマンド

一見してわかるのは、hears()というコマンドでメッセージを拾ってる、ということですね。さきほどのhttp://howdy.ai/botkit

「キーワードを拾ったり返信したりをボットにさせるとてもベーシックなコマンド.hears()を試してみてください」

と書かれています。

hears()コマンドはBotkitで用意された(controllerは冒頭でBotkitのモジュール群を再定義したもの)、とてもポピュラーなコマンドのひとつのようです。

その構文は

.hears(対象メッセージ文字列、対象メッセージ種類、実行する処理関数)

のように三つの引数からなっています。

第一引数:対象メッセージ文字列

ボットに反応させるメッセージの文字列を指定します。文字列そのものや、文字列パターンを複数指定できます。

第二引数:メッセージ種類

第一引数のキーワードがどのメッセージにあれば反応させるかを識別子で複数指定できます。

例えば

  • "direct_message"=ダイレクトメッセージされた場合
  • "direct_mention"=“@ユーザー名 hello”のように、直接メンションされた場合
  • "mention"=“hello @ユーザー名”のように、メッセージ中でメンションされた場合
  • "ambient"=メンション以外のメッセージ
みたいな感じです。

第三引数:実行する処理関数

botとmessageを引数とした関数を実行できます。botはこのカスタムボット自身のオブジェクトで、messageはslackメッセージの構造体というかオブジェクトのようです。

メッセージの詳細はhttps://api.slack.com/events/messageに掲載されています。

会話の実装

では、第一引数に'na', 'ka', 'ta'('na'とか'ka'とか単独でも反応してしまいますが)、第二引数には'direct_message,direct_mention,mention'を、そして実行する処理は「I'm a perfect human.」とSlackメッセージを送信するという内容でhears()コマンドを先頭に追加してみます。

controller.hears(['na', 'ka', 'ta'], 'direct_message,direct_mention,mention', function(bot, message) {

        bot.reply(message, 'I\'m a perfect human.');

});

こんな感じです。jsファイルは保存しておきましょう。

Slack側のボット設定の変更

せっかくですのでボットのアイコンも変更してよりオリジナル感を出してみます。

App Directory→Custom Integration→Bots→Edit Configurationで前々回連携したカスタムボットjoeの設定画面を開きます。

そこのCustomize Icon欄で変更できます。Choose an emojiボタンで絵文字のアイコンに変更してみます。

2016061731
変更を保存すると、
2016061730
はい、ボットのアイコンが変わりました。

perfect humanボットの実行

それでは、前回と同様の手順でボットを起動し、「na,ka,ta,nakata」と入力してみましょう。
2016061733
w( ̄o ̄)w オオー、反応してくれました。

まとめ

全6回に渡った「Slackでボットを作る」、どうでしたでしょうか。ちょっとゆっくりでしたが、ボット実装のイメージが捉えられたかと思います。

- 今チャットが熱い - シリーズ」から始まったチャットへの潮流とボットの関係やSlackシリーズを通してみてきた人気チャットツールの使い方を通して、トレンドである「ビジネスツールのチャットへの集約」のアイデアがいろいろ湧いてきたのではないでしょうか。

それらの参考になれば幸いです。それでは!