4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

docomo自然対話APIを使ってみる

Last updated at Posted at 2018-10-26

はじめに

前回の投稿から4ヶ月も経ってしまったことに驚いていますが、また何か作りたい衝動が出てきた&勉強を兼ねて、前回もお世話になったdocomoさんのAPIを使って自然対話に挑戦してみました。チャットボットですね。

参考サイト

Python3でdocomoの自然対話:雑談apiを動かす
docomo Developer support 自然対話

作る前に

APIの利用申請は割愛。方法は下記サイトとかに書いてあります。
https://codezine.jp/article/detail/8299

docomo Developer supportの自然対話の機能別リファレンスを見ると、どんなパラメータを送れば良いか。どんなレスポンスが返ってくるかが載っているので、まずは予習してみる。
図1.png
図2.png
図3.png

どうやら、JSON形式でボディ部にlanguage botId appId voiceText appRecvTime appSendTimeの情報を入れればレスポンスが返ってきて、systemText内のexpressionまたはutteranceを取り出せば良さそうとのこと。
そしてappIdは別途取得する必要があるということのようです。

appIdを取得する

pythonで下記のコードを作って取得しました。
botIdは"Chatting"指定
appKindはサービスごとに定義する任意の値だそうです。

get_appid.py
#!/usr/bin/env python
# coding: utf-8

import requests
import json

send_data = {
    "botId": "Chatting",
    "appKind": "Chatbot"
}
headers = {'Context-type': 'application/json'}

APIKEY = '[APIキー]'
url = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY={}'.format(APIKEY)

r = requests.post(url, data=json.dumps(send_data), headers=headers)
print(r.status_code) # レスポンスステータスを確認。200なら正常。
return_data = r.json()
print(return_data) # appIdを出力。

これを実行すると画面にappIdが出力されるので、それを使います。

200 ←200なら正常にレスポンスが返ってきている
{'appId': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'} ←これがappId

雑談APIを使う

以上で準備ができたので、実際に雑談APIを使うコードを作りました。
リクエストを送るJSONデータにappRecvTimeを入れ忘れたのですが動いたので結果オーライ(笑)

docomo_talk_api.py
#!/usr/bin/env python
# coding: utf-8

import requests
import json
from datetime import datetime

# APIキー
APIKEY = "[APIキー]"

# リクエストボディ(JSON形式)
send_data = {
    "language": "ja-JP",
    "botId": "Chatting",
    "appId": "[appId]",
    "voiceText": "",
    "appSendTime": ""
    }

# リクエストヘッダ
headers = {'Context-type': 'application/json'}

# リクエストURL
url = "https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY={}".format(APIKEY)

#ループ処理
while True:
    # メッセージを入力
    send_text = input()
    # endと入力すると終了
    if send_text == "end":
        print("おしゃべりを終了します。")
        break

    send_data['voiceText'] = send_text
    # 送信時間を取得
    send_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    send_data['appSendTime'] = send_time

    # メッセージを送信
    r = requests.post(url, data=json.dumps(send_data), headers=headers)
    # レスポンスデータから返答内容を取得
    return_data = r.json()
    return_message = return_data['systemText']['expression']
    print(return_message)

実行するとこんな感じになります。ちょっと分かりにくいですが、奇数行目が自分が送ったメッセージで偶数行目がAPIからの返答です。

こんばんは
ばわー
元気ですね
げんき
名前を教えて
私の名前はゼロです。
end
おしゃべりを終了します。

名前はゼロらしいです。

ちなみに、リクエストボディにはもっと色々付けられるので、例えば

send_data = {
    "language": "ja-JP",
    "botId": "Chatting",
    "appId": "[appId]",
    "voiceText": "",
    "clientData": {
        "option": {
            "nickname": "[名前]",
            "nicknameY": "[呼び方(カタカナ)]",
            "sex": "[性別]",
            "birthdateY": "[誕生年]",
            "birthdateM": "[誕生月]",
            "birthdateD": "[誕生日]",
            "bloodtype": "[血液型]",
            "constellations": "[星座]",
            "place": "[住んでる地域]",
            "mode": "dialog"
            "t": ""
        },
    },
    "appSendTime": ""
    }

みたいに情報を入れると名前を呼んでくれたりします。

なにもしてないよ
そうだったんですか・・・ そういえば、[名前]さん、今のアニメお勧めあります?

誕生日とか星座もなにかのタイミングで言ってくれるのかな?
住んでる地域は場所リストに記載された地域しか駄目らしい。県名だったり市の名前だったり統一感がない。。。
bot君の名前とかは変えられないのは残念。
ただ、tタグを"kansai"とすると返事が関西弁に、"akachan"にすると赤ちゃん言葉(○○でちゅ)に変わりました。
やっぱり、こういうのを作るのは楽しいですね。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?