Slackbot備忘録(2)　～docomoAPIを使ったbot～

#はじめに
[Slackbot備忘録(1)](https://qiita.com/usomaru/items/529b6f40902ee1eda125)に引き続き、今回はdocomo雑談対話APIを使ってbotと簡単な会話に挑戦。
※docomoさんのAPIに新たに[自然対話プラットフォーム](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_usage_scenario#tag01&ref=20180327345279)が追加されました。
それに伴って、**雑談対話APIは2018年6月を目途に廃止**となるそうです。
詳しい変更対応は[追記](https://qiita.com/usomaru/items/c31ec525eacb5e10c3a1#%E8%BF%BD%E8%A8%98)をご覧ください。


#docomo雑談対話APIからAPIを取得
##API取得方法
1. [ここ](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_usage_scenario)からdocomoAPIを取得します。
1. アクセスしたら、"申請する"ボタンをクリックします。
1. ログイン画面が表示されるので、新規登録をクリックして登録処理を行ってください。
1. ログインするとAPIの申請・管理画面に入れます。そこから"新規API利用申請へ"をクリックします。
1. 利用申請画面に飛ぶので、必要な情報を入力して申請して下さい。
1. 申請後、審査が通ると、APIKeyがもらえます。(審査は数分で終わります。)下の画像のAPI keyの部分を使うので、メモしておいて下さい。
![キャプチャ10.JPG](https://qiita-image-store.s3.amazonaws.com/0/201826/6e545281-a473-9515-502b-5bec78869970.jpeg)
  

#とりあえずコードをかいて動かしてみる
##my_mention.pyにコードを追加
前回（[Slackbot備忘録(1)](https://qiita.com/usomaru/items/529b6f40902ee1eda125)）作成したmy_mention.pyに以下のコードを追加します。

 ```python:my_mention.py
@default_reply()
def default(message):
    import requests
    import json
    import types

    KEY = 'ここに取得したdocomoAPIを記入'

    #エンドポイントの設定
    endpoint = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=REGISTER_KEY'
    url = endpoint.replace('REGISTER_KEY', KEY)
    text = message.body['text'] 

    payload = {'utt' : text, 'context': ''}
    headers = {'Content-type': 'application/json'}

    #送信
    r = requests.post(url, data=json.dumps(payload), headers=headers)
    data = r.json()

    #jsonの解析
    response = data['utt']
    context = data['context']

    #表示
    message.reply('%s' % response)
```

##slackbotを起動

![キャプチャ9.JPG](https://qiita-image-store.s3.amazonaws.com/0/201826/7434b0cd-533d-cb8d-b0f6-e0c91688bb58.jpeg)

botと会話ができました。会話が成り立っているかは別です。
なかなか面白い返答が返ってくるので楽しいです。

##コードの中身解説
簡単に解説。
まず今回は ```@default_reply()``` を使いました。
こちらは ```DEFAULT_REPLY ``` と同じ働き、つまりこのbot宛のメッセージで、どの応答にも当てはまらない場合に返したいメッセージをここに記入します。

botに送ったメッセージの取り出しは ```message.body['text']``` で行っています。Unicode文字列形式です。

続いて、docomoAPIで使われるjsonのパラメータについて。
真ん中辺りの ```utt``` という部分。
こちらは255文字以下で、ユーザの発話を入力します。
これを下の#送信という部分でjson形式で送ることによって返事が同じくjsonで返ってくるんですね。
そしてもうひとつ ```context``` という部分。
こちらは255文字以下で、システムから出力されたcontextを入力することにより会話を継続するみたいです。つまり、このcontextを次の対話データ送信時に一緒に送信すると、会話がつながるそうです。
1回目のみを想定していたため、今回このcontext部分を空白にしたのですが、若干ちぐはぐな会話になってしまった原因はここにありました。
2回目以降を想定したバージョンを近日中に公開したいと思います。

そして最後に ```message.reply('%s' % response)``` 部分。
こちらはひとつ上の行で定義したresponse部分を表示してくださいという意味。
カウントアップとかしたいときに使われるみたい。

なんとなくSlackbotを使いこなせてきました。
次回はDjangoを使ったpythonのwebページ作成の紹介とかできればと…

# 追記
この度、docomoさんのAPIに新たに[自然対話プラットフォーム](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_usage_scenario#tag01&ref=20180327345279)が追加されました。
それに伴って、雑談対話APIは2018年6月を目途に廃止となるそうです。
自然対話プラットフォームのAPIに切り替えたことで、URLやJSONの形式がもろもろ変更になったので備忘を乗せておきます。

## API取得
雑談対話と基本的には同様です。APIの選択で、自然対話プラットフォームを選択しましょう。
APIKeyのメモを忘れずに。

## ユーザー情報登録
今回新たな作業として、ユーザー情報を登録する必要があります。
そのため、下記画像のクロームの拡張機能(API のリクエストの確認ができる)を使って登録しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/d852397d-a8df-86da-4249-0b15c615f2f7.png)

詳しいレスポンスサンプルは[こちら](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_4#tag01)から確認できます。

拡張機能を登録したら、下記の画像のように入力していきます。
Request URLにはhttps://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY=xxxxxxxxxxxxx
とし、APIKEYの部分に先ほど取得したAPIを入力してください。
Headerタブの内容は基本的にデフォルトのままで大丈夫です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/14adab93-41ec-e412-dab6-5f60c92a7863.png)

続いてタブのBodyに移動します。
下記のJsonを入力します。

```
{
	"botId": "Chatting",
	"appKind": "Smart Phone"
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/11fc2344-a78b-745d-a553-3a3ff67452ea.png)

設定できたらSENDボタンをぽちっ

取得できれば下のようにappIdが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/a47d9b39-b985-99f7-40a1-670323653653.png)

## コードの変更
今回JSONの形式が変わったので何点か変更がありますが、基本的にやってることは同じです。
雑談対話のレスポンスサンプルは[こちら](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_4#tag01)になります。

修正したコードは以下の通りです。

```python:my_mention.py
@default_reply()
def default(message):
    import requests
    import json
    import types

    KEY = '取得したAPIキー'

    #エンドポイントの設定
    endpoint = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY=REGISTER_KEY' #変更
    appid = '上記で取得したappID' #変更
    url = endpoint.replace('REGISTER_KEY', KEY)
    text = message.body['text'] 

    #会話の入力
    payload = {'language':'ja-JP', 'botId':'Chatting','appId':appid,'voiceText':text} #変更
    headers = {'Content-type': 'application/json'}

    #送信
    r = requests.post(url, data=json.dumps(payload), headers=headers)
    data = r.json()

    #jsonの解析
    response = data['systemText']['utterance'] #変更

    #表示
    message.reply('%s' % response)
```

大きな変更点としては、ユーザー登録が必要になったことと、
キーの名前や必須のものが変わったことでしょうか。

ですが、一度書き方がわかってしまえば、他のAPIにも面白いものがたくさんあるので試してみたいところです。

# 参考ページ

- [とりあえずdocomo雑談対話APIを使ってみる](https://qiita.com/ponkio-o/items/df0d64677dcb4b7e8eb3)

##前回のもの

- [Slackbot備忘録(1)](https://qiita.com/usomaru/items/529b6f40902ee1eda125)