Edited at

とりあえずdocomo雑談対話APIを使ってみる

※現在(2019/01/01)docomo雑談対話APIのサービスが終了しており、自然対話APIの一部として提供されているようです。公式のリファレンスをご参照ください。

二番煎じもいいとこですが、とりあえずdocomoの雑談対話を動かしたいと思ったので。

最終的にはTwitterAPIと併用して、対話できるようなBOTを作ってみたりしたい。


必要なもの


  • Pythonの実行環境

  • docomo Developer supportのアカウント

  • docomo雑談対話APIのAPI Key

こちらのページからアカウント登録して、必要事項を入力して"雑談対話"をチェックして申請するとAPIKeyが取得できます。

審査が通ってからだと思ってましたが、申請後すぐに発行されます。


とりあえずWebで試す

こちらのページよりAPIの機能を試すことができます。

json形式でやり取りをします。

HTTPリクエストボディの2行目の"utt":こんにちはの部分が会話のやり取りの部分です。

好きな内容に書き換えて、実行ボタンを押すと結果が返ってきます。

{

"utt": "焼肉が食べたい",
"context": "",
"nickname": "光",
"nickname_y": "ヒカリ",
"sex": "女",
"bloodtype": "B",
"birthdateY": "1997",
"birthdateM": "5",
"birthdateD": "30",
"age": "16",
"constellations": "双子座",
"place": "東京",
"mode": "dialog"
}

{

"utt": "焼肉は食べたいんですね?食べたい",
"yomi": "焼肉は食べたいんですね?食べたい",
"mode": "dialog",
"da": "22",
"context": "W54mlG80QNb-o95J9c7SVA"
}


パラメータについて

パラメータについては右上の"説明を見る"ボタンより引用。

パラメータ
説明

utt
ユーザの発話を入力します。255文字以下

context
システムから出力されたcontextを入力することにより会話を継続します。255文字以下

nickname
ユーザのニックネームを設定します。10文字以下

nickname_y
ユーザのニックネームの読みを設定します。全角20文字以下(カタカナのみ)

sex
ユーザの性別を設定します。男または女

bloodtype
ユーザの血液型を設定します。A、B、AB、O のいずれか

birthdateY
ユーザの誕生日(年)を設定します。1~現在までのいずれかの整数(半角4文字以下)

birthdateM
ユーザの誕生日(月)を設定します。1~12までのいずれかの整数

birthdateD
ユーザの誕生日(日)を設定します。1~31までのいずれかの整数

age
ユーザの年齢を設定します。正の整数(半角3文字以下)

constellations
ユーザの星座を設定します。牡羊座、牡牛座、双子座、蟹座、獅子座、乙女座、天秤座、蠍座、射手座、山羊座、水瓶座、魚座のいずれか

place
ユーザの地域情報を設定します。仕様書 2.4「場所リスト」に含まれるもののいずれか

mode
現在の対話のモード。システムから出力されたmodeを入力することによりしりとりを継続
dialogまたはsrtr デフォルト:dialog

必須なのはuttのみな模様。

ユーザの属性については、省略または一部のみでも可。

名前を設定することで、返信内容に名前が含まれたりするそうです。


contextが大事らしい

上の焼肉の会話でいうところの"context": "W54mlG80QNb-o95J9c7SVA"の部分。

このcontextのを次の対話データ送信時に一緒に送信すると、会話がつながるというもの。

当たり前ですが、1回目はないので上記の例だと空白になっています。

1対話毎にcontextが別のものになるのかと思っていましたが、1セッション(?)毎に発行されます。


Pythonで動かす

uepon日々の備忘録 - 雑談対話APIを使ってみるを参考にさせていただきました。


docomo_dialogue.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import requests
import json
import types

KEY = 'ここに取得したAPIKeyを入れる'

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

#1回目の会話の入力
utt_content = raw_input('>>')

payload = {'utt' : utt_content, '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']

#表示
print "response: %s" %(response)

#2回目以降の会話(Ctrl+Cで終了)
while True:
utt_content = raw_input('>>')
payload['utt'] = utt_content
payload['context'] = data['context']

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

response = data['utt']
context = data['context']

print "response: %s" %(response)


以下実行結果です。

>>お魚たべたい!!

response: 話は変わりますけど、12月1日は映画の日だって、知ってました?
>>無視しないでください。。。知りません。
response: 無視に入るようです
>>冷たい
response: 大丈夫ですよ。寒いですか?
>>暑いです
response: ぱたぱた
>>ありがとう
response: ナデナデ
>>


実行時にエラーが出る

少しハマったのが、実行時にrequests.exceptions.SSLErrorが出るというもの。

とりあえず以下の方法で解決しました。

$ sudo pip install requests[security]


最後に

これとTwitterAPIを併用すればTwitterBOTができそう。LINEならLINEBOTも。

ただメンションを飛ばしてきたユーザー毎にそれぞれの会話をしないといけないので、そこら辺の処理をどうするのか難しそうですね。