こんばんは
前回、LINE BOTを無料で試してみました。heroku + RailsでLINE BOTを試してみたのですが、社内でロジックが単純すぎでくだらないという批判が多かったので、ロジックを少し改良しました。
といいつつ、頑張って複雑なロジックのものを作っても、ダメだしされたらショックが大きいので、とりあえず、docomo Developerが提供している雑談対話APIを使って返答を改良してみることにします。
雑談対話APIのAPI Key取得
まずは、docomo Developers supportでユーザ登録して雑談対話APIからAPI Keyを取得しておきましょう。
アプリの修正
前回のアプリを改良します。
雑談を実現するには会話の連続性が必要ですが、
雑談対話APIでは、レスポンスに対話モード(mode)とcontextが返却され、次のリクエストにそれらをセットすることで、会話の連続性を確保するようです。
対話モード(mode)は
dialog:対話
srtr:しりとり
のどちらか入るようです。
contextは自動的にシステムより出力されるIDが入るようです。
なので、まずは前のレスポンスのmodeとcontextを管理するテーブルを作ります。
$ rails generate model last_dialogue_info mid:string mode:string da:integer context:string
(daという「ユーザとシステムの対話に対してサーバが付与した番号」もレスポンスにはのってくるようなので用途はわからないけど、取りえず管理)
docomoのAPI呼び出しにはdocomoruという便利なライブラリがあったので横着してこれを使います。
Gemfileに以下を追加。
gem "docomoru"
そしてコントローラ。
class WebhookController < ApplicationController protect_from_forgery with: :null_session CHANNEL_ID = ENV['LINE_CHANNEL_ID'] CHANNEL_SECRET = ENV['LINE_CHANNEL_SECRET'] CHANNEL_MID = ENV['LINE_CHANNEL_MID'] OUTBOUND_PROXY = ENV['LINE_OUTBOUND_PROXY'] DOCOMO_API_KEY = ENV['DOCOMO_API_KEY'] # 追加! def callback (中略) text_message = result['content']['text'] from_mid = result['content']['from'] user = User.find_by(mid: from_mid) Message.create(user_id: user.id, text_message: text_message) ### ここから修正 ### docomo_client = DocomoClient.new(DOCOMO_API_KEY) response = nil last_dialogue_info = LastDialogueInfo.find_by(mid: from_mid) if last_dialogue_info.nil? response = docomo_client.dialogue(text_message) last_dialogue_info = LastDialogueInfo.new(mid: from_mid, mode: response.body['mode'], da: response.body['da'], context: response.body['context']) else response = docomo_client.dialogue(text_message, last_dialogue_info.mode, last_dialogue_info.context) last_dialogue_info.mode = response.body['mode'] last_dialogue_info.da = response.body['da'] last_dialogue_info.context = response.body['context'] end last_dialogue_info.save! message = response['utt'] ### ここまで修正 ### client = LineClient.new(CHANNEL_ID, CHANNEL_SECRET, CHANNEL_MID, OUTBOUND_PROXY) res = client.send([from_mid], message) (中略) end (中略) end
docomo APIを呼ぶライブラリの新規作成。
require 'docomoru' class DocomoClient def initialize(api_key = nil) @api_key = api_key end def dialogue(message, mode = nil, context = nil) client = Docomoru::Client.new(api_key: @api_key) response = client.create_dialogue(message, {mode: mode, context: context}) return response end end
docomoruを使うのであまり中身のないスカスカのライブラリになってしまいました…
heroku ENVの設定
最初に取得したAPI Keyを、アプリから参照するENVに設定
$ heroku config:add DOCOMO_API_KEY="xxxxxx"
herokuへデプロイ
$ git add . $ git commit -m 'xxxxxx' $ git push heroku master
DBがあるのでマイグレートします。
$ heroku run rake db:migrate
これで準備完了。
LINEから確認。
あまり会話になってないですが、動いてそうです。
「しりとりしよう」と言うとしりとりもできます。
まあ、他人のAPIを使って横着しましたが、前回のBOTよりは楽しめるかな。