Rails Heroku × linebot Repl-AI로 대화할 수 있는 bot를 만들어 보았다
모든 소스는 다음과 같습니다.
htps : // 기주 b. 코 m / 히라 노이 / 쿠이다 오레 _ 보트
INDEX
이 기사의 목표
Rails Heroku × lineapi로 앵무새 돌려주는 bot 만들기
ぃ tp // 이 m/아라하비카/있어 ms/98에 3d0d5b65269386dc4
Rails Heroku × Repl-AI로 대화할 수 있는 bot 만들기
h tps : / / 레 pl - 아이. jp / 레후 렌세 s / 레기 st 라치온. HTML
h tps : // 레 pl. jp/레후오렌세s/아아그구에. HTML
/lib/repl_ai_client.rb
require "faraday"
require "faraday_middleware"
require "json"
require "pp"
class ReplAiClient
URL_HEAD = 'https://api.repl-ai.jp'
def initialize(api_key, bot_id = 'normal', scenario ='greeting')
@api_key = api_key
@bot_id = bot_id
@scenario = scenario
end
def get_user_id
res = post('/v1/registration',{
botId: @bot_id
})
res.body
end
def get_message(user_id, message, flag = true)
res = post('/v1/dialogue',{
appUserId: user_id,
botId: @bot_id,
voiceText: message,
initTalkingFlag: flag,
initTopicId: @scenario,
appRecvTime: Time.now.strftime('%Y/%m/%d %H:%M:%S'),
appSendTime: Time.now.strftime('%Y/%m/%d %H:%M:%S'),
})
res.body
end
private
def post(path, data)
client = Faraday.new(:url => URL_HEAD) do |conn|
conn.request :json
conn.response :json, :content_type => /\bjson$/
conn.adapter Faraday.default_adapter
# conn.proxy @proxy
end
res = client.post do |request|
request.url path
request.headers = {
'Content-type' => 'application/json; charset=UTF-8',
'x-api-key' => @api_key
}
request.body = data
end
res
end
end
/app/controllers/webhook_controller.rb
class WebhookController < ApplicationController
protect_from_forgery except: :callback # CSRF対策無効化
CHANNEL_ID = ENV['LINE_CHANNEL_ID']
CHANNEL_SECRET = ENV['LINE_CHANNEL_SECRET']
CHANNEL_MID = ENV['LINE_CHANNEL_MID']
OUTBOUND_PROXY = ENV['LINE_OUTBOUND_PROXY']
REPL_API_KEY = ENV['REPL_API_KEY']
def callback
unless is_validate_signature
render :nothing => true, status: 470
end
result = params[:result][0]
logger.info({from_line: result})
req_message = result['content']['text']
from_mid = result['content']['from']
repl_client = ReplAiClient.new(REPL_API_KEY)
res_message = repl_client.get_message('TODO:USER_IDを入れる', req_message)
client = LineClient.new(CHANNEL_ID, CHANNEL_SECRET, CHANNEL_MID, OUTBOUND_PROXY)
res = client.send([from_mid], res_message['systemText']['expression'])
if res.status == 200
logger.info({success: res})
else
logger.info({fail: res})
end
render :nothing => true, status: :ok
end
private
# LINEからのアクセスか確認.
# 認証に成功すればtrueを返す。
# ref) https://developers.line.me/bot-api/getting-started-with-bot-api-trial#signature_validation
def is_validate_signature
signature = request.headers["X-LINE-ChannelSignature"]
http_request_body = request.raw_post
hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, CHANNEL_SECRET, http_request_body)
signature_answer = Base64.strict_encode64(hash)
signature == signature_answer
end
end
terminal에서
# 定数を設定する
$ heroku config:add REPL_API_KEY="XXXXXXXXXXXXXXXXXXX"
※주의
Repl-AI의 대화를 오사카 밸브로 변환하여 돌려주는 bot를 만든다
h tp // w w. 게이오시치에 s. 이. jp / 허리를 d / 4078 / 오사카 / 오사카 js. HTML
/lib/convert_to_osaka.rb
require 'yaml'
class ConvertToOsaka
def initialize(tm)
@tm = tm
end
def convert
d = YAML.load_file("#{Rails.root}/lib/osaka.yml")
# 文章にhashのキーが含まれているかを確認する
d.each do |k, v|
# 一致すればvalueに置換する
@tm.gsub!(k, v)
end
@tm
end
end
/lib/osaka.yml
ありがとうございました: おおきに
あなた: あんさん
あんな: あないな
りますので: るさかいに
りますから: るさかいに
あります: あるんや
あるいは: せやなかったら
或いは: せやなかったら
ありません: おまへん
ありました: おました
いない: おらへん
いまどき: きょうび
いわゆる: なんちうか,ようみなはんいわはるとこの
・
・
・ # 長いので割愛
/app/controllers/webhook_controller.rb
# 以下の部分を編集
res = client.send([from_mid], ConvertToOsaka.new(res_message['systemText']['expression']).convert)
이런 느낌입니다. 아직 개선의 여지가 있지만 일단 이것으로 움직입니다.
Reference
이 문제에 관하여(Rails Heroku × linebot Repl-AI로 대화할 수 있는 bot를 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hiranoi/items/604e04638558337fc0bc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)