MS謹製のbot作成フレームワーク「botbuilder」で遊んでみた!

  • 91
    いいね
  • 4
    コメント

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をとりあえず触りだけ・・という感じで動かしてみましょう。

参考リンク

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
sh
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.gif

これをどう実現するか?
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世紀の始まりを予感させますね!