技術

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

関連記事

画像生成マシーン「MakeGirlsMoe」の10連結果

女の子の萌え画像を作ってくれる「MakeGirlsMoe」なるものが作られたよう …

[Xcode] SDK Version Issue – This app was built with the iOS 12.0 SDK. Starting March 2019, all iOS apps submitted to the App Store must be built with the iOS 12.1 SDK or later, included in Xcode 10.1 or later.

こんにちは。たなかです。 2019年、ブログ初更新になります。今年もよろしくお願 …

no image

VivaldiのWEBパネルに登録して便利だったサイトを紹介する

こんばんは VivaldiのWEBパネルはとても便利です。 今回はWEBパネルに …

no image

【Android/ionic】これさえやればOK!アプリ公開への道

どうも、中田です。 ionicでHTML5/CSSハイブリッドアプリ開発してるん …

LINE BOTを無料で試してみました。heroku + Rails

こんばんは たまにはエンジニアっぽいところを見せようと思い、遅ればせながら、流行 …