Enebular & docomoAPI & Slackで雑談Bot作成

今回は、enebularで雑談ボットを作りました。
参考にしたのは月刊I/O　19年1月号の記事。リンクとか貼るのがいいかと思いましたが、月刊I/Oのサイトにアクセスすると「セキュリティがあーだこーだ・・・」と警告が上がり断念しました。なのでamazonのリンクを貼っておきます。[→こちら](https://amzn.to/2MVpvk6)

#やったこと
Slackで雑談相手になってくれるチャットボットを作りました。Slackにはslackbotがありますが、彼は仕事熱心で雑談にのってくれるようなタイプではありません。（↓↓こんなやつ）
>![slack01.JPG](https://qiita-image-store.s3.amazonaws.com/0/172882/60efdf87-ea46-709c-c7f0-14c7ae594a2e.jpeg)

そこで**enebular**と**docomo雑談対話API**のお力を借りて、話せる相手を作りました。

#使ったもの
Slack bots：会話の入出力
Docomo雑談対話API：会話の相手
enebular：上の二つの要素をロジックで結ぶ

#手順１ Slackにbots appを追加
まずは、適当なSlackのワークスペースを作成します。左の帯の部分に、App追加の＋ボタンがるのでクリック。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/d005ec32-f181-8386-473f-24a6e8f58a3d.png)

すると、下のようなボタンがあるのでクリック。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/04a8570d-8ba4-7c36-905a-3dc9bd659eb3.png)

検索スペースが出てくるので、"bots"と入力。出てきたAppをインストールします。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/7615d1fc-33f1-1390-0c71-6ac23da34677.png)

インストールされたAppの設定ページに飛びます。赤枠の鉛筆マークです。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/ec5f70f0-7a3d-f311-a79f-7c0bcf355e68.png)

設定のページにAPIトークンがあるので、メモ帳にコピペしておきます。また、名前もカスタマイズできます。英語の小文字のみのようですが、お話相手の名前を決めましょう。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/511b4018-95bf-b0b0-e80f-c46e044bfe7f.png)

ここまででSlackでやることはおしまいです。

#手順２ docomo雑談対話APIを準備
次に[docomo developer support](https://dev.smt.docomo.ne.jp/?p=login)で雑談対話APIの利用申請をします。この辺はサクサク行きます。
「マイページ」→「API利用申請・管理」→「新規API利用申請」と進むと、利用申請のフォームに入力を求められます。そこを何とかクリアすると、API選択画面に移ります。
今回は自然対話：雑談対話を選択しました。他にもいろいろあって気になります。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/4e2f04a0-2376-1875-78c0-6ba339c952ad.png)

登録申請が終わると、登録アプリケーション一覧でアプリケーション情報を確認できます。ここのAPI Keyはあとで使いますので控えておきましょう。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/e485d498-513a-9dc8-b3b6-1b916b8e7646.png)


#手順３ enebularでFlowを構築
ここでやっとenebularを立ち上げます。
まず、必要なノードをインストールします。右上の「admin」タブでインストールできます。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/077dae05-0b83-7d03-4fcd-e907271b4e4a.png)

以下の2つをインストールします。
・node-red-contrib-slacker
・node-red-contrib-docomoapi

次に雑談対話APIの「appID」を取得します。このAPIは会話ステータス管理のために、ユーザーごとに「appID」が必要になるとのこと。なんだか少し難しい話です。
その辺はおいおい理解するとして、以下のようにノードを繋げます。左から、「inject」ノード、「NaturalCattingRegistration」ノード（docomoAPI）、「debug」ノードです。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/0d8ed332-70e8-4bc5-49b3-e3dca36d691f.png)



真ん中の「Natural~~~~」ノードの設定を行います。
・API Key：docomoAPI利用申請で控えたAPI Key
・BotID：雑談対話
・AppKind：任意
・Name：任意（ノードの名前）

これでひとまずデプロイします。「inject」ノードのボタン(上のピクチャの赤枠部分)を押すと、デバッグ画面に次のように「appID」が返されます。これを控えておきましょう。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/c560351e-f9bb-1970-addc-3fa42456a085.png)

次が本丸です。以下のようにノードを繋げます。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/0ae62c13-b228-2e7b-124e-615fc5d40c07.png)

「debug」ノードを除いて左から、①「slack」ノード（インストールしたノード）　→　②「function」ノード
　→　③「Dialogue」ノード（docomoAPI）　→　④「function」ノード　→　⑤「slack」ノード（インストールしたノード）

それぞれのノードを次のように設定します。

**①「slack」ノード**
・Token：Slackのbots appトークン

**②「function」ノード**
・コードを以下のように記述 

```
var appRecvTime = flow.get("serverSendTime");

var payload = {
    "appId" : "雑談対話APIの「appID」",
    "voiceText" : msg.payload,
    "appRecvTime" : appRecvTime
};

msg.payload = payload;

return msg;
```

**③「Dialogue」ノード**
・API Key：「Natural~~~~」ノードと同じ
　※雑談対話APIの「appID」を取得した時のAPI Key

**④「function」ノード**
・コードを以下のように記述 

```
flow.set("serverSendTime",msg.payload.serverSendTime);

var payload = msg.payload.systemText.expression;
msg.payload = payload;

return msg;
```

**⑤「slack」ノード**
・Token：Slackのbots appトークン

これで完成。あとはSlackで会話を楽しみましょう。

#結果
出来上がりはこんな感じです。会話になっているようでなっていないですね。ズレ漫才的な空気が楽しめます。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/c59bf09a-30f0-4eb2-8b84-82f4cdf8b41d.png)

docomoAPIの「キャラ変」を使えば、語尾も変えられるみたい。次はそれを追加してみよう。

#学んだこと
・node-redのノードがいろいろ作られていて、それをインストールして使うことができる
・初めて使うノードは”情報”タブでInputとOutputのデータ形式を確認する

#追加：キャラ変をやってみた
思いの外、キャラ変が簡単でした。**②「function」ノード**を以下のように書き換えます。

```
var appRecvTime = flow.get("serverSendTime");

var payload = {
    "appId" : "雑談対話APIの「appID」",
    "voiceText" : msg.payload,
    "appRecvTime" : appRecvTime,
    "clientData" :{
      "option":{
      "t":"akachan"
      }
    }
};
msg.payload = payload;
```
ここの`akachan`の部分を変えることでいろいろ試せます。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/e80c0d21-776a-9470-f6c0-d58aae079791.png)

なぜか細分化された愛媛県が気になります。
結果がこちらです。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/172882/7590930d-5770-b8c4-aa6a-11597855729e.png)

途中でコードを変えています。いろいろやってみましたが、最後の文のように、キャラになり切れていない時もあります。ボットくんも役作りが大変なんでしょうね。