Bot meteorológico: DialogFlow + OpenWeather + Python

Formulación del problema



La tarea se estableció de la siguiente manera: escribir un bot de telegrama que reconozca preguntas sobre el clima hoy en una ciudad en particular y brinde información sobre el clima.



DialogFlow



El marco DialogFlow, que ya tiene ML integrado, es el más adecuado para el reconocimiento de voz humano. Pongámonos a trabajar.



Siga el enlace https://dialogflow.cloud.google.com/ , inicie sesión en su cuenta de Google y vaya a la página de creación de bot. Haga clic en "Crear nuevo agente" e ingrese el nombre del agente: "weather-bot". Elegimos el idioma predeterminado ruso.



imagen



El objeto principal con el que trabaja DialogFlow son las intenciones o intenciones. Al interactuar con un bot, esta o aquella intención siempre funciona, y la tarea de usted como desarrollador es acompañar cada intención con varias frases de entrenamiento para que el bot adivine esta o aquella intención de la manera más correcta posible cada vez.



Entonces, vaya a la pestaña "Intenciones". Al crear un bot, se crean automáticamente dos intenciones: "Intención alternativa predeterminada" e "Intención de bienvenida predeterminada". La intención de bienvenida se llama cuando el bot se inicia o cuando le escribe un mensaje de bienvenida. Se llama Fallback en todos los casos cuando el bot no comprende lo que le está escribiendo, es decir, en todos los casos cuando no funciona ninguna otra intención. Deje los intentos predeterminados sin cambios y haga clic en "Crear intento", llamándolo "obtener clima". Es con esta intención que seguiremos trabajando en este artículo.



imagen



Vaya a nuestra intención "obtener información meteorológica", luego a la pestaña "Frases de entrenamiento" y cree varias frases de entrenamiento, por ejemplo, las siguientes:



imagen



Tenga en cuenta que DialogFlow detecta automáticamente ciudades como parámetros de ubicación. Esto es muy conveniente, ya que pasaremos estos mismos parámetros al backend de nuestra aplicación.



Queda muy poco por hacer en DialogFlow en sí, para permitir que los webhooks interactúen con el backend de nuestro bot. Para hacer esto, desplácese hasta la parte inferior, expanda la pestaña "Cumplimiento" y marque la casilla "Habilitar llamada de webhook para esta intención".



atrás



Comencemos a escribir el lado del servidor de nuestro bot. Escribiremos en Python junto con Flask. Se eligió la API de OpenWeather para obtener información meteorológica . Regístrese en este sitio, luego recibirá una CLAVE API por correo electrónico; será necesaria en nuestra aplicación. Además, dado que la información sobre el clima en esta API es devuelta por los parámetros de latitud y longitud (ancho y longitud), necesitamos transformar de alguna manera la ciudad en su ancho y longitud. La biblioteca geopy Python nos ayudará con esto.



Importamos todo lo que necesitamos:



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


Crear aplicación de matraz:



app = Flask(__name__)


e inserte nuestra API KEY en la variable API_KEY:



API_KEY = '<your_API_KEY_here>'


Escribimos una ruta para la ruta "/":



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


y luego la función results (), en la que se implementará toda la lógica del programa:



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))}


Queda por agregar la ruta por la que será la transición a nuestra aplicación, llamémoslo webhook:



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


y ejecuta la aplicación:



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


¡Lo hicimos!



¿Y es todo?



Realmente no. El programa está en nuestra máquina local, pero DialogFlow no sabe nada al respecto. Para convertir nuestra máquina en un servidor que estará disponible en Internet, necesitamos una utilidad especial. Ngrok cumple con estos requisitos . Descárguelo, ejecútelo e ingrese lo siguiente en la consola: "ngrok http 5000". Aparecerá un enlace https, que debe copiarse y colocarse en DialogFlow. Copie, vaya a Fulfillment en DialogFlow, configure el Webhook como habilitado y pegue el enlace en el campo resultante. Agregamos la ruta, es decir "/ webhook". Debería terminar con algo similar a lo siguiente:



imagen



Ahora lanzamos nuestra aplicación Python. Queda muy poco para conectar la integración con Telegram. Vaya a la pestaña "Integraciones", seleccione telegrama, luego siga las instrucciones para obtener un token, inserte un token y listo, ¡la aplicación está lista! Queda por probarlo:



imagen



espero que este artículo te haya sido útil y te anime a experimentar por tu cuenta en esta área. El código del proyecto está disponible aquí .



All Articles