Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen
Es gibt viele Dienste, die Wetterinformationen bereitstellen, aber welchem ​​sollten Sie vertrauen? Als ich begann, regelmäßig Rad zu fahren, wollte ich möglichst genaue Informationen über die Wetterbedingungen an dem Ort haben, an dem ich fahre.

Mein erster Gedanke war, eine kleine DIY-Wetterstation mit Sensoren zu bauen und Daten davon zu empfangen. Aber ich habe das Rad nicht „neu erfunden“ und Wetterinformationen ausgewählt, die in der Zivilluftfahrt als Quelle für verifizierte Daten verwendet werden, nämlich METAR (METeorologischer Flugplatzbericht) und TAF (TAF – Terminal Aerodrome Forecast). In der Luftfahrt hängt das Leben Hunderter Menschen vom Wetter ab, daher sind die Vorhersagen so genau wie möglich.

Diese Informationen werden rund um die Uhr per Sprache auf jedem modernen Flugplatz in der Form übertragen ATIS (Automatischer Terminalinformationsdienst) und VOLMET (aus dem Französischen. vol - Flug und Wetter - Wetter). Der erste liefert Informationen über das tatsächliche Wetter auf dem Flugplatz und der zweite liefert eine Vorhersage für die nächsten 24 bis 30 Stunden, nicht nur auf dem Sendeflugplatz, sondern auch auf anderen.

Beispiel für den ATIS-Betrieb am Flughafen Wnukowo:

Ein Beispiel dafür, wie VOLMET am Flughafen Wnukowo funktioniert

Es ist umständlich, jedes Mal einen Funkscanner oder Transceiver für die entsprechende Reichweite bei sich zu haben, und ich wollte in Telegram einen Bot erstellen, der es Ihnen auf Knopfdruck ermöglicht, die gleiche Vorhersage zu erhalten. Es ist zumindest unpraktisch, dafür einen separaten Server bereitzustellen und Anfragen an den heimischen Raspberry zu senden.

Daher habe ich mich entschieden, den Dienst als Backend zu nutzen Wählen Sie Cloud-Funktionen aus. Die Anzahl der Anfragen wird vernachlässigbar sein, daher wird ein solcher Service praktisch kostenlos sein (nach meinen Berechnungen werden es 22 Rubel für 100 Anfragen sein).

Backend-Vorbereitung

Erstellen einer Funktion

In der Systemsteuerung my.selectel.ru Öffnen Sie die Ansicht Cloud-Plattform und ein neues Projekt erstellen:

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen
Nachdem das Projekt erstellt wurde, gehen Sie zum Abschnitt Funktionen:

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen
Drücken Sie den Knopf Erstellen Sie eine Funktion und geben Sie ihm den gewünschten Namen:

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen
Nach dem Klicken Erstellen Sie eine Funktion Wir werden eine Darstellung der erstellten Funktion haben:

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen
Bevor Sie mit der Codeerstellung in Python beginnen, müssen Sie einen Bot in Telegram erstellen. Ich werde nicht beschreiben, wie das geht – es gibt detaillierte Anweisungen in unserer Wissensdatenbank. Das Wichtigste für uns ist der Token des erstellten Bots.

Vorbereiten des Codes

Als Quelle zuverlässiger Daten habe ich die National Oceanic and Atmospheric Administration (NOAA) ausgewählt. Diese wissenschaftliche Agentur aktualisiert Daten in Echtzeit auf ihrem Server im TXT-Format.

Link zum Abrufen von METAR-Daten (beachten Sie die Groß-/Kleinschreibung):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT

In meinem Fall ist der nächstgelegene Flughafen Wnukowo mit dem ICAO-Code UUWW. Wenn Sie die generierte URL aufrufen, erhalten Sie Folgendes:

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

Die erste Zeile ist die aktuelle Zeit der Vorhersage in Greenwich Mean Time. Die zweite Zeile ist eine Zusammenfassung des tatsächlichen Wetters. Piloten der Zivilluftfahrt werden kein Problem damit haben, die Bedeutung dieser Zeile zu verstehen, aber wir brauchen eine Erklärung:

  • [UUWW] — Vnukovo, Moskau (Russland — RU);
  • [101130Z] — 10. Tag des Monats, 11:30 Uhr GMT;
  • [31004 MPS] — Windrichtung 310 Grad, Geschwindigkeit 4 m/s;
  • [9999] — horizontale Sichtweite 10 km oder mehr;
  • [SCT048] — vereinzelte/vereinzelte Wolken in 4800 Fuß (~1584 m);
  • [24 / 13] — Temperatur 24°C, Taupunkt 13°C;
  • [Q1014] — Druck (QNH) 1014 Hektopascal (750 mm Hg);
  • [R01/000070] — Haftbeiwert auf Spur 01 – 0,70;
  • [NOSIG] - ohne wesentliche Änderungen.

