技術

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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

どうも中田です。 Let’s Encryptって無料だし便利ですよね …

[Angular] @NgModuleをざっくりと

どうも中田です。 最近社内でAngularの波が起こってるので そのビッグウェー …

[Ionic]UnhandledPromiseRejectionWarning: CordovaError: Requirements check failed for JDK 1.8 or greater

こんにちわ。田中です。 参画しているプロジェクトで使っているのもあって、現在Io …

no image

【AWS】nginx/rails/mysqlをインストール

どうも、中田です。 最近AWSにテストサーバを立ち上げて検証したり、 お客様に一 …

rails_logo

[Rails] image_tagを使わずにassets内の画像を指定する方法

こんにちは。さとうです。 今回はimage_tagを使わずにassets内の画像 …