Docomo 雑談APIの提供終了…

表題の通り、気が付いたらDocomo様の雑談APIがサービス終了してました…

再三メールでお知らせは来ていたと思いますが、割とスルーして。 LINE BOTがバカっぽい返しをしてくれなくなってようやく重い腰を上げました。

というわけで、雑談APIから自然対話:雑談API(ややこしい)へ移行。Pythonです。


まずは、Docomo Developer Support からAPI申請を。 新規アプリの登録で諸々入力して次へ。 APIはとりあえず、法人登録不要のものは一通り申請してみました。

f:id:singyestarday:20180730190841p:plain

申請は特に問題なく終了。。。 続いて、Pythonでコードを変更します。

Pythonソースコード変更

変更というか、そもそも今回は、「ユーザ登録」という概念が追加になっています。

ユーザ登録といっても、メールアドレス登録とかではなく、固有のID(appId)を取得するだけです。

このappIdを統一することで、単発の受け答えでなく、会話を続けるようになっています。

以前の、context の代わりっぽいです。 あとは、、、mode がBase64 URLエンコーディングされています。ここ注意。

で、一応コードは↓のように変更。

# 定義 ------------------------------
# インポート
# -----------------------------------
import requests
import json
import base64
from datetime import datetime

VER = 'VER 2.0'

KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

class DocomoChat():
    
    # バージョン表示
    print ('Docomo Talk Class -> ' + VER)
    
    # ---------------------------------------------
    # 登録(appIdの取得)
    # ---------------------------------------------   
    def resistration(self, appKind):
        
        endpoint = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY=REGISTER_KEY'
        url = endpoint.replace('REGISTER_KEY', KEY)

        headers = {'Content-type': 'application/json'}

        payload = {
                "botId": "Chatting",
                "appKind": appKind
            }
        
        r = requests.post(url, data=json.dumps(payload), headers=headers)
        data = r.json()
        
        return data["appId"]
            
    # ---------------------------------------------
    # 雑談APIの呼び出し(最小限)
    # --------------------------------------------- 
    def talk(self, message, mode, appId, time=""):
        # REST URL
        endpoint = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY=REGISTER_KEY'
        url = endpoint.replace('REGISTER_KEY', KEY)

        headers = {'Content-type': 'application/json'}
       
        # リクエストボディ(必須のみ)
        payload = {
            "language":"ja-JP",
            "botId":"Chatting",
            "appId":appId,
            "voiceText":message,
            
            "appRecvTime":time,
            "appSendTime":datetime.now().strftime('%Y-%m-%d %H:%M:%S')
          }

        r = requests.post(url, data=json.dumps(payload), headers=headers)
        data = r.json()
        
        # レスポンスの中身
        
        #テキスト
        response = data['systemText']['expression']
        #モード(会話 or しりとり)
        mode = json.loads(base64.b64decode(data["command"]))['mode']
        #時刻
        time = data['serverSendTime']

        return response, mode, time

これを、↓のように呼べば雑談できるかと。

#-----------------------------------
#  動作確認用メイン関数
#-----------------------------------
if __name__ == '__main__':
    #クラス宣言
    TALK = DocomoChat()

    #登録
    appid = TALK.resistration("dempachan")

    print(appid)
        
    message = ''
    mode = 'dialog'
    time = ""

    while message != 'バイバイ':
        message = input('私 : ')
        res, mode, time = TALK.talk(message, mode, appid, time)
        print (res)

mode、レスポンスで取得してますが、↑の呼び出しでは意味なし。しりとりするときに必要かも、と思ったので一応。

以上で移行完了。