Wetterbot: DialogFlow + OpenWeather + Python

Formulierung des Problems



Die Aufgabe wurde wie folgt gestellt: Schreiben Sie einen Telegramm-Bot, der Fragen zum heutigen Wetter in einer bestimmten Stadt erkennt und Informationen über das Wetter herausgibt.



DialogFlow



Das DialogFlow-Framework, in das bereits ML integriert ist, eignet sich am besten für die Erkennung menschlicher Sprache. Lass uns zur Arbeit gehen.



Folgen Sie dem Link https://dialogflow.cloud.google.com/ , melden Sie sich bei Ihrem Google-Konto an und rufen Sie die Seite zur Bot-Erstellung auf. Klicken Sie auf "Neuen Agenten erstellen" und geben Sie den Namen des Agenten ein: "Wetterbot". Wir wählen die Standardsprache Russisch.



Bild



Das Hauptobjekt, mit dem DialogFlow arbeitet, sind Absichten oder Absichten. Bei der Interaktion mit einem Bot funktioniert immer die eine oder andere Absicht, und Ihre Aufgabe als Entwickler besteht darin, jede Absicht mit verschiedenen Trainingsphrasen zu begleiten, damit der Bot diese oder jene Absicht jedes Mal so richtig wie möglich errät.



Gehen Sie also zur Registerkarte "Absichten". Beim Erstellen eines Bots werden automatisch zwei Absichten erstellt: "Standard-Fallback-Absicht" und "Standard-Begrüßungsabsicht". Welcome Intent wird aufgerufen, wenn der Bot startet oder Sie ihm eine Willkommensnachricht schreiben. Fallback wird in allen Fällen aufgerufen, wenn der Bot nicht versteht, was Sie darauf schreiben, d. H. in allen Fällen, in denen keine andere Absicht funktioniert. Lassen Sie die Standardabsichten unverändert und klicken Sie auf "Absicht erstellen" und nennen Sie es "Get-Weather". Mit dieser Absicht werden wir in diesem Artikel weiterarbeiten.



Bild



Gehen Sie zu unserer Absicht "Wetter abrufen", dann zur Registerkarte "Trainingsphrasen" und erstellen Sie mehrere Trainingsphrasen, z. B. die folgenden:



Bild



Beachten Sie, dass DialogFlow Städte automatisch als Standortparameter erkennt. Dies ist sehr praktisch, da wir genau diese Parameter an das Backend unserer Anwendung übergeben.



In DialogFlow selbst bleibt nur noch sehr wenig zu tun, damit Webhooks mit dem Backend unseres Bots interagieren können. Scrollen Sie dazu nach unten, erweitern Sie die Registerkarte "Erfüllung" und aktivieren Sie das Kontrollkästchen "Webhook-Aufruf für diese Absicht aktivieren".



Zurück



Beginnen wir mit dem Schreiben der Serverseite unseres Bots. Wir werden in Python in Verbindung mit Flask schreiben. Die OpenWeather-API wurde ausgewählt, um Wetterinformationen abzurufen . Registrieren Sie sich auf dieser Website, dann erhalten Sie per E-Mail einen API-SCHLÜSSEL - dieser wird in unserer Anwendung benötigt. Da Informationen über das Wetter in dieser API von den Breiten- und Längengradparametern - Breite und Länge - zurückgegeben werden, müssen wir die Stadt außerdem irgendwie in ihre Breite und Länge umwandeln. Die Geopy Python-Bibliothek hilft uns dabei.



Wir importieren alles was wir brauchen:



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


Kolbenanwendung erstellen:



app = Flask(__name__)


und fügen Sie unseren API-SCHLÜSSEL in die Variable API_KEY ein:



API_KEY = '<your_API_KEY_here>'


Wir schreiben eine Route für den "/" Pfad:



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


und dann die Funktion results (), in der die gesamte Logik des Programms implementiert wird:



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


Es bleibt noch die Route hinzuzufügen, auf der der Übergang zu unserer Anwendung stattfinden wird. Nennen wir es Webhook:



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


und führen Sie die Anwendung aus:



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


Wir haben es geschafft!



Und das ist alles?



Nicht wirklich. Das Programm befindet sich auf unserem lokalen Computer, aber DialogFlow weiß nichts darüber. Um unseren Computer in einen Server zu verwandeln, der im Internet verfügbar sein wird, benötigen wir ein spezielles Dienstprogramm. Ngrok erfüllt diese Anforderungen . Laden Sie es herunter, starten Sie es und geben Sie Folgendes in die Konsole ein: "ngrok http 5000". Ein https-Link wird angezeigt, der kopiert und in DialogFlow platziert werden muss. Kopieren Sie, gehen Sie in DialogFlow zu Erfüllung, versetzen Sie Webhook in den aktivierten Zustand und fügen Sie den Link in das resultierende Feld ein. Wir fügen die Route hinzu, d.h. "/ webhook". Sie sollten am Ende etwas Ähnliches wie das Folgende haben:



Bild



Jetzt starten wir unsere Python-Anwendung. Es bleibt nur noch sehr wenig übrig, um die Integration mit Telegram zu verbinden. Gehen Sie zur Registerkarte "Integrationen", wählen Sie das Telegramm aus, befolgen Sie die Anweisungen zum Abrufen eines Tokens, fügen Sie das Token ein und voila - die Anwendung ist fertig! Es bleibt noch zu testen:



Bild



Ich hoffe, dieser Artikel war nützlich für Sie und wird Sie ermutigen, selbst in diesem Bereich zu experimentieren. Den Projektcode finden Sie hier .



All Articles