水無瀬のプログラミング日記

プログラムの勉強した時のメモ

SlackBotにDocomo雑談対話APIを組み込む

はじめに

SlackBotと会話するのが夢だったので、実現します。

前提

作業しているPC:Mac(Sierra 10.12.6)

雑談対話APIの準備

今回は、Docomo雑談対話APIを使う。
事前に色々登録を済ませてAPIキーを取得しておく。
申請に時間が〜みたいな事書いてあるけど、すぐ帰ってくるはず。

登録したらAPIを使うためにAppIDが必要なので、ここを参考に事前に取得しておく。
PostmanでもCurlでもPOST飛ばせれば何でもいいと思われる。
準備が出来たらようやくプログラムが作れる。

Botに組み込む

とりあえず全部に反応してくれれば問題ないので、@default_replyで指定しとく。
ソースは以下を参照。

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

import requests
import json
from slackbot.bot import default_reply
import base64


# エンドポイントの設定
KEY = '取得したAPIキー'
endpoint = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY=REGISTER_KEY'
url = endpoint.replace('REGISTER_KEY', KEY)
appid = '取得したAppId'

# requestパラメータ
# voiceTextがAPIに投げる会話文になる
# language,botIdはこれで固定
payload = {'language': 'ja-JP', 'botId': 'Chatting', 'appId': appid, 'voiceText': '', 'clientData': {'option': {'mode': ''}}}

# レスポンス
data = {
    'systemText': {
        'expression': '',
        'utterance': ''
    }}
HEADERS = {'Content-type': 'application/json'}


@default_reply()
def chat(message):
    global payload
    global data

    payload['voiceText'] = message.body['text']

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

        # jsonの解析
        response = data['systemText']['expression']

        # command取り出し
        # しりとりのときはモードを'srtr'に設定するため、レスポンスからモードを受け取る
        # base64でエンコードされてるので、デコードしてリクエストに詰める
        command = json.loads(base64.b64decode(data['command']).decode('utf-8'))
        payload['clientData']['option']['mode'] = command['mode']

    except Exceptin as e:
        # エラーだとスタックトレースが出るので、一応ハンドリングしておく
        message.reply('は?何言ってんの?')

    # 表示
    message.reply(response)

話しかけて雑談してくれればOK。

f:id:minase_mira:20180603212830p:plain

まぁ、上辺の会話は出来てそう・・・?

最後に

会話の精度はそこそこないイメージ。
簡単な雑談くらいなら問題ないと思います。
的はずれな会話はご愛嬌というこで。