Rails Heroku × linebot Repl-AI로 대화할 수 있는 bot를 만들어 보았다

해커슨으로 움직일 수 있었기 때문에 메모.
모든 소스는 다음과 같습니다.
htps : // 기주 b. 코 m / 히라 노이 / 쿠이다 오레 _ 보트

INDEX


  • 이 기사의 목표
  • Rails Heroku × lineapi로 앵무새 돌려주는 bot를 만든다
  • Rails Heroku × Repl-AI로 대화할 수 있는 bot를 만든다
  • Repl-AI의 대화를 오사카 밸브로 변환하여 돌려주는 bot를 만든다

  • 이 기사의 목표


  • 이것을 만든다(참가자 모집시에 만든 자료)
  • 이렇게 된다(대화가 성립되지 않은 것은 Repl-AI의 튜닝을 하고 있지 않기 때문에,,,)

  • 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"
    

    ※주의
  • Hackason 시간의 편의상, 유저마다 ID 지불하는 처리를 실시하고 있지 않습니다. (LINE의 ID와 Repl-AI의 ID를 연결하는 것이 귀찮았다) 그 때문에, 유저 A의 대화 정보가 유저 B에게도 계승됩니다.

  • Repl-AI의 대화를 오사카 밸브로 변환하여 돌려주는 bot를 만든다


  • 여기를 참고로 Ruby로 변환하기
    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
    
  • 센스는 없지만, 표준어→오사카 밸브의 대응표는 Hash로 가진다

  • /lib/osaka.yml
    ありがとうございました: おおきに
    あなた: あんさん
    あんな: あないな
    りますので: るさかいに
    りますから: るさかいに
    あります: あるんや
    あるいは: せやなかったら
    或いは: せやなかったら
    ありません: おまへん
    ありました: おました
    いない: おらへん
    いまどき: きょうび
    いわゆる: なんちうか,ようみなはんいわはるとこの
    
    
     # 長いので割愛
    

    /app/controllers/webhook_controller.rb
    # 以下の部分を編集
    res = client.send([from_mid], ConvertToOsaka.new(res_message['systemText']['expression']).convert)
    

    이런 느낌입니다. 아직 개선의 여지가 있지만 일단 이것으로 움직입니다.

    좋은 웹페이지 즐겨찾기