dorapon2000’s diary

忘備録的な。CTFやってます。

Microsoft Bot Frameworkを使ってSkypeボットを作る

Microsoft Bot Frameworkというものが4月から使えるようになっていたらしく、今まで作れなかったSkypeボットもそれで動かせるということで試してみました。ボットはheroku上で動かします。数ヶ月の間にちょくちょく仕様が変わっているようで、よく惑わされました。


公式リンク

必要なもの

  • Microsoftのアカウント
  • herokuのアカウント
  • Node.js

流れ

  1. Bot Builder for Node.js でボットを作る
  2. herokuにデプロイ
  3. Developer Portalでボットとして登録
  4. 登録する過程で得たappIdとappPasswordを環境変数に追加 (or ボットに直書き)
  5. スカイプチャンネルに対応させる

Bot Builderでボットを作る

$ mkdir mybot
$ cd mybot
$ npm init
$ npm install --save botbuilder
$ npm install --save restify

サンプルコードを参考にして、hello worldとだけ返すbot

// app.js

var restify = require('restify');
var builder = require('botbuilder');

//=========================================================
// Bot Setup
//=========================================================

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
  
// Create chat bot
var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});
var bot = new builder.UniversalBot(connector);
server.post('/api/messages', connector.listen());

//=========================================================
// Bots Dialogs
//=========================================================

bot.dialog('/', function (session) {
   session.send('Hello World'); 
});

ボットの機能を左右させる部分はBots Dialogs以下の部分です。Bot SetupではappIdとappPasswordを環境変数から受け取る形式にしているので、appIdとappPasswordがわかり次第、環境変数を設定していきます (まだわからない)。環境変数から受け取らず、直書きしてももちろん大丈夫です。

参考にしたサイトではUniversalBotではなくBotConnectorBotが用いられていたのですが、現在は非推奨のようです。

herokuにデプロイ

$ git init
$ heroku create mybot
$ echo 'node_modules' > .gitignore
$ echo 'web node app.js' > Procfile
$ git add .
$ git commit -m "First commit"
$ git push heroku master

herokuの管理画面でHeroku Domainを確認する (恐らく、mybot.herokuapp.comとなっている)。

Developer Portalでボットとして登録

Register a botでボットを登録します。

  • Bot handle : 一意なボットのID (後の変更不可)
  • Messaging endpoint : http://[Heroku Domain]/api/messages
  • Microsoft App ID : 下のボタンで新しく作る (AdBlockを停止しないと反応しませんでした)。その際パスワードもメモっておく。
  • Privacy statement : http://[Heroku Domain]/privacy (今回は適当)
  • Terms of Use : http://[Heroku Domain]/terms (今回は適当)

appIdとappPasswordを環境変数に追加

先ほどの環境変数を登録します。 ローカルでは

$ export MICROSOFT_APP_ID=[appId]
$ export MICROSOFT_APP_PASSWORD=[appPassword]

heroku上でも環境変数として登録する

$ heroku config:set MICROSOFT_APP_ID="[appId]"
$ heroku config:set MICROSOFT_APP_PASSWORD="[appPassword]"

Skypeチャンネルに対応させる

Developer PortalMy botsの左下でherokuとちゃんとつながっているかTestできます。うまく行くとAcceptedと表示され、エラーなら表示してくれます。参考にしたサイトでは入力のテストもできるようなUIになってましたが、私の時はTestというボタンひとつだけでした。

そして、Skypeチャンネルをaddします。Skypeの[Add to Skype]を押して指示に従うと、ボットとSkype上で会話できるようになります。試しに何かメッセージを送ればHello Worldと返してくれるはずです。

https://join.skype.com/bot/[appID]のリンクで他の人にも紹介できます。ただし公式ドキュメントのQ&Aでは、私的利用や企業内での利用は考慮されていないとあります。調べてみましたが、publishしてない状態でグループにボットを入れることはできなさそうです。

参考