Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen
Es gibt viele Dienste, die Wetterinformationen bereitstellen, aber welchem soll man vertrauen? Als ich anfing, hĂ€ufiger Fahrrad zu fahren, wollte ich ĂŒber die genauesten Wetterbedingungen an dem Ort informiert sein, wo ich fahre.

Der erste Gedanke war, eine kleine DIY-Wetterstation mit Sensoren zu bauen und die Daten von dort zu beziehen. Aber ich wollte das Rad nicht neu erfinden und wĂ€hlte als Quelle fĂŒr verlĂ€ssliche Daten Wetterinformationen, die in der zivilen Luftfahrt verwendet werden, nĂ€mlich METAR (Meteorologischer Platzbericht) und TAF (TAF — Terminal Aerodrome Forecast). In der Luftfahrt hĂ€ngen die Leben von Hunderten von Menschen vom Wetter ab, deshalb sind die Prognosen so genau wie möglich.

Diese Informationen werden rund um die Uhr in Form von ATIS (Automatischer Terminalinformationsdienst) und VOLMET (von französisch vol — Flug und mĂ©tĂ©o — Wetter). Der erste Dienst gibt Informationen ĂŒber die aktuellen Wetterbedingungen am Flughafen, wĂ€hrend der zweite die Prognose fĂŒr die nĂ€chsten 24-30 Stunden bereitstellt, und zwar nicht nur fĂŒr den ĂŒbertragenden Flughafen, sondern auch fĂŒr andere.

Beispiel der ATIS-Funktion am Flughafen Wnukowo:

Beispiel der VOLMET-Funktion am Flughafen Wnukowo

Es ist unpraktisch, jedes Mal einen Funkscanner oder Transceiver fĂŒr die entsprechenden Frequenzen mitzunehmen, und ich wollte einen Telegram-Bot erstellen, der auf Knopfdruck eine Ă€hnliche Prognose ermöglicht. Es ist nicht sinnvoll, dafĂŒr einen separaten Server einzurichten, ebenso wenig wie Anfragen auf meinem heimischen Raspberry Pi zu verarbeiten.

Deshalb habe ich mich entschieden, den Dienst Cloud-Funktionen von Selectelzu nutzen. Die Anzahl der Anfragen wird minimal sein, daher wird dieser Dienst faktisch kostenlos sein (meinen Berechnungen zufolge kostet es 22 Rubel fĂŒr 100.000 Anfragen).

Vorbereitung des Backends

Erstellung der Funktion

Im Kontrollfeld my.selectel.ru öffnen wir die Ansicht Cloud-Plattform und erstellen ein neues Projekt:

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen
Nachdem das Projekt erstellt wurde, gehen wir zu dem Abschnitt Funktionen:

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen
Wir drĂŒcken die Taste Funktion erstellen und geben ihm den gewĂŒnschten Namen:

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen
Nach dem Klicken auf Funktion erstellen sehen wir die Ansicht der erstellten Funktion:

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen
Bevor wir mit dem Schreiben des Codes in Python beginnen, mĂŒssen wir einen Bot in Telegram erstellen. Ich werde nicht nĂ€her darauf eingehen, wie das funktioniert – eine detaillierte Anleitung ist vorhanden in unserem Wissensdatenbank. Wichtig fĂŒr uns ist das Token des erstellten Bots.

Bereiten wir den Code vor

Als Quelle zuverlÀssiger Daten habe ich die National Oceanic and Atmospheric Administration (NOAA) der USA gewÀhlt. Dieses wissenschaftliche Amt aktualisiert die Daten in Echtzeit auf seinem Server im TXT-Format.

Link zum Abrufen von METAR-Daten (achten Sie auf die Großschreibung):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXT

In meinem Fall ist der nÀchstgelegene Flughafen Wnukowo, sein ICAO-Code ist UUWW. Der Zugriff auf die generierte URL gibt Folgendes aus:

2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG

Die erste Zeile zeigt die Zeit der Vorhersage in Greenwich an. Die zweite Zeile enthĂ€lt eine Zusammenfassung des aktuellen Wetters. Zivilluftfahrtpiloten werden problemlos verstehen, was diese Zeile bedeutet, doch wir benötigen eine AufschlĂŒsselung:

  • [UUWW] — Wnukowo, Stadt Moskau (Russland — RU);
  • [101130Z] — 10. Tag des Monats, 11 Uhr 30 Minuten nach Greenwich;
  • [31004MPS] — Windrichtung 310 Grad, Geschwindigkeit 4 m/s;
  • [9999] — horizontale Sichtweite 10 km oder mehr;
  • [SCT048] — verstreute Wolken in 4800 Fuß (~1584m) Höhe;
  • [24/13] — Temperatur 24°C, Taupunkt 13°C;
  • [Q1014] — Druck (QNH) 1014 Hektopascal (750 mm Hg);
  • [R01/000070] — Der Haftungskoeffizient auf Strecke 01 betrĂ€gt 0,70;
  • [NOSIG] — ohne wesentliche Änderungen.

Wir beginnen mit dem Schreiben des Codes. ZunĂ€chst mĂŒssen Funktionen importiert werden request und pytaf:

from urllib import request
import pytaf

Geben Sie die Variablen an und bereiten Sie die Dekodierungsfunktion vor:

URL_METAR = "https://tgftp.nws.noaa.gov/data/observations/metar/stations/UUWW.TXT"
URL_TAF = "https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/UUWW.TXT"

def parse_data(code):
    code = code.split('n')[1]
    return pytaf.Decoder(pytaf.TAF(code)).decode_taf()

Lassen Sie uns zum TAF ĂŒbergehen (die Großschreibung ist ebenfalls wichtig).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXT

