Ruby, Sinatra, Twilio로 Whats App 채팅 로봇 구축

채팅 로봇은 어떤 방식으로 인류와 교류하는 프로그램이다.그것들은 매우 기본적이고 키워드나 단어에 응답하거나 Twilio Autopilot 같은 도구를 사용하여 자연 언어 이해(NLU)를 이용하여 더욱 풍부한 체험을 제공하고 복잡한 대화를 구축할 수 있다.
이 강좌에서 우리는 Twilio API for WhatsApp과 루비 웹 프레임워크 Sinatra을 사용하여 Whats App을 위해 채팅 로봇을 구축하는 것이 얼마나 쉬운지 볼 수 있다.다음은 우리가 맺을 대화의 예입니다.

뭐 공부 해요?


이 강좌에서 자신의 WhatsApp 로봇을 구축하려면 다음과 같은 내용이 필요합니다.
  • RubyBundler
  • 설치
  • ngrok 그래서 저희가 expose our local webhook endpoints to the world in style
  • 을 할 수 있습니다.
  • A WhatsApp account
  • Twilio 계정 1개 (만약 당신이 없다면, sign up for a new Twilio account here and receive $10 credit when you upgrade)
  • WhatsApp 샌드박스 구성


    Whats App에서 로봇을 시작하려면 go through an approval process with WhatsApp이 필요합니다. 하지만 Twilio는 build and test your WhatsApp apps using our sandbox을 허용합니다.샌드박스를 구성하는 것부터 시작하여 WhatsApp 계정에 사용합니다.
    Twilio 콘솔은 전체 프로세스를 안내하지만 다음 사항을 수행해야 합니다.
  • 에서 WhatsApp 샌드박스 area of the Twilio console으로 가거나 the console에서 Programmable SMS으로 가거나 WhatsApp으로 가거나
  • 페이지에는 WhatsApp 샌드박스 번호가 포함됩니다.WhatsApp 응용 프로그램을 열고 새로운 메시지를 보내기 시작합니다. 발송 번호는
  • 입니다.
  • 이 페이지에는 "가입"과 "공연한 비둘기 가입"등 두 개의 랜덤 단어가 포함되어 있습니다.메시지를 샌드박스 번호
  • 으로 보내기

    피드백 메시지를 받았을 때, 모래상자를 사용할 준비가 되어 있습니다.

    루비 응용 프로그램 만들기


    새로운 루비 응용 프로그램을 시작하여 로봇을 구축합시다.새 디렉터리를 만드는 것부터 시작합니다.그리고 응용 프로그램에서 새 Gemfile을 초기화하고 우리가 필요로 하는 몇 개의 파일을 만듭니다.
    mkdir whatsapp-bot
    cd whatsapp-bot
    bundle init
    mkdir config
    touch bot.rb config.ru config/env.yml
    
    이 응용 프로그램을 구축하는 데 사용할 gems를 추가하려면:
  • Sinatra, 간단한 웹 프레임워크
  • twilio-ruby gem, 따라서 우리는 TwiML을 생성할 수 있다
  • 나중에 HTTP 요청 을 보낼 수 있도록
  • http.rb
  • Envyable ~ manage environment variables in the application
  • bundle add sinatra twilio-ruby http envyable
    
    config/env.yml은 우리의 응용 프로그램 설정을 저장하고 Envyable은 이를 환경에 불러옵니다.이 프로그램에 설정을 저장하기만 하면 됩니다. Twilio 인증 영패는 Twilio console dashboard에서 찾을 수 있습니다.인증 토큰을 config/env.yml에 추가합니다.
    TWILIO_AUTH_TOKEN: YOUR_TWILIO_AUTH_TOKEN
    
    우리는 config.ru을 사용하여 응용 프로그램과 설정을 불러오고 실행할 것입니다.다음 내용을 config.ru으로 복사합니다.
    require 'bundler'
    Bundler.require
    
    Envyable.load('./config/env.yml')
    
    require './bot.rb'
    run WhatsAppBot
    
    '안녕하세요, 세상!'을 만들어서 모든 것이 예상대로 작동하는지 테스트합시다Sinatra 애플리케이션.bot.rb을 열고 다음 코드를 입력합니다.
    require "sinatra/base"
    
    class WhatsAppBot < Sinatra::Base
      get '/' do
        "Hello World!"
      end
    end
    
    명령줄에서 다음 명령을 사용하여 응용 프로그램을 시작합니다.
    bundle exec rackup config.ru
    
    응용 프로그램은 localhost:9292에서 시작됩니다.브라우저에서 그것을 열면 "안녕하세요, 세상!"이라는 텍스트를 볼 수 있습니다.

    채팅 로봇 구축


    현재 우리의 응용 프로그램이 모두 설치되어 있어서 우리는 우리의 로봇을 구축하기 시작할 수 있다.본고에서 우리는 누군가가 우리의 Whats App 번호에 메시지를 보낼 때 두 개의 키워드에 응답하는 간단한 로봇을 구축할 것이다.우리가 메시지에서 찾을 단어는'개'나'고양이'이며, 우리 로봇은 개나 고양이에 대한 사진과 사실을 무작위로 답장할 것이다.

    네트워크 연결


    WhatsApp의 Twilio API를 사용하면 번호(또는 샌드박스 계정)가 메시지를 받으면 Twilio가 정의한 URL에 webhook request을 보냅니다.이 요청은 메시지에 대한 모든 정보를 포함할 것입니다. 메시지 본문을 포함합니다.
    응용 프로그램은 웹 hook 요청 URL로 설정하여 이 메시지를 수신하고, 메시지에 우리가 찾고 있는 단어가 포함되어 있는지 확인하고, TwiML으로 응답할 수 있는 루트를 정의해야 합니다.TwiML은 응용 프로그램이 Twilio와 통신하는 방법을 설명하는 XML 요소입니다.
    지금까지 우리가 구축한 응용 프로그램은 루트 경로의 웹 훅에 응답할 수 있지만, 이것은 단지 "안녕하세요, 세상!"에 응답하는 것뿐입니다.업데이트를 시작합시다.
    안녕, 세상!/bot 노선을 추가하는 것으로 변경합니다.Twilio Webhook은 기본적으로 POST개의 요청을 처리하기 때문에 이 요청을 처리할 길을 설정합니다.이를 위해, 우리는 하나의 블록을 Sinatra가 정의한 post 방법에 전달할 것이다.
    require "sinatra/base"
    
    class WhatsAppBot < Sinatra::Base
      post '/bot' do
    
      end
    end
    
    다음으로, 우리는 요청 매개 변수에서 메시지체를 추출합니다.메시지의 내용을 단어'dog'와'cat'와 일치시키려고 시도하기 때문에, 본문을 소문자로 번역합니다.
    class WhatsAppBot < Sinatra::Base
      post '/bot' do
        body = params["Body"].downcase
      end
    end
    
    우리는 TwiML을 사용하여 메시지에 응답할 것입니다. twilio-ruby 라이브러리는 우리에게 유용한 클래스를 제공하여 응답을 구축합니다. Twilio::TwiML::MessagingResponse.다음 줄에서 새 응답을 초기화합니다.
    class WhatsAppBot < Sinatra::Base
      post '/bot' do
        body = params["Body"].downcase
        response = Twilio::TwiML::MessagingResponse.new
      end
    end
    
    MessagingResponse 대상은 생성기 모드를 사용하여 응답을 생성합니다.우리는 메시지를 만들고 그 안에 본문과 미디어를 추가할 것이다.우리는 하나의 블록을 Twilio::TwiML::MessagingResponse#message 방법에 전달할 수 있다. 이 방법은 이 원소들을 결과의 <Message> element에 끼워 넣을 것이다.
    class WhatsAppBot < Sinatra::Base
      post '/bot' do
        body = params["Body"].downcase
        response = Twilio::TwiML::MessagingResponse.new
        response.message do |message|
          # nested in a <Message>
        end
      end
    end
    
    지금 우리는 우리의 실제 반응을 세우기 시작해야 한다.우리는 몸에 단어'dog'나'cat'이 포함되어 있는지 확인하고 관련 대답을 추가할 것이다.만약 메시지 본문에 두 단어가 모두 포함되지 않는다면, 우리는 사용자 로봇이 무엇을 응답할 수 있는지 알려주는 기본 응답을 추가해야 한다.
    class WhatsAppBot < Sinatra::Base
      post '/bot' do
        body = params["Body"].downcase
        response = Twilio::TwiML::MessagingResponse.new
        response.message do |message|
          if body.include?("dog")
            # add dog fact and picture to the message
          end
          if body.include?("cat")
            # add cat fact and picture to the message
          end
          if !(body.include?("dog") || body.include?("cat"))
            message.body("I only know about dogs or cats, sorry!")
          end
        end
      end
    end
    
    우리는 현재 개나 고양이의 상황을 이해할 방법이 없다.다행히도 우리는 약간의 API를 사용할 수 있다.개에 대해 우리는 Dog CEO API for picturesthis dog API for facts을 사용할 것이다.고양이는 TheCatAPI for picturescat facts API for facts이 있습니다.우리는 http를 사용할 것이다.우리가 이전에 설치한 rb 라이브러리는 모든 API에 요청을 보냅니다.
    API당 GET개의 요청을 처리합니다.http를 사용하여 get 요청을 보냅니다.rb는 get 모듈에서 HTTP을 호출하여 URL을 문자열로 전달합니다.get 방법은 응답 대상을 되돌려줍니다. to_s을 호출하여 내용을 읽을 수 있습니다.
    응용 프로그램의 미관을 깔끔하게 하기 위해서, 우리는 각 서비스의 API 호출을 DogCat 모듈에 봉인하고, 각 모듈에는 factpicture 방법이 있습니다.
    이 모듈을 bot.rb에 끝까지 추가합니다.
    module Dog
      def self.fact
        response = HTTP.get("https://dog-api.kinduff.com/api/facts")
        JSON.parse(response.to_s)["facts"].first
      end
    
      def self.picture
        response = HTTP.get("https://dog.ceo/api/breeds/image/random")
        JSON.parse(response.to_s)["message"]
      end
    end
    
    module Cat
      def self.fact
        response = HTTP.get("https://catfact.ninja/fact")
        JSON.parse(response.to_s)["fact"]
      end
    
      def self.picture
        response = HTTP.get("https://api.thecatapi.com/v1/images/search")
        JSON.parse(response.to_s).first["url"]
      end
    end
    
    이제 웹 훅 응답에서 이 모듈을 사용할 수 있습니다. 아래와 같습니다.
    class WhatsAppBot < Sinatra::Base
      post '/bot' do
        body = params["Body"].downcase
        response = Twilio::TwiML::MessagingResponse.new
        response.message do |message|
          if body.include?("dog")
            message.body(Dog.fact)
            message.media(Dog.picture)
          end
          if body.include?("cat")
            message.body(Cat.fact)
            message.media(Cat.picture)
          end
          if !(body.include?("dog") || body.include?("cat"))
            message.body("I only know about dogs or cats, sorry!")
          end
        end
      end
    end
    
    Twilio를 통해 Whats App에 메시지를 되돌려주려면 응답하는 내용 형식을'text/xml'으로 설정하고 xml 문자열을 되돌려야 합니다.
    class WhatsAppBot < Sinatra::Base
      post '/bot' do
        body = params["Body"].downcase
        response = Twilio::TwiML::MessagingResponse.new
        response.message do |message|
          if body.include?("dog")
            message.body(Dog.fact)
            message.media(Dog.picture)
          end
          if body.include?("cat")
            message.body(Cat.fact)
            message.media(Cat.picture)
          end
          if !(body.include?("dog") || body.include?("cat"))
            message.body("I only know about dogs or cats, sorry!")
          end
        end
        content_type "text/xml"
        response.to_xml
      end
    end
    
    이것이 바로 웹훅의 모든 코드이지만, 한 가지 더 고려해야 할 것이 있다.

    Webhook 보안


    이것은 웹 훅 요청에서 되돌아오는 가장 관건적인 데이터가 아닐 수도 있지만, 웹 훅을 보호해서 예상 서비스의 요청에만 응답할 수 있도록 하는 것은 좋은 방법입니다.Twilio signs all webhook requests using your auth token, 요청을 검증하기 위해 서명을 검증할 수 있습니다.
    twilio-ruby library provides rack middleware to make validating requests from Twilio 간단: 응용 프로그램에 추가합니다.WhatsAppBot 클래스의 맨 위에 use 방법이 있는 중간부품이 포함되어 있습니다.다음 세 가지 파라미터를 use에 전달합니다: 중간부품 클래스 Rack::TwilioWebhookAuthentication, 인증 영패와 보호할 경로 (이 예에서 "/bot")
    class WhatsAppBot < Sinatra::Base
      use Rack::TwilioWebhookAuthentication, ENV['TWILIO_AUTH_TOKEN'], '/bot'
    
      post '/bot' do
    

    로봇을 WhatsApp에 연결


    명령줄에서 ctrl/cmd + c을 사용하여 응용 프로그램을 중지하고 다음 명령을 사용하여 다시 시작합니다.
    bundle exec rackup config.ru
    
    우리는 지금 Twilio 웹hooks가 우리의 응용 프로그램에 접근할 수 있도록 확보해야 한다.이것이 바로 내가 이 응용 프로그램의 요구에 ngrok을 포함하는 이유이다.ngrok는 컴퓨터에서 실행되는 응용 프로그램에 공공 URL을 연결할 수 있도록 합니다.만약ngrok를 설치하지 않았다면, the instructions to download and install ngrok에 따라 조작하십시오.
    다음 명령을 사용하여 터널을 통해 포트 9292에 도달하는 ngrok를 시작합니다.
    ngrok http 9292
    
    이것은 당신에게ngrok URL을 제공할 것입니다. 현재 이 URL을 Whats App 샌드박스에 추가하여 전송된 메시지를 응용 프로그램에 정할 수 있습니다.

    ngrok URL을 가져오고bot에 경로를 추가합니다. https://YOUR_NGROK_SUBDOMAIN.ngrok.io/bot처럼 보입니다.WhatsApp sandbox admin에서 "메시지를 받았을 때"로 표시된 입력에 URL을 입력하고 구성을 저장합니다.

    당신의 로봇을 테스트하세요


    이제 Whats App 샌드박스 번호로 메시지를 보낼 수 있습니다. 프로그램이 시작되고 개나 고양이의 사진과 사실을 되돌려줍니다.

    더 많은 로봇 구축


    본고에서 우리는 Whats App에 Twilio API를 설정하고 이를 루비 응용 프로그램에 연결하여 개나 고양이의 사진과 사실을 되돌려 주는 방법을 보았다.너는 모든 code for this bot on GitHub을 얻을 수 있다.
    이것은 간단한 로봇이지만 더 많은 로봇을 구축하기 위해 좋은 기초를 제공했다.receiving images from WhatsApp to make a visual bot 또는 sending or receiving location as part of the message을 볼 수 있습니다.이를 바탕으로 Twilio 오토매틱 기기를 이용해 더 스마트한 로봇을 만들 수도 있다.
    당신은 어떤 재미있는 로봇을 만든 적이 있습니까?또 어떤 다른 기능을 원하십니까?댓글이나 위에 알려주세요.

    좋은 웹페이지 즐겨찾기