
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 zu 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 öffnen wir die Ansicht Cloud-Plattform und erstellen ein neues Projekt:

Nachdem das Projekt erstellt wurde, gehen wir zu dem Abschnitt Funktionen:

Wir drücken die Taste Funktion erstellen und geben ihm den gewünschten Namen:

Nach dem Klicken auf Funktion erstellen sehen wir die Ansicht der erstellten Funktion:

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 . 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/.TXTIn 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 pytafGeben 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/.TXTWie 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 BKN020CBBedeutet:
- [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. . 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.

- 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.

Wir haben eine URL für den öffentlichen Aufruf der Funktion erhalten. Es bleibt nur noch . Suchen Sie unseren 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.

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 .
Quelle: habr.com
