PythonでSlackBotを開発しよう企画の第5回目。今回は、DocomoAPIを活用して雑談できる機能を実装していきます。これまでは明示的に設定したレスポンスを返すようにしてきましたが、今回でようやくBotぽい動きになることを期待しています。
DocomoAPIの登録・APIキーの準備
まずは、DocomoAPIの登録をしていきます。DocomoAPIは、ドコモが開発者向けに提供しているAPIで、今回利用する雑談対話以外にも、画像認識や音声認識のAPIも提供されているようです。
新規アカウント登録 | docomo Developer support | NTTドコモ
まずはアカウント登録をしていきます。
メールアドレスとパスワードを登録して、個人で利用するので今回は「個人利用」にチェックをつけて登録します。
登録したメアドにメールが送信されてくるので、リンクをクリックしてメールアドレスを有効化します。
登録が完了したようです。「マイページへ」からマイページへ移動しましょう。
マイページから、サブメニューの「API利用申請・管理」をクリックして、APIの利用申請画面に遷移します。
「新規API利用申請へ」ボタンから新規APIの利用申請を進めていきます。
適当に値を入力していきます。
適当に入力していったら、「API機能選択へ」ボタンをクリックして、利用するAPI機能選択画面へ遷移します。
一番上の「雑談対話」にチェックを入れ、「利用するAPIの利用規約に同意して、次へ」ボタンをクリックして、アプリケーション登録確認画面に遷移します。
登録内容に問題がなければ「利用申請する」ボタンをクリックして、利用申請を完了させます。
これで登録完了です。「登録アプリケーション一覧へ」ボタンから登録したアプリケーションの情報ページに遷移します。
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に登録しておきます。
以上で実装は完了です。以下のコマンドでherokuにlocalの変更内容を反映させ、herokuアプリケーションを再起動します。
$ git add {変更したファイルパス名} $ git commit -m "{コミット名}" $ git push heroku master $ heroku restart
それでは、動かしてみましょう。
返答してくれた!会話を続けてみると...。
会話できないこともないですね。笑
もう少し会話を文脈を意識したものにさせたい!と思って調べてみると、リクエストに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
会話してみると...
若干会話がそれっぽくなったかな?正直、あまり違いがわからないですね。笑
まとめ
今回はDocomoAPIを活用して雑談機能を実装していきましたが、これで少しBotらしさを獲得できたように思います。
次回は、DocomoAPIのリクエストを受け取ってそれっぽいレスポンスを返してくれるという機能を活用して、いろいろと応用していこうかと!
では!