Edited at

ココからスタートしよう、Botkitの基礎!+応用への手引き

More than 1 year has passed since last update.

みなさん、こんにちは! okajaxです!

チャットボット Advent Calendar 2016 の 16日目。

本日は、Botkitの「ココさえ押さえれば!」というBotkitの基礎TIPS集を書こうと思います。

Botkitをはじめる際、「こまったな:thinking:」「アレしたいな:thinking:」と思ったとき

この記事から読んでいただけたらと思います♪

(※この記事は、SlackBotを作るならコレ一択!Watsonとの連携で注目が高まるBotkitをつかってみた - BITAデジマラボ のコンパクト再編集版+αです)


基本的なサンプルコード

サンプルコード+Heroku用のテンプレートを、GitHubにあげてあります。

「とりあえず動かしてみたい」という方は、ポチっとデプロイしてみてください♪



okajax / Botkit-template-for-heroku


基本の受け答え .hears()

Botkitの基本会話の形は下記のとおり。


◯◯という単語にマッチ → ◻◻という発言(または処理)をさせる


コードすると下記のとおり。


controller.hears(['挨拶', 'こんにちは', 'Bot', 'あなた', '', 'だれ', '自己紹介'], 'direct_message,direct_mention,mention', function (bot, message) {

// bot.reply()で、botに発言をさせます。
bot.reply(message, 'こんにちは!私は *Botkit製のBot* です! \n _いろんな事ができますよ!_ :smiley:');

});

['挨拶', 'こんにちは', 'Bot', 'あなた', '誰', 'だれ', '自己紹介']

第一引数の配列には、マッチする単語群を指定します。

正規表現も使えます。

'direct_message,direct_mention,mention'

第二引数には、反応するメッセージタイプを指定します。

第三引数の関数内の bot.reply() で発言をさせます。


テキストの装飾について

** __ :: といった装飾が、通常のSlackメッセージと同様に使えます。

改行は、\nで行えます。


反応するメッセージタイプ

Botkitは、細かく反応するメッセージタイプを指定する事もできます。

種類は下記の4つ。


  • direct_message (ダイレクトメッセージ)

  • direct_mention (直接メンション)

  • mention (メンション)

  • ambient (どんなタイプでも反応)

ちょっとイメージわきづらいと思いますので、画像付きで解説しますね。

1.jpg

2.jpg

3.jpg

4.jpg

このように、かなり細かく指定ができます!

基本は、 direct_message,direct_mention,mention の3つの指定で良いと思います。


メッセージから単語を取り出すには message.match

message.matchで、正規表現にマッチした単語を取り出せます。

たとえば、

controller.hears(['(.*)って呼んで'], ... ){ ... }

に「okajaxって呼んで」と入れると、message.match には

['okajaxって呼んで', 'okajax'] が入っています。

ですので、 message.match[1] で正規表現にマッチした

「okajax」を取り出せます。

サンプルコードはこちら


質問形式の会話

連続した会話を開始するには

bot.startConversation(message, function (err, convo) {...})

を使います。

こちらの第二引数の関数のなかでconvo.ask(...)を呼び出す事で

質問形式の会話が実装できます。

こちらに関しては実際のコードを見て、

形を覚えてしまうのがオススメです。

// convo.ask() で質問をします。

convo.ask('私が何味が好きか当ててみてください!', [
{
pattern: '醤油', // マッチさせる単語
callback: function (response, convo) {

// ▼ マッチした時の処理 ▼

convo.say('正解!:ok_woman:\n醤油!これぞ王道!:+1:'); // convo.say()で発言をします。
convo.next(); // convo.next()で、会話を次に進めます。通常は、会話が終了します。
}
},
{
pattern: '味噌',
callback: function (response, convo) {
convo.say('正解!:ok_woman:\n寒いと味噌たべたくなります!:+1:');
convo.next();
}
},
{
default: true,
callback: function (response, convo) {

// ▼ どのパターンにもマッチしない時の処理 ▼

convo.say('うーん、おしいです!:no_good:');
convo.repeat(); // convo.repeat()で、質問を繰り返します。
convo.next(); // 会話を次に進めます。この場合、最初の質問にも戻ります。
}
}
]);

