技術

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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

関連記事

no image

Angular6で子コンポーネントに文字列を渡す

文字列と変数の値を渡す時、記述が少しだけ違います。 // 文字列を渡したい時 & …

[Angular] has no exported member ‘XXXLoginComponent’.

どうも中田です Angularでコンポーネント名を階層構造にあった名前にしようと …

【AWS】VMWareからAWSへサーバ移設

どうも中田です。 今回はVMWareからAWSへのマイグレーションに関するお話。 …

[Xcode]Provisioning ProfileのUUIDを確認する方法

どうも田中です。 iOSアプリの審査に向けて作業している最中、buildエラーに …

wgetコマンドで指定のサイトをダウンロードしてみる。

wgetコマンドって? 下記の形式のコマンドを叩くと、指定のURLからファイルを …