技術

docomo雑談対話APIを使って会話BOTを作りました。(LINE BOT + Heroku + Rails + docomo雑談API)

投稿日:2016年6月11日 更新日:

こんばんは

前回、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から確認。

あまり会話になってないですが、動いてそうです。

IMG_4480

「しりとりしよう」と言うとしりとりもできます。

IMG_4482

まあ、他人のAPIを使って横着しましたが、前回のBOTよりは楽しめるかな。

-技術
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

【Rails】deviseを日本語化する

こんばんは railsでログイン機能を作る時にdeviseを使う方は多いのではな …

[ionic] アプリ名にハイフンやアンダーバー入ってると困る件

どうも中田です 今日もionicのお話。 スマホアプリ作るときに test-ap …

git_logo

[Git] どのコミットでバグが入ったか原因究明する方法【git blame】

こんにちは。さとうです。 今回はgitを使って、どのコミットでバグが入ったか原因 …

Slack Tasker系アプリで絵文字ステータスを自動設定(android 「Automate」)

Slackの絵文字ステータス、皆さん使っているでしょうか? 私は自分の居る場所に …

no image

[Angular]複数のクエリパラメータを設定する

こんばんは angularで複数のクエリパラメータを設定したいと思います。 co …