Microsoft Bot FrameworkとHerokuとNode.jsを使ってSkype用Botを作る。

MicrosoftBotFramework　がSkype用のBotに対応しているので試してみました。

Microsoft Bot Frameworkを経由してSkype用BotとEndpoint用のサーバを通信するのですが、Endpoint用のURLはグローバルからアクセスできて、IPではなくドメインがあってHTTPSで通信できる必要があります。
Azureなどでサーバを借りればいいけど、無料で出来ないかなということでこの条件を満たしていてNode.jsが使えるHerokuを使ってみました。


## Microsoft Bot Frameworkの登録

* [Microsoft Bot Framework](https://dev.botframework.com/)のサイトに[Microsoftアカウント](https://signup.live.com/signup)でサインインする。


* [Register Bot](https://dev.botframework.com/bots/new) でBot情報を登録画面を表示する。
![regbot.png](https://qiita-image-store.s3.amazonaws.com/0/34699/3ec97b22-db6e-8aee-ec5b-3953485bb48e.png)
* Nameは後で変えられるが、Bot handleは後で変えられない。
* 「Messaging endpoint」にBot Frameworkとやり取りするサーバのURLを入れる。
今回はHerokuのURLを入れるがこれは後で指定する。
* Manage　Microsoft App ID and passwordを押して、App IDとpasswordを取得。
passwordは後で表示されないので、取得したらメモしておく。
* Registerで登録完了する。
* MyBotsタブにBot情報が登録されていることを確認する。
* Channelsで使用したいアプリをAddしておく。
　今回はSkypeを使用する。「Web Chat」とか「Slack」のほうが設定は簡単かも。

参考URL
https://bita.jp/dml/msframework_webchat
http://qiita.com/ymisono/items/c6096fa62a68dda8001a


## Node.JsでEndPoint用Programの作成

下記の記事を参考に作成する。
https://docs.botframework.com/en-us/node/builder/overview/

* Node.JSをインストールする。
下記のページよりダウンロード＆インストール
https://nodejs.org/ja/

* Bot用のディレクトリを用意して、ディレクトリに移動。その中でnpm initを実行

```
mkdir mybot
cd mybot
npm init 
```

botbuilderとrestifyをインストール

```
npm install --save botbuilder
npm install --save restify
```

server.jsの名前で下記の[サンプル](https://docs.botframework.com/en-us/node/builder/overview/)を作成。

```js:server.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");
});

```

下記のprocess.envの呼び出し方がわからなかったので、

```
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
```

横着して、直接記載した。AppIDとパスワードはMicrosoft Bot Frameworkの登録のときに取得した値を使用する。

```
    appId: "AppIDの値",
    appPassword: "パスワード"
```


package.jsonも作成して保存
この作り方はちょっと良くわかっていないので、あとで見直す。
Herokuにアップロードする際にこの情報をチェックしてライブラリがインストールされるはず。

``` package.json
{
  "name": "mybot",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "dependencies": {
    "botbuilder": "^3.4.4",
    "botkit": "^0.4.0",
    "restify": "^4.2.0"
  },
  "author": "",
  "license": "ISC",
  "scripts": {
    "start": "node server.js"
  }
}
```

参考URL
http://kokudori.hatenablog.com/entry/2013/04/04/025521




## Herokuに登録

Node.Jsで作ったプログラムをEndPoint用サーバにデプロイします。
Herokuの場合、Free版だと月に550時間、クレカ登録だと1000時間使えるので、 試しに使うには順分なのでこれを使います。
IBM Bluemixだと無料枠をうまくやりくりすれば２４時間稼働も出来るようなので、こっちも試したいです。
参考URL
https://tdenc.com/blog/2016/06/03/heroku-new-free-dyno/
https://www.heroku.com/pricing
http://qiita.com/akameco/items/39a55635ceb0ba185b7f


* Herokuアカウント登録
![herokutop.png](https://qiita-image-store.s3.amazonaws.com/0/34699/62592071-a041-de82-a110-4db77c0dc51a.png)

* Create New Appで新しいプロジェクトを作成
![herokucreateapp.png](https://qiita-image-store.s3.amazonaws.com/0/34699/53b70447-8569-876b-4241-35f1ce3b0d72.png)

* Settings タブを選択、Buildpacksで「heroku/nodejs」を追加する。
* Deployタブを選択して「 Deploy using Heroku Git 」に書かれている通りに実行する。あとgitはインストール済みの前提。

「git push heroku master」の実行時にファイルのアップロードと環境構築が行われる、
もしエラーが出たら、nodejsのモジュールか、package.jsonが間違っている可能性があるので、ちゃんと動く状態か確認して再度実行。

* Herokuの画面右上にある「Open app」をクリックする。「https://*****.herokuapp.com/」のページが表示され、
下記のレスポンスが返される。
```
{"code":"ResourceNotFound","message":"/ does not exist"}
```
このURLはSettingタブの「 Domains and certificates 」の箇所にもある。
このURLをMicrosoft Bot FrameworkのEndPointに設定する。

## EndPointの設定

* [Microsoft Bot Framework](https://dev.botframework.com/)にアクセスして[MyBot]のページを開いて、Editで「Messaging endpoint」に先程のHerokuのURLを入れる。httpではなく、httpsであることを確認すること。

*  [My Bot]の作成した　Botのプロフィール画面に戻り、「Test connection to your bot」で「Test」を実行して、Acceptedが帰ってくれば成功。
エラーが帰ってくればEndPointの設定が間違っている。nodejsモジュールの設定、AppID、パスワードの値、Herokuの設定に間違いがないか確認する。


## Skypeと通信

*  [Microsoft Bot Framework](https://dev.botframework.com/)の [My Bot]画面のChannelsのSkypeの箇所に「Add to Skype」があるのでこれをクリック。
*  AddContactを選んで、自分のSkypeクライアントにBotを登録する。
もし、Skypeがインストールされていなかったら、予めインストールしておくこと。
* Skypeが起動して、　Botが登録されていることを確認。
自分がオンラインであればBotもオンラインになるので、もし自分がオフラインになってればオンラインに変更する。
＊ Botにメッセージを投げて「Hello world」が帰ってきたら成功。

Hello worldだけだと面白くないので、
Github上にサンプルがあるのでこれも試してみる。これは、画像を返したり、質問形式で返したりするサンプルが乗っている。
https://github.com/Microsoft/BotBuilder/tree/master/Node/examples/demo-skype

```
var builder = require('../../core/');
```

の部分を

```
var builder = require('botbuilder');
```
に置き換えると動いた。

参考URL
https://docs.botframework.com/en-us/csharp/builder/sdkreference/gettingstarted.html



## その他

サンプル用のSDKはNode.jsとC#だけですが、他の言語でも出来るみたいです。
参考
[MicrosoftBotFrameworkのRestAPIを使ったTimerBot](http://qiita.com/nyasba/items/268524b2349cfe54600d)
[MicrosoftBotFrameworkのRESTAPIをPHPで SKYPEに悲しい言葉を吐くボット]
(http://qiita.com/y_kageyamna/items/79cb7c3652e9fbf32e6a#_reference-9262ac5d8282d333e2bb)