Python
Slack
docomoAPI
slackbot

Slackbot備忘録(2) ~docomoAPIを使ったbot~

はじめに

Slackbot備忘録(1)に引き続き、今回はdocomo雑談対話APIを使ってbotと簡単な会話に挑戦。
※docomoさんのAPIに新たに自然対話プラットフォームが追加されました。
それに伴って、雑談対話APIは2018年6月を目途に廃止となるそうです。
詳しい変更対応は追記をご覧ください。

docomo雑談対話APIからAPIを取得

API取得方法

  1. ここからdocomoAPIを取得します。
  2. アクセスしたら、"申請する"ボタンをクリックします。
  3. ログイン画面が表示されるので、新規登録をクリックして登録処理を行ってください。
  4. ログインするとAPIの申請・管理画面に入れます。そこから"新規API利用申請へ"をクリックします。
  5. 利用申請画面に飛ぶので、必要な情報を入力して申請して下さい。
  6. 申請後、審査が通ると、APIKeyがもらえます。(審査は数分で終わります。)下の画像のAPI keyの部分を使うので、メモしておいて下さい。 キャプチャ10.JPG

とりあえずコードをかいて動かしてみる

my_mention.pyにコードを追加

前回(Slackbot備忘録(1))作成したmy_mention.pyに以下のコードを追加します。

my_mention.py
@default_reply()
def default(message):
    import requests
    import json
    import types

    KEY = 'ここに取得したdocomoAPIを記入'

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

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

    #表示
    message.reply('%s' % response)

slackbotを起動

キャプチャ9.JPG

botと会話ができました。会話が成り立っているかは別です。
なかなか面白い返答が返ってくるので楽しいです。

コードの中身解説

簡単に解説。
まず今回は @default_reply() を使いました。
こちらは DEFAULT_REPLY と同じ働き、つまりこのbot宛のメッセージで、どの応答にも当てはまらない場合に返したいメッセージをここに記入します。

botに送ったメッセージの取り出しは message.body['text'] で行っています。Unicode文字列形式です。

続いて、docomoAPIで使われるjsonのパラメータについて。
真ん中辺りの utt という部分。
こちらは255文字以下で、ユーザの発話を入力します。
これを下の#送信という部分でjson形式で送ることによって返事が同じくjsonで返ってくるんですね。
そしてもうひとつ context という部分。
こちらは255文字以下で、システムから出力されたcontextを入力することにより会話を継続するみたいです。つまり、このcontextを次の対話データ送信時に一緒に送信すると、会話がつながるそうです。
1回目のみを想定していたため、今回このcontext部分を空白にしたのですが、若干ちぐはぐな会話になってしまった原因はここにありました。
2回目以降を想定したバージョンを近日中に公開したいと思います。

そして最後に message.reply('%s' % response) 部分。
こちらはひとつ上の行で定義したresponse部分を表示してくださいという意味。
カウントアップとかしたいときに使われるみたい。

なんとなくSlackbotを使いこなせてきました。
次回はDjangoを使ったpythonのwebページ作成の紹介とかできればと…

追記

この度、docomoさんのAPIに新たに自然対話プラットフォームが追加されました。
それに伴って、雑談対話APIは2018年6月を目途に廃止となるそうです。
自然対話プラットフォームのAPIに切り替えたことで、URLやJSONの形式がもろもろ変更になったので備忘を乗せておきます。

API取得

雑談対話と基本的には同様です。APIの選択で、自然対話プラットフォームを選択しましょう。
APIKeyのメモを忘れずに。

ユーザー情報登録

今回新たな作業として、ユーザー情報を登録する必要があります。
そのため、下記画像のクロームの拡張機能(API のリクエストの確認ができる)を使って登録しました。
image.png

詳しいレスポンスサンプルはこちらから確認できます。

拡張機能を登録したら、下記の画像のように入力していきます。
Request URLにはhttps://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY=xxxxxxxxxxxxx
とし、APIKEYの部分に先ほど取得したAPIを入力してください。
Headerタブの内容は基本的にデフォルトのままで大丈夫です。
image.png

続いてタブのBodyに移動します。
下記のJsonを入力します。

{
    "botId": "Chatting",
    "appKind": "Smart Phone"
}

image.png

設定できたらSENDボタンをぽちっ

取得できれば下のようにappIdが表示されます。
image.png

コードの変更

今回JSONの形式が変わったので何点か変更がありますが、基本的にやってることは同じです。
雑談対話のレスポンスサンプルはこちらになります。

修正したコードは以下の通りです。

my_mention.py
@default_reply()
def default(message):
    import requests
    import json
    import types

    KEY = '取得したAPIキー'

    #エンドポイントの設定
    endpoint = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY=REGISTER_KEY' #変更
    appid = '上記で取得したappID' #変更
    url = endpoint.replace('REGISTER_KEY', KEY)
    text = message.body['text'] 

    #会話の入力
    payload = {'language':'ja-JP', 'botId':'Chatting','appId':appid,'voiceText':text} #変更
    headers = {'Content-type': 'application/json'}

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

    #jsonの解析
    response = data['systemText']['utterance'] #変更

    #表示
    message.reply('%s' % response)

大きな変更点としては、ユーザー登録が必要になったことと、
キーの名前や必須のものが変わったことでしょうか。

ですが、一度書き方がわかってしまえば、他のAPIにも面白いものがたくさんあるので試してみたいところです。

参考ページ

前回のもの