Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

※現在(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も。
ただメンションを飛ばしてきたユーザー毎にそれぞれの会話をしないといけないので、そこら辺の処理をどうするのか難しそうですね。

ponkio-o
数学嫌いなどこかの理系大学生
retty
Retty株式会社はソーシャルメディア、スマートフォンを活かした「人を軸にお店を探せる」グルメサービスRettyを運営する会社です。
https://retty.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした