MSさん(人工知能で話題の)が、Bot開発用のフレームワークをBuild 2016にて発表しました。
[速報]マイクロソフト、Bot開発用フレームワーク「Microsoft Bot Framework」を公開。Slack、Skype、メール、SMSなど対応。Build 2016 - Publickey
Bot Frameworkというのは「Connector」「Builder SDK」「Directory」の3要素から構成される、とのことです。エコシステムを作るぞ、というMSの気概を感じますね。。
さてbot用SDK・フレームワークというと、hubotがスタンダードかなぁという風に感じていた中で昨年にはSlackのbotkitもお手軽かわいい感じで話題になったり、その渦中でこのBot Builder。もう本当に大bot時代という感じで。
bot、手軽に組めると色々と仕事や趣味も捗る・・!ので、武器は多いほうが良いですよね。ということで触ってみました。
nodejsです。
この記事では、Slackのbotをとりあえず触りだけ・・という感じで動かしてみましょう。
参考リンク
- Github: https://github.com/Microsoft/BotBuilder
- 公式Doc(Get Started): http://docs.botframework.com/builder/node/overview/
npmプロジェクト作成
セットアップ
npm init
でPJを作成→パッケージのインストール。
npm install --save botbuilder
npm install --save restify
Hello World!
Githubレポジトリには色々なexampleが置かれています。
ここにSlackのサンプルもあるので、参考にしながら下のコードを slack.js
としてプロジェクトのトップに設置します。
var Botkit = require('botkit');
var builder = require('botbuilder');
var controller = Botkit.slackbot();
var bot = controller.spawn({
token: process.env.token
});
var slackBot = new builder.SlackBot(controller, bot);
slackBot.add('/', function (session) {
session.send('Hello World');
});
slackBot.listenForMentions();
bot.startRTM(function(err,bot,payload) {
if (err) {
throw new Error('Could not connect to Slack');
}
});
保存したら、早速立ち上げてみましょう。
※Slackのbotトークンは予め取得しておいて下さい
https://slack.com/apps/A0F7YS25R-bots
token=$SLACK_BOT_TOKEN node slack.js
起動中に、botアカウントに1度話しかけると「Hellow world!」と返事をしてくるようになります!
対話をしてみる!
なるほど動いたぞ、ということでもう少し踏み込んでみます。
※Slackのbotに関する記述はこちら。
http://docs.botframework.com/builder/node/bots/SlackBot/
botということで、最低限(でも)必要となるのは「Aと話しかけたらBと答える」という機能です。
動作イメージはこんな感じ。
これをどう実現するか?
BotBuilderでは、この「やりとり」のことを「Dialog」という概念で扱っており、全てのBotは「DialogCollection」として振る舞います。
先ほどのHellow Worldを例に挙げるなら、
slackBot.add('/', function (session) {
session.send('Hello World');
});
というのが、「slackBot
に」「/
というIDで」「function(){}
というDialogを」「add
する」ことを意味します。
「呼びかけと返答のパターンが設定されているDialogを、botに持たせる」
非常にシンプルに記述できるので、まずコードから見てみましょう
var Botkit = require('botkit');
var builder = require('botbuilder');
var controller = Botkit.slackbot();
var bot = controller.spawn({
token: process.env.token
});
var slackBot = new builder.SlackBot(controller, bot);
var dialog = new builder.CommandDialog();
dialog.matches(['Hi', 'Hello', 'こんにちは'], function (session) {
session.send('こんにちは');
});
dialog.matches('how are you', function (session) {
session.send('im fine thank you.')
});
dialog.onDefault(function (session) {
session.send('もう1度言って下さい')
});
slackBot.add('/', dialog);
slackBot.listen(['mention', 'direct_mention']);
bot.startRTM(function(err,bot,payload) {
if (err) {
throw new Error('Could not connect to Slack');
}
});
-
dialog.matches()
の第1引数に入力パターンを文字列もしくは文字列のリストで - 同じく第2引数にコールバックを
- どのパターンにもマッチしなかった時の振る舞いとして
onDefault()
にコールバックを
記述します。
そして出来上がったDialogを/
に登録している、という訳です。
※ slackBot.listen()
の対象をmention
のみにすると、直接のメンション(先頭がユーザー名になっているメンション)は拾ってくれないことに注意して下さい
思ったより長くなってきたので、この記事はここまでにします・・
次は「簡単なやりとり(会話)をする」、というものを書いてみようと思います。
感想
なるほどシンプルに扱えるな!という感じです。
この程度の単純さだと実用性もないですが、書いてみた感じだと「hubotやbotkitと同じくらいシンプル」。
ただ、それらと違うのはBotFrameworkに関しては「単一のbotを手早く作る」という地平に収まっていない・・!という点です。その意味では、ここに書かれた内容はその魅力の数%にも満たないな、という理解。
まだまだ情報も少ないので、「ライバルたちはもう始めている!!」という状況にならないよう、サービス周辺の情報にアンテナを張りつつ、実装に関しても今のうちに色々と遊んでおきたいな〜という感想です!
2016年はbot世紀の始まりを予感させますね!