Ruby, Sinatra, Twilio로 Whats App 채팅 로봇 구축
이 강좌에서 우리는 Twilio API for WhatsApp과 루비 웹 프레임워크 Sinatra을 사용하여 Whats App을 위해 채팅 로봇을 구축하는 것이 얼마나 쉬운지 볼 수 있다.다음은 우리가 맺을 대화의 예입니다.
뭐 공부 해요?
이 강좌에서 자신의 WhatsApp 로봇을 구축하려면 다음과 같은 내용이 필요합니다.
WhatsApp 샌드박스 구성
Whats App에서 로봇을 시작하려면 go through an approval process with WhatsApp이 필요합니다. 하지만 Twilio는 build and test your WhatsApp apps using our sandbox을 허용합니다.샌드박스를 구성하는 것부터 시작하여 WhatsApp 계정에 사용합니다.
Twilio 콘솔은 전체 프로세스를 안내하지만 다음 사항을 수행해야 합니다.
피드백 메시지를 받았을 때, 모래상자를 사용할 준비가 되어 있습니다.
루비 응용 프로그램 만들기
새로운 루비 응용 프로그램을 시작하여 로봇을 구축합시다.새 디렉터리를 만드는 것부터 시작합니다.그리고 응용 프로그램에서 새
Gemfile
을 초기화하고 우리가 필요로 하는 몇 개의 파일을 만듭니다.mkdir whatsapp-bot
cd whatsapp-bot
bundle init
mkdir config
touch bot.rb config.ru config/env.yml
이 응용 프로그램을 구축하는 데 사용할 gems를 추가하려면: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 pictures과 this dog API for facts을 사용할 것이다.고양이는 TheCatAPI for pictures과 cat facts API for facts이 있습니다.우리는 http를 사용할 것이다.우리가 이전에 설치한 rb 라이브러리는 모든 API에 요청을 보냅니다.API당
GET
개의 요청을 처리합니다.http를 사용하여 get 요청을 보냅니다.rb는 get
모듈에서 HTTP
을 호출하여 URL을 문자열로 전달합니다.get
방법은 응답 대상을 되돌려줍니다. to_s
을 호출하여 내용을 읽을 수 있습니다.응용 프로그램의 미관을 깔끔하게 하기 위해서, 우리는 각 서비스의 API 호출을
Dog
과 Cat
모듈에 봉인하고, 각 모듈에는 fact
과 picture
방법이 있습니다.이 모듈을
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 오토매틱 기기를 이용해 더 스마트한 로봇을 만들 수도 있다.
당신은 어떤 재미있는 로봇을 만든 적이 있습니까?또 어떤 다른 기능을 원하십니까?댓글이나 위에 알려주세요.
Reference
이 문제에 관하여(Ruby, Sinatra, Twilio로 Whats App 채팅 로봇 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/twilio/build-a-whatsapp-chatbot-with-ruby-sinatra-and-twilio-1fip텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)