技術

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

【Angular6】Angularで子コンポーネントから親コンポーネントのメソッドを呼び出す

Angularでアプリを作っている時、子コンポーネントから親コンポーネントのメソ …

no image

wordpressでcommon.min.cssが勝手に読み込まれる

こんにちは wordpressで自作テンプレートを作っている時に、見た目が崩れた …

[XCode] clang: error: linker command failed with exit code 1

どうも中田です 本日はシンプルに。 XCodeでbuild時に発生しました。 エ …

github500

[GitHub] 突然プッシュできなくなったときの確認事項

こんにちは。佐藤です 今回はGitHubに突然プッシュできなくなったときの確認事 …

no image

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

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