Bot do clima: DialogFlow + OpenWeather + Python

Formulação do problema



A tarefa foi definida da seguinte forma: escrever um bot de telegrama que reconheceria perguntas sobre o tempo em uma determinada cidade e forneceria informações sobre o tempo.



DialogFlow



A estrutura DialogFlow, que já tem ML integrado, é a mais adequada para reconhecimento de fala humana. Vamos ao trabalho.



Siga o link https://dialogflow.cloud.google.com/ , faça login em sua conta do Google e vá para a página de criação de bot. Clique em "Criar novo agente" e digite um nome para o agente: "weather-bot". Escolhemos o idioma padrão russo.



imagem



O principal objeto com o qual DialogFlow trabalha são intents ou intents. Ao interagir com um bot, esta ou aquela intenção sempre funciona, e a tarefa de você como desenvolvedor é acompanhar cada intenção com várias frases de treinamento para que o bot adivinhe esta ou aquela intenção da maneira mais correta possível a cada vez.



Então, vá para a guia "Intents". Ao criar um bot, duas intents são criadas automaticamente: "Default Fallback Intent" e "Default Welcome Intent". Welcome Intent é chamado quando o bot é iniciado ou você escreve uma mensagem de boas-vindas para ele. O fallback é chamado em todos os casos em que o bot não entende o que você está escrevendo para ele, ou seja, em todos os casos quando nenhuma outra intenção funciona. Deixe as intents padrão inalteradas e clique em "Create intent", chamando-a de "get-weather". É com essa intenção que continuaremos a trabalhar neste artigo.



imagem



Vá para a nossa intenção "get-weather", depois para a guia "Training Frases" e crie várias frases de treinamento, por exemplo, as seguintes:



imagem



Observe que o DialogFlow detecta automaticamente as cidades como parâmetros de localização. Isso é muito conveniente, pois passaremos esses mesmos parâmetros para o backend de nosso aplicativo.



Resta muito pouco a fazer no próprio DialogFlow - permitir que webhooks interajam com o backend de nosso bot. Para fazer isso, role para baixo até o final, expanda a guia "Fulfillment" e marque "Habilitar chamada de webhook para este intent".



Costas



Vamos começar a escrever o lado do servidor do nosso bot. Vamos escrever em Python em conjunto com Flask. A API OpenWeather foi escolhida para obter informações sobre o clima . Cadastre-se neste site, então você receberá uma API KEY pelo correio - será necessária em nosso aplicativo. Além disso, como as informações sobre o clima nesta API são retornadas pelos parâmetros de latitude e longitude - largura e longitude - precisamos de alguma forma transformar a cidade em sua largura e longitude. A biblioteca Python geopy nos ajudará com isso.



Importamos tudo o que precisamos:



from flask import Flask, request, make_response, jsonify
import requests
import json
from geopy.geocoders import Nominatim


Crie o aplicativo Flask:



app = Flask(__name__)


e insira nossa API KEY na variável API_KEY:



API_KEY = '<your_API_KEY_here>'


Escrevemos uma rota para o caminho "/":



@app.route('/')
def index():
    return 'Hello World!'


e então a função results (), na qual toda a lógica do programa será implementada:



def results():
    req = request.get_json(force=True)

    action = req.get('queryResult').get('action')

    result = req.get("queryResult")
    parameters = result.get("parameters")

    if parameters.get('location').get('city'):
        geolocator = Nominatim(user_agent='weather-bot')
        location = geolocator.geocode(parameters.get('location').get('city'))
        lat = location.latitude
        long = location.longitude
        weather_req = requests.get('https://api.openweathermap.org/data/2.5/onecall?lat={}&lon={}&appid={}'.format(lat, long, API_KEY))
        current_weather = json.loads(weather_req.text)['current']
        temp = round(current_weather['temp'] - 273.15)
        feels_like = round(current_weather['feels_like'] - 273.15)
        clouds = current_weather['clouds']
        wind_speed = current_weather['wind_speed']

    return {'fulfillmentText': '   - {} ,   {} ,  - {}%,   - {}/'.format(str(temp), str(feels_like), str(clouds), str(wind_speed))}


Resta adicionar a rota ao longo da qual será feita a transição para nosso aplicativo, vamos chamá-lo de webhook:



@app.route('/webhook', methods=['GET', 'POST'])
def webhook():
    return make_response(jsonify(results()))


e execute o aplicativo:



if __name__ == '__main__':
   app.run(debug=True)


Conseguimos!



E isso é tudo?



Na verdade não. O programa está em nossa máquina local, mas DialogFlow não sabe nada sobre ele. Para transformar nossa máquina em um servidor que ficará disponível na Internet, precisamos de um utilitário especial. Ngrok atende a esses requisitos . Faça o download, execute-o e digite o seguinte no console: "ngrok http 5000". Um link https aparecerá, que deve ser copiado e colocado no DialogFlow. Copie, vá para Fulfillment no DialogFlow, defina o Webhook como habilitado e cole o link no campo resultante. Adicionamos a rota, ou seja, "/ webhook". Você deve acabar com algo semelhante ao seguinte:



imagem



Agora vamos lançar nosso aplicativo Python. Resta muito pouco - para conectar a integração com o Telegram. Vá para a guia "Integrações", selecione o telegrama, siga as instruções para obter o token, insira o token e voila - o aplicativo está pronto! Resta testá-lo:



imagem



espero que este artigo tenha sido útil para você e o incentive a fazer experiências por conta própria nessa área. O código do projeto está disponível aqui .



All Articles