Bot météo: DialogFlow + OpenWeather + Python

Formulation du problème



La tâche a été fixée comme suit: écrire un robot de télégramme qui reconnaîtrait les questions sur la météo dans une ville particulière et donnerait des informations sur la météo.



DialogFlow



Le framework DialogFlow, qui intègre déjà le ML, est le mieux adapté à la reconnaissance vocale humaine. Mettons-nous au travail.



Suivez le lien https://dialogflow.cloud.google.com/ , connectez-vous à votre compte Google et accédez à la page de création de bot. Cliquez sur "Créer un nouvel agent" et entrez un nom pour l'agent: "weather-bot". Nous choisissons la langue par défaut russe.



image



L'objet principal avec lequel DialogFlow travaille est les intentions ou les intentions. Lorsque vous interagissez avec un bot, l'une ou l'autre intention fonctionne toujours, et votre tâche en tant que développeur est d'accompagner chaque intention de diverses phrases d'entraînement afin que le bot devine telle ou telle intention aussi correctement que possible à chaque fois.



Alors, allez dans l'onglet "Intentions". Lors de la création d'un bot, deux intentions sont automatiquement créées: "Default Fallback Intent" et "Default Welcome Intent". L'intention de bienvenue est appelée lorsque le bot démarre ou que vous lui écrivez un message de bienvenue. Fallback est appelé dans tous les cas lorsque le bot ne comprend pas ce que vous lui écrivez, c'est-à-dire dans tous les cas où aucune autre intention ne fonctionne. Laissez les intentions par défaut inchangées et cliquez sur "Créer l'intention", en l'appelant "get-weather". C'est avec cette intention que nous continuerons à travailler dans cet article.



image



Accédez à notre intention "get-weather", puis à l'onglet "Phrases d'entraînement" et créez plusieurs phrases d'entraînement, par exemple les suivantes:



image



Notez que DialogFlow détecte automatiquement les villes comme paramètres de localisation. C'est très pratique, car nous passerons ces mêmes paramètres au backend de notre application.



Il reste très peu à faire dans DialogFlow lui-même - pour lui permettre d'interagir avec le backend de notre bot. Pour ce faire, faites défiler vers le bas, développez l'onglet "Réalisation" et cochez "Activer l'appel webhook pour cet intent".



Retour



Commençons par écrire le côté serveur de notre bot. Nous écrirons en Python en conjonction avec Flask. L' API OpenWeather a été choisie pour obtenir des informations météorologiques . Inscrivez-vous sur ce site, puis vous recevrez une CLÉ API par mail - elle sera nécessaire dans notre application. De plus, étant donné que les informations sur la météo dans cette API sont renvoyées par les paramètres de latitude et de longitude - largeur et longitude - nous devons en quelque sorte transformer la ville en sa largeur et en longitude. La bibliothèque geopy Python nous aidera avec cela.



Nous importons tout ce dont nous avons besoin:



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


Créer une application Flask:



app = Flask(__name__)


et insérez notre clé API dans la variable API_KEY:



API_KEY = '<your_API_KEY_here>'


Nous écrivons une route pour le chemin "/":



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


puis la fonction results (), dans laquelle toute la logique du programme sera implémentée:



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


Il reste à ajouter l'itinéraire le long duquel se déroulera la transition vers notre application, appelons-le webhook:



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


et exécutez l'application:



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


Nous l'avons fait!



Et c'est tout?



Pas vraiment. Le programme se trouve sur notre machine locale, mais DialogFlow n'en sait rien. Pour transformer notre machine en un serveur qui deviendra disponible sur Internet, nous avons besoin d'un utilitaire spécial. Ngrok répond à ces exigences . Téléchargez-le, lancez-le et entrez ce qui suit dans la console: "ngrok http 5000". Un lien https apparaîtra, qui doit être copié et placé dans DialogFlow. Copiez, accédez à Fulfillment dans DialogFlow, mettez Webhook dans l'état activé et collez le lien dans le champ résultant. Nous ajoutons l'itinéraire, c'est-à-dire "/ webhook". Vous devriez vous retrouver avec quelque chose de similaire à ce qui suit:



image



Maintenant, nous lançons notre application Python. Il reste très peu de choses - pour connecter l'intégration avec Telegram. Allez dans l'onglet "Intégrations", sélectionnez télégramme, puis suivez les instructions pour obtenir un token, insérez un token, et voilà - l'application est prête! Reste à le tester:



image



j'espère que cet article vous a été utile et vous encouragera à expérimenter par vous-même dans ce domaine. Le code du projet est disponible ici .



All Articles