仮想サーファーの波乗り

仮想化エンジニアの日常

プログラミング・SNS分析・仮想通貨・自動化などに関してよく書く雑記ブログ

PythonでSlackBot開発⑤「DocomoAPIで雑談機能追加」


PythonでSlackBotを開発しよう企画の第5回目。今回は、DocomoAPIを活用して雑談できる機能を実装していきます。これまでは明示的に設定したレスポンスを返すようにしてきましたが、今回でようやくBotぽい動きになることを期待しています。


DocomoAPIの登録・APIキーの準備

まずは、DocomoAPIの登録をしていきます。DocomoAPIは、ドコモが開発者向けに提供しているAPIで、今回利用する雑談対話以外にも、画像認識や音声認識のAPIも提供されているようです。


新規アカウント登録 | docomo Developer support | NTTドコモ

まずはアカウント登録をしていきます。

f:id:virtual-surfer:20180402235511p:plain

メールアドレスとパスワードを登録して、個人で利用するので今回は「個人利用」にチェックをつけて登録します。


f:id:virtual-surfer:20180402235813p:plain

登録したメアドにメールが送信されてくるので、リンクをクリックしてメールアドレスを有効化します。


f:id:virtual-surfer:20180402235855p:plain

登録が完了したようです。「マイページへ」からマイページへ移動しましょう。


f:id:virtual-surfer:20180403000123p:plain

マイページから、サブメニューの「API利用申請・管理」をクリックして、APIの利用申請画面に遷移します。


f:id:virtual-surfer:20180403000307p:plain

「新規API利用申請へ」ボタンから新規APIの利用申請を進めていきます。


f:id:virtual-surfer:20180403000519p:plain

適当に値を入力していきます。


f:id:virtual-surfer:20180403000645p:plain

適当に入力していったら、「API機能選択へ」ボタンをクリックして、利用するAPI機能選択画面へ遷移します。


f:id:virtual-surfer:20180403001041p:plain

一番上の「雑談対話」にチェックを入れ、「利用するAPIの利用規約に同意して、次へ」ボタンをクリックして、アプリケーション登録確認画面に遷移します。


f:id:virtual-surfer:20180403001248p:plain

登録内容に問題がなければ「利用申請する」ボタンをクリックして、利用申請を完了させます。


f:id:virtual-surfer:20180403001356p:plain

これで登録完了です。「登録アプリケーション一覧へ」ボタンから登録したアプリケーションの情報ページに遷移します。


f:id:virtual-surfer:20180403001710p:plain

APIキーという項目に書かれたAPIキーを利用するので、控えておきましょう。

これでDocomoAPIの登録・APIキーの準備は完了です。


DocomoAPIで雑談Botの実装

では、DocomoAPIを活用して雑談Botを実装していきましょう。例のごとくrun.pyファイルを編集していきます。

run.py

# coding=utf-8
from slackbot.bot import Bot
from slackbot.bot import default_reply
import os
import requests
import json

@default_reply(matchstr='(.*)')
def talk(message, input):
    global context
    context_key = 'context'
    url = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=' + os.environ['DOCOMO_API_KEY']
    headers = {'Content-type': 'application/json'}
    data = {
        'utt': input,
        'mode': 'dialog',
        'place': '東京'
    }
    response = requests.post(
        url,
        data=json.dumps(data),
        headers=headers
    ).json()
    message.reply(response.get('utt'))

def main():
    bot = Bot()
    bot.run()

if __name__ == '__main__':
    main()

↑ 簡単に説明すると、default_replyというアノテーションで登録されていない文字列でメンションが飛ばされた場合に処理を開始します。dataという変数にjson形式のリクエスト情報を持たせてリクエストを行い、返ってきたレスポンスをjson形式に変換してレスポンス本文をSlackでメンションを飛ばしてきたユーザーに対してメンションをつけて送信しています。


DOCOMO_API_KEYはHerokuに登録しないと使えないので、控えておいたAPIキーをHerokuに登録しておきます。

f:id:virtual-surfer:20180403002646p:plain


以上で実装は完了です。以下のコマンドでherokuにlocalの変更内容を反映させ、herokuアプリケーションを再起動します。

$ git add {変更したファイルパス名}
$ git commit -m "{コミット名}"
$ git push heroku master
$ heroku restart


それでは、動かしてみましょう。


https://gyazo.com/05d179314f0142a0e7c29cae06c12a25


返答してくれた!会話を続けてみると...。

f:id:virtual-surfer:20180403003045p:plain


会話できないこともないですね。笑


もう少し会話を文脈を意識したものにさせたい!と思って調べてみると、リクエストにcontextというパラメータを持たせることで前回の文章を元にレスポンスを返してくれるようになり、少し会話が文脈を意識したものになるようです。

ということで、run.pyファイルを編集してみましょう。

run.py

# coding=utf-8
from slackbot.bot import Bot
from slackbot.bot import default_reply
import os
import requests
import json

context = {}

@default_reply(matchstr='(.*)')
def talk(message, input):
    global context
    context_key = 'context'
    url = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=' + os.environ['DOCOMO_API_KEY']
    headers = {'Content-type': 'application/json'}
    data = {
        'utt': input,
        'context': context.get(context_key, ''),
        'mode': 'dialog',
        'place': '東京'
    }
    response = requests.post(
        url,
        data=json.dumps(data),
        headers=headers
    ).json()
    context[context_key] = response['context']
    message.reply(response.get('utt'))

def main():
    bot = Bot()
    bot.run()

if __name__ == '__main__':
    main()


再度herokuにlocalの変更内容を反映させ、herokuアプリケーションを再起動します。

$ git add {変更したファイルパス名}
$ git commit -m "{コミット名}"
$ git push heroku master
$ heroku restart


会話してみると...

f:id:virtual-surfer:20180403003448p:plain

若干会話がそれっぽくなったかな?正直、あまり違いがわからないですね。笑


まとめ

今回はDocomoAPIを活用して雑談機能を実装していきましたが、これで少しBotらしさを獲得できたように思います。

次回は、DocomoAPIのリクエストを受け取ってそれっぽいレスポンスを返してくれるという機能を活用して、いろいろと応用していこうかと!


では!