Wie im vorherigen Beispiel, schauen wir uns die Vorhersage am Flughafen Wnukowo an:

2020/08/10 12:21
TAF UUWW 101050Z 1012/1112 28003G10MPS 9999 SCT030 TX25/1012Z TN15/1103Z 
      TEMPO 1012/1020 -TSRA BKN020CB 
      BECMG 1020/1021 FEW007 BKN016 
      TEMPO 1021/1106 -SHRA BKN020CB PROB40 
      TEMPO 1021/1106 -TSRA BKN020CB 
      BECMG 1101/1103 34006G13MPS

Besonderes Augenmerk legen wir auf die Zeilen TEMPO und BECMG. TEMPO bedeutet, dass das tatsĂ€chliche Wetter in dem angegebenen Zeitraum periodisch schwankt. BECMG – das Wetter wird sich allmĂ€hlich im angegebenen Zeitraum Ă€ndern.

Das bedeutet, dass die Zeile:

TEMPO 1012/1020 -TSRA BKN020CB

Bedeutet:

  • [1012/1020] — im Zeitraum von 12 bis 20 Uhr (nach Greenwich);
  • [-TSRA] — Gewitter (TS = thunderstorm) mit leichtem Regen (RA = rain, Zeichen minus);
  • [BKN020CB] — signifikante (BKN = gebrochen), kumulonimbusartige (CB = Cumulonimbus) Bewölkung in 2000 Fuß (610 Meter) ĂŒber dem Meeresspiegel.

Es gibt viele Begriffe, die WetterphĂ€nomene bedeuten, und es kann schwierig sein, sie zu merken. Der Code fĂŒr die Abfrage von TAF wird auf Ă€hnliche Weise geschrieben.

Wir laden den Code in die Cloud hoch.

Um keine Zeit zu verschwenden, nehmen wir eine Vorlage des Telegram-Bots aus unserem Repository. cloud-telegram-bot. Dort gibt es eine vorgefertigte requirements.txt und setup.py mit der korrekten Verzeichnisstruktur.

Da wir im Code auf das Modul pytaf, sollten wir sofort die Version hinzufĂŒgen zu requirements.txt

pytaf~=1.2.1

  • Wir gehen zur Bearbeitung von bot/tele_bot.py. Wir entfernen alles ÜberflĂŒssige und fĂŒgen unseren Code hinzu.

import os
from urllib import request
import telebot
import pytaf
 
TOKEN = os.environ.get('TOKEN')
URL_METAR = "https://tgftp.nws.noaa.gov/data/observations/metar/stations/UUWW.TXT"
URL_TAF = "https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/UUWW.TXT"
 
bot = telebot.TeleBot(token=TOKEN, threaded=False)
keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.row('/start', '/get_metar', '/get_taf')
 
def start(message):
    msg = "Hallo. Dies ist ein Bot zur Abfrage der Wettervorhersage " 
          "von den NOAA-Servern. Der Bot ist auf den Flughafen Wnukowo (UUWW) eingestellt."
    bot.send_message(message.chat.id, msg, reply_markup=keyboard)
 
def parse_data(code):
    code = code.split('n')[1]
    return pytaf.Decoder(pytaf.TAF(code)).decode_taf()
 
def get_metar(message):
    # Informationen vom Server abrufen.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Formatierten Antwort senden.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # Informationen vom Server abrufen.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Formatierten Antwort senden.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Kommandorouter.
    """
    if command == '/start':
        return start(message)
    elif command == '/get_metar':
        return get_metar(message)
    elif command == '/get_taf':
        return get_taf(message)
 
def main(**kwargs):
    """
    Einstiegspunkt fĂŒr serverlose Umgebungen.
    """
    print(f'Eingegangen: "{kwargs}"')
    message = telebot.types.Update.de_json(kwargs)
    message = message.message or message.edited_message
    if message and message.text and message.text[0] == '/':
        print(f'Echo bei "{message.text}"')
        route_command(message.text.lower(), message)

  • Wir packen das gesamte Verzeichnis in eine ZIP-Datei und wechseln zur Verwaltung der erstellten Funktion.
  • Klicken Sie auf Bearbeiten und laden das Archiv mit dem Code hoch.

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen

  • FĂŒllen Sie den relativen Pfad zur Datei aus tele_bot (Erweiterung .py muss nicht angegeben werden) und die Endpunktfunktion (im gegebenen Beispiel ist das main).
  • Im Abschnitt Umgebungsvariablen Schreiben Sie die Variable TOKEN und weisen Sie ihr das Token des benötigten Telegram-Bots zu.
  • Klicken Sie auf Speichern und Bereitstellen, danach wechseln wir zum Abschnitt Trigger.
  • Aktivieren Sie den Schalter HTTP-Anforderung, um die Anfrage öffentlich zu machen.

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen
Wir haben eine URL fĂŒr den öffentlichen Aufruf der Funktion erhalten. Es bleibt nur noch den Webhook einzurichten. Suchen Sie unseren Bot @SelectelServerless_bot in Telegram und registrieren Sie Ihren Bot mit dem Befehl:

/setwebhook <you bot token> <public URL of your function>

Ergebnis

Wenn alles richtig gemacht wurde, wird Ihr Bot sofort funktionieren und die aktuelle Zusammenfassung des Luftfahrtwetters direkt im Messenger anzeigen.

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen
NatĂŒrlich kann der Code weiterentwickelt werden, aber selbst im aktuellen Zustand reicht er aus, um das genaueste Wetter und die Prognose aus einer verlĂ€sslichen Quelle zu erhalten.

Die vollstÀndige Version des Codes finden Sie in unserem im Repository auf GitHub.

Die genaueste Wettervorhersage: Ein Bot fĂŒr Telegram auf Cloud-Funktionen

Quelle: habr.com

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster