Criar um bot meteorológico do WhatsApp geolocalizado com Ruby, Sinatra e Twilio

March 18, 2020
Escrito por
Phil Nash
Twilion

Criar um bot meteorológico do WhatsApp geolocalizado com Ruby, Sinatra e Twilio

Vimos como escrever um chatbot de texto usando a API da Twilio para WhatsApp com o Ruby, mas o WhatsApp também oferece suporte ao envio e recebimento de dados de localização por meio de sua API. Nesta publicação, veremos como criar um bot do WhatsApp que possa receber e responder a mensagens de localização.

Vamos criar um bot meteorológico para que você possa enviar sua localização ao bot e obter a previsão meteorológica da sua região.

De que você vai precisar

Para codificar acompanhando esta publicação e criar seu próprio bot do WhatsApp com reconhecimento de localização, você precisará de:

Como configurar o sandbox do WhatsApp

Se você quiser iniciar um bot no WhatsApp, precisará de aprovação do WhatsApp. No entanto, a Twilio permite que você crie e teste seus bots do WhatsApp usando nosso sandbox. Vamos começar configurando o sandbox para usar com sua conta do WhatsApp.

Se você ainda não configurou seu sandbox do WhatsApp, acesse o Sandbox do WhatsApp no console da Twilio e siga as instruções em minha publicação anterior. Você estará pronto para continuar assim que receber uma mensagem de volta pelo WhatsApp.

Primeira tela da sandbox da Twilio para WhatsApp. Ele pede que você envie uma mensagem para o número de WhatsApp +1 415 523 8886 com um código que começa com 'join'.

Como configurar o aplicativo Ruby

No final da última publicação, tínhamos um bom aplicativo base com o qual podemos começar a trabalhar agora. Para obter essa configuração, basta cloná-la do GitHub e migrá-la para o diretório:

git clone https://github.com/philnash/ruby-whatsapp-bots.git
cd ruby-whatsapp-bots

Instale as dependências:

bundle install

Copie config/env.yml.example para config/env.yml e preencha seu Auth Token (token de autenticação) da Twilio (disponível no Console da Twilio).

Copie o diretório base para um diretório chamado location_bot.

cp -R base location_bot

Abra location_bot/config.ru e altere a última linha para:

run LocationBot

Abra location_bot/bot.rb. Altere o nome da classe para LocationBot e confira o conteúdo atual:

require "sinatra/base"

class LocationBot < Sinatra::Base
  use Rack::TwilioWebhookAuthentication, ENV['TWILIO_AUTH_TOKEN'], '/bot'

  post '/bot' do
    response = Twilio::TwiML::MessagingResponse.new
    response.message body: "This is the base bot. Edit me to make your own bot."
    content_type "text/xml"
    response.to_xml
  end
end

Isso configura um endpoint em /bot para receber webhooks de entrada da Twilio e responder com uma mensagem em uma resposta TwiML. Ele também protege o endpoint contra intrusos pela validação da assinatura. Execute o aplicativo com:

bundle exec rackup location_bot/config.ru

Tudo estará pronto para funcionar assim que o servidor de aplicativos inicializar.

Como receber mensagens de localização no WhatsApp

Sempre que um usuário enviar uma mensagem para o seu número de WhatsApp, a Twilio o transformará em um webhook para o endpoint que você configurou no console. O webhook é uma solicitação HTTP com todos os detalhes sobre a mensagem de entrada. Anteriormente, trabalhamos com o corpo da mensagem, mas desta vez queremos lidar com mensagens de localização.

O WhatsApp permite que um usuário envie texto ou localização, mas não ambos ao mesmo tempo. Quando um usuário envia uma localização, o webhook de entrada incluirá os parâmetros Latitute e Longitude. Você também pode receber os parâmetros Label e Address se o usuário decidir compartilhar uma localização nomeada. Podemos acessar todos esses bits de dados no Sinatra por meio do hash params.

Podemos dar uma olhada nesses dados após o logout. Adicione o seguinte a location_bot/bot.rb:

  post '/bot' do
    puts "Latitude: #{params["Latitude"]}"
    puts "Longitude: #{params["Longitude"]}"
    puts "Label: #{params["Label"]}"
    puts "Address: #{params["Address"]}"
    response = Twilio::TwiML::MessagingResponse.new
    response.message body: "This is the base bot. Edit me to make your own bot."
    content_type "text/xml"
    response.to_xml
  end

Reinicie o aplicativo ou execute-o com:

bundle exec rackup location_bot/config.ru

Para testar isso, precisaremos abrir um túnel para nosso servidor em execução na máquina. Eu recomendo usar o ngrok para isso. Se você não o tiver instalado, siga as instruções em ngrok.com e, quando estiver pronto, execute:

ngrok http 9292

Isso abrirá um túnel apontado para a porta 9292 do localhost, onde o Sinatra estará hospedado por padrão usando rackup. Você encontrará um URL público do ngrok que agora aponta para seu aplicativo local. Abra o WhatsApp Sandbox no Console da Twilio e insira esse URL mais o caminho /bot no campo When a message comes in (Quando uma mensagem é recebida).

Página de configuração da sandbox da Twilio para WhatsApp. Você deve adicionar o URL do ngrok no campo  &#x27;When a message comes in&#x27; (Quando uma mensagem é recebida).

Envie a mensagem de localização para o número do Sandbox, pressionando o botão plus (mais) e escolhendo a localização a ser compartilhada.

No aplicativo WhatsApp, pressione o botão plus (mais) ao lado do espaço reservado para entrada de texto e escolha o local no menu.

No terminal, você verá as informações de localização.

Uma janela de terminal mostrando os registros da solicitação. Enviei uma mensagem do escritório do Twilio e ela mostra a latitude, a longitude, o rótulo e o endereço.

Vamos usar esses dados de localização para retornar um relatório de clima localizado. Para esta publicação do blog, usaremos a API Dark Sky. É uma API simples, e você pode se inscrever para obter uma chave de API gratuita aqui. Depois de obter sua chave de API, abra config/env.yml e adicione a chave de API Dark Sky abaixo do seu Auth Token (token de autenticação) da Twilio.

TWILIO_AUTH_TOKEN: YOUR_TWILIO_AUTH_TOKEN
DARK_SKY_API_KEY: YOUR_DARK_SKY_API_KEY

Vamos escrever uma pequena classe que pode fazer solicitações HTTP à API, a fim de encontrar o clima da latitude e longitude que estamos recebendo da mensagem de localização do WhatsApp.

Como chamar a API Dark Sky

O formato de URL da API Dark Sky tem a seguinte aparência:

https://api.darksky.net/forecast/{API_KEY}/{LATITUDE},{LONGITUDE}?{OPTIONS}

Na última publicação do blog, usamos a biblioteca http.rb para fazer solicitações a várias APIs sobre cães e gatos. Podemos usá-la novamente para fazer solicitações à API Dark Sky. Portanto, vamos construir uma pequena classe para isso. Na parte inferior de location_bot/bot.rb, adicione o seguinte:

class DarkSky
  def initialize(api_key)
    @api_key = api_key
  end

  BASE_URL = "https://api.darksky.net/forecast/"

  def forecast(lat, long)

  end
end

Este é um bom ponto de partida que nos dá uma classe que podemos inicializar com nossa chave de API. Ele armazenou o URL base da API, e nós temos um método de previsão que usa a latitude e a longitude. Complete o método de previsão com o seguinte:

  def forecast(lat, long)
    url_options = URI.encode_www_form({ :exclude => "minutely,daily,alerts,flags", :units => "si" })
    url = "#{BASE_URL}#{@api_key}/#{lat},#{long}?#{url_options}"
    response = HTTP.get(url)
    result = JSON.parse(response.to_s)
  end

A primeira linha do método inclui alguns parâmetros de solicitação. Nesse caso, estamos solicitando unidades SI (métricas) para as respostas e estamos excluindo alguns detalhes da resposta. Em seguida, criamos o URL que codifica os parâmetros de consulta usando o URI#encode_www_form método da biblioteca padrão. Passamos o URL para o método HTTP.get para obter uma resposta e, em seguida, analisamos esse corpo de resposta como JSON, retornando o resultado.

Agora, podemos usar essa classe em nosso bot.

Como enviar uma previsão do tempo com base na localização do WhatsApp

Retorne ao código que responde à mensagem de WhatsApp recebida. Agora, queremos saber se a mensagem recebida é uma mensagem de localização verificando os parâmetros Latitude e Longitude. Se for o caso, faremos a chamada para a API Dark Sky usando a classe que acabamos de escrever. Caso contrário, retornaremos uma mensagem solicitando a localização do usuário.

Comece removendo a depuração das chamadas puts e, em seguida, crie o condicional.

  post '/bot' do
    response = Twilio::TwiML::MessagingResponse.new

    if params["Latitude"] && params["Longitude"]
      dark_sky = DarkSky.new(ENV['DARK_SKY_API_KEY'])
      forecast = dark_sky.forecast(params["Latitude"], params["Longitude"])
      forecast_message = "It is currently #{forecast["currently"]["summary"].downcase} with a temperature of #{forecast["currently"]["temperature"].to_s.split(".").first}°C.\nForecast: #{forecast["hourly"]["summary"].downcase}"
      response.message body: forecast_message
    else
      response.message body: "To get a weather forecast, send your location from WhatsApp."
    end
    content_type "text/xml"
    response.to_xml
  end

Acima, usamos a previsão retornada pela API Dark Sky para criar uma mensagem composta pelo resumo do clima atual e pela temperatura seguida pelo resumo da previsão de hora em hora. Isso se parece com:

Enviei uma mensagem de localização do escritório da Twilio em Melbourne e recebi a seguinte resposta: &#x27;It is currently clear with a temperature of 25°C. Forecast: partly cloudy throughout the day.&#x27; (Está claro com uma temperatura de 25 ºC. Previsão: dia parcialmente nublado.)

Sucesso! Recebemos uma mensagem de localização do WhatsApp e a transformamos em uma previsão do tempo para esse local.

Como potencializar os bots com a localização

A localização pode ser extremamente útil com bots, e esse é um recurso que a API da Twilio para WhatsApp oferece em outros canais, como SMS. Se você quiser ver o código inteiro desse bot e de outros, confira o repositório do GitHub aqui. Você pode encontrar o bot de localização no diretório de localização.

Há muitas outras coisas que você pode fazer com um bot com reconhecimento de localização. Você pode encontrar lojas próximas, enviar direções ou fornecer insights locais para seus usuários. Eu adoraria ouvir as ideias que você também tem para bots baseados em localização. Deixe suas ideias nos comentários ou no Twitter em @luisleao.

Este artigo foi traduzido do original "Build a location-aware WhatsApp weather bot with Ruby, Sinatra and Twilio". Enquanto melhoramos nossos processos de tradução, adoraríamos receber seus comentários em help@twilio.com - contribuições valiosas podem render brindes da Twilio.