サンプルコードはこちら


データの保存

一時的にデータを保存する事もできます。

ただし、セッションの続く限りの期間限定です。

(自分のほうでは、Botがスリープや再起動するとリセット、と解釈しています)

保存、取得、削除、すべて削除 の4つの操作ができます。


例.js

controller.storage.users.save({id: message.user, foo:'bar'}, function(err) { ... });

controller.storage.users.get(id, function(err, user_data) {...});
controller.storage.users.delete(id, function(err) {...});
controller.storage.users.all(function(err, all_user_data) {...});

「ユーザー」「チャンネル」「チーム」ごとにデータを保持する事ができます。

それぞれ、下記のように呼び出せます。


例.js

controller.storage.users.***

controller.storage.channels.***
controller.storage.teams.***

実際にユーザーデータを取得/保存しているコードが下記になります。

controller.storage.users.get(message.user, function (err, user_info) {

// ▼ データ取得後の処理 ▼

// ユーザーデータが存在しているかどうか調べる
// ※第二引数で指定した変数(ここでは'user_info')に、ユーザーデータが入っています。
if (!user_info) {

// ▼ ユーザーデータがなかった場合の処理 ▼

// ユーザーidとユーザー名 のオブジェクトを、user_infoとして作成します。
user_info = {
id: message.user,
name: name_from_msg
};

}

// user_infoを保存します。
controller.storage.users.save(user_info, function (err, id) {

// ▼ 保存完了後の処理▼

bot.reply(message, 'あなたのお名前は *' + user_info.name + '* さんですね!覚えました!');

});

});

サンプルコードはこちら

controller.storage.users.get()の第一引数は、

ユーザーIDにしないとエラーが出るため注意です!

※後述しますが、永続的にデータを保存したい方向けには、FirabaseやMongo向けのミドルウェアも用意されています。


どれにも当てはまらなかった場合の返答

Botkitには、どれにも当てはまらないときのデフォルト対応

(MicrosoftBotFrameworkでいう所のonDefaultにあたるもの)

が、自分が探した限りだと見当たりませんでした。

調べたところ hears()には優先順位があり、

一番最後に controller.hears(['(.*)'], ... ){ ... }) を用意すれば

デフォルト対応が実装ができました。

サンプルコードはこちら


応用への手引き


ミドルウェア

通常ですと、データの保存は、セッションの続く限りの期間限定ですが

FirebaseやMongoDBと接続できるミドルウェアも存在しています。

また、API.ai, LUIS, WatsonConversation といった自然言語処理系サービスと

連携できるミドルウェアも存在しています。

公式GitHubにまとめページがあるので、興味がある方はぜひ!



botkit / readme-middlewares.md (ミドルウェアまとめページ)


応用的な使い方のご紹介

個人的に気になっている、Botkitの応用的な活用法のリンク集です。


さいごに

Botkitは、Slackに特化しているだけあって、色々な事ができそうですね!

Botkitでの開発に興味ある方は、公開Facebookグループもありますのでよかったらぜひどうぞ!


ここまでのAdventCalender感想

すべて目を通しています!楽しい記事ありがとうございます!><

LINE、Slack、シェルスクリプト製Bot、Pepperなど... とても多様で面白いですね!:raised_hands:

このAdvent Calenderは「Bot作りたいけど、どういう手段・開発手法があるんだろ?:thinking:」と知りたい方へのインデックスとして役立つかもですね♪

記事をみていて、

なかでも気になったのは「ChatOps」というワードでした! (ごめんなさい、初耳でした><)

Botは「AIと組み合わせて〜」って方向だけでなく、仕事面でも戦略的に使っていけるぞー!という概念なのですね!

GitHubとの連携に特化した「githubot」という物の紹介もあったりで、とても学びが多いです:laughing:

Slackは、ChatOpsにドンピシャリですね!

同じ方向では、MicrosoftTeamsの今後も動向も、個人的に気になる所です♪


AdventCalendar後半も

実践的内容や、機械学習やAIを扱った記事があり、楽しみですね!:kissing_closed_eyes:

それではまたー!