Beginnen wir mit dem Schreiben von Programmcode. Zuerst müssen Sie Funktionen importieren Anforderung и 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()

Kommen wir zum TAF (die Groß-/Kleinschreibung ist ebenfalls wichtig).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT

Schauen wir uns wie im vorherigen Beispiel die Prognose 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

Achten wir besonders auf die Linien ZEIT и BECMG. TEMPO bedeutet, dass sich das tatsächliche Wetter während des angegebenen Zeitraums periodisch ändert. BECMG – Das Wetter ändert sich allmählich innerhalb eines bestimmten Zeitraums.

Das heißt, die Zeile:

TEMPO 1012/1020 -TSRA BKN020CB

Bedeutet:

  • [1012 / 1020] — zwischen 12 und 20 Stunden (Greenwich Mean Time);
  • [-TSRA] — Gewitter (TS = Gewitter) mit Regen (RA = Regen) geringer Intensität (Minuszeichen);
  • [BKN020CB] - erhebliche (BKN = gebrochene) Cumulonimbus-Wolken (CB = Cumulonimbus) in 2000 Fuß (610 Metern) Höhe über dem Meeresspiegel.

Es gibt viele Begriffe für Wetterphänomene und es ist schwierig, sich diese zu merken. Der Code für die TAF-Anfrage ist auf ähnliche Weise geschrieben.

Code in die Cloud hochladen

Um keine Zeit zu verschwenden, nehmen wir eine Telegram-Bot-Vorlage aus unserem Repository Cloud-Telegram-Bot. Es gibt eine vorbereitete requirements.txt и setup.py mit der richtigen Verzeichnisstruktur.

Da wir im Code auf das Modul zugreifen Pytaf, dann sollte seine Version sofort hinzugefügt werden requirements.txt

pytaf~=1.2.1

  • Kommen wir zur Bearbeitung bot/tele_bot.py. Wir entfernen alle unnötigen Dinge 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 = "Привет. Это бот для получения авиационного прогноза погоды " 
          "с серверов NOAA. Бот настроен на аэропорт Внуково (UUWW)."
    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):
    # Fetch info from server.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Send formatted answer.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # Fetch info from server.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Send formatted answer.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Commands router.
    """
    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):
    """
    Serverless environment entry point.
    """
    print(f'Received: "{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 on "{message.text}"')
        route_command(message.text.lower(), message)

  • Wir packen das gesamte Verzeichnis in ein ZIP-Archiv und gehen in der Systemsteuerung auf die erstellte Funktion.
  • Klicken Bearbeiten und laden Sie das Archiv mit dem Code herunter.

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen

  • Geben Sie den relativen Pfad in die Datei ein tele_bot (Verlängerung .py darf nicht angegeben werden) und eine Endpunktfunktion (im gegebenen Beispiel ist dies Haupt-).
  • Im Abschnitt Umgebungsvariablen schreibe eine Variable ZEICHEN und weisen Sie ihm den Token des gewünschten Telegram-Bots zu.
  • Klicken Speichern und erweitern, danach gehen wir zum Abschnitt Auslöser.
  • Wir legen den Schalter um HTTP-Anfragedie Anfrage öffentlich zu machen.

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen
Wir haben jetzt eine URL zum öffentlichen Aufruf der Funktion. Alles was übrig bleibt ist Webhook konfigurieren. Finden Sie unseren Bot @SelectelServerless_bot in Telegram und registrieren Sie Ihren Bot mit dem Befehl:

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

Erlebe die Kraft effektiver Ergebnisse

Wenn alles richtig gemacht ist, beginnt Ihr Bot sofort mit der Arbeit und zeigt den neuesten Flugwetterbericht direkt im Messenger an.

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen
Natürlich kann der Code verbessert werden, aber selbst im aktuellen Zustand reicht es aus, das genaueste Wetter und die genaueste Vorhersage von einer vertrauenswürdigen Quelle zu erfahren.

Die Vollversion des Codes finden Sie in unserem Repositorys auf GitHub.

Die genaueste Wettervorhersage: Bot für Telegram auf Cloud-Funktionen

Source: habr.com

Kommentar hinzufügen