Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych
Istnieje wiele serwisów dostarczających informacji o pogodzie, ale któremu z nich warto zaufać? Kiedy zacząłem często jeździć na rowerze, chciałem mieć jak najdokładniejsze informacje o warunkach pogodowych w miejscu, w którym jeżdżę.

Moją pierwszą myślą było zbudowanie małej stacji pogodowej DIY z czujnikami i odbieranie z niej danych. Ale to nie ja „wymyśliłem koło na nowo” i jako źródło zweryfikowanych danych wybrałem informacje pogodowe, które wykorzystywane są w lotnictwie cywilnym, a mianowicie METAR (Raport meteorologiczny lotniska) i TAF (TAF – prognoza lotniska terminalowego). W lotnictwie od pogody zależy życie setek ludzi, dlatego prognozy są jak najbardziej dokładne.

Informacje te nadawane są głosowo XNUMX godziny na dobę, XNUMX dni w tygodniu na każdym nowoczesnym lotnisku w formie ATIS (Automatyczny Serwis Informacji Terminalowej) i WOLMET (z francuskiego. vol - lot i météo - pogoda). Pierwsza dostarcza informacji o aktualnej pogodzie na lotnisku, a druga prognozę na najbliższe 24-30 godzin, nie tylko na lotnisku nadawanym, ale także na innych.

Przykład działania ATIS na lotnisku Wnukowo:

Przykład działania VOLMET na lotnisku Wnukowo

Niewygodne jest noszenie przy sobie skanera radiowego lub urządzenia nadawczo-odbiorczego za każdym razem dla odpowiedniego zasięgu, a ja chciałem stworzyć bota w Telegramie, który jednym kliknięciem pozwoli uzyskać tę samą prognozę. Przydzielanie do tego osobnego serwera i wysyłanie żądań do domowej Malinki jest co najmniej niepraktyczne.

Dlatego zdecydowałem się wykorzystać usługę jako backend Wybierz funkcje chmury. Liczba wniosków będzie znikoma, więc taka usługa będzie praktycznie bezpłatna (wg moich obliczeń będzie to 22 ruble za 100 000 wniosków).

Przygotowanie backendu

Tworzenie funkcji

W Panelu sterowania my.selectel.ru otwórz widok Platforma chmurowa i utwórz nowy projekt:

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych
Po utworzeniu projektu przejdź do sekcji funkcje:

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych
Naciśnij przycisk Utwórz funkcję i nadaj mu żądaną nazwę:

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych
Po kliknięciu Utwórz funkcję będziemy mieli reprezentację utworzonej funkcji:

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych
Zanim zaczniesz tworzyć kod w Pythonie, musisz stworzyć bota w Telegramie. Nie będę opisywał, jak to się robi - są szczegółowe instrukcje w naszej bazie wiedzy. Najważniejszy jest dla nas token stworzonego bota.

Przygotowanie kodu

Jako źródło wiarygodnych danych wybrałem Narodową Administrację Oceaniczną i Atmosferyczną (NOAA). Ta agencja naukowa aktualizuje dane w czasie rzeczywistym na swoim serwerze w formacie TXT.

Link do uzyskania danych METAR (zwróć uwagę na przypadek):

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

W moim przypadku najbliższe lotnisko to Wnukowo, jego kod ICAO to UUWW. Przejście do wygenerowanego adresu URL da następujące informacje:

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

Pierwsza linia to aktualny czas prognozy według czasu Greenwich. Druga linia to podsumowanie aktualnej pogody. Piloci lotnictwa cywilnego nie będą mieli problemu ze zrozumieniem, co oznacza ta linia, ale potrzebujemy wyjaśnienia:

  • [UUWW] — Wnukowo, Moskwa (Rosja — RU);
  • [101130Z] — 10. dzień miesiąca, godzina 11:30 GMT;
  • [31004MPS] — kierunek wiatru 310 stopni, prędkość 4 m/s;
  • [9999] — widzialność pozioma 10 km lub większa;
  • [SCT048] — rozproszone/rozproszone chmury na wysokości 4800 stóp (~1584 m);
  • [24 / 13] — temperatura 24°C, punkt rosy 13°C;
  • [Q1014] — ciśnienie (QNH) 1014 hektopaskali (750 mm Hg);
  • [R01/000070] — współczynnik przyczepności na pasie 01 — 0,70;
  • [NOSIG] - bez istotnych zmian.

Zacznijmy pisać kod programu. Najpierw musisz zaimportować funkcje zażądać и pytanief:

from urllib import request
import pytaf

Określ zmienne i przygotuj funkcję dekodującą:

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

Przejdźmy do TAF-u (przypadek też jest ważny).

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

Podobnie jak w poprzednim przykładzie, spójrzmy na prognozę na lotnisku Wnukowo:

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

Zwróćmy szczególną uwagę na linie CZAS и BECMG. TEMPO oznacza, że ​​rzeczywista pogoda w określonym okresie będzie się okresowo zmieniać. BECMG - pogoda będzie się zmieniać stopniowo w określonym przedziale czasu.

Czyli linia:

TEMPO 1012/1020 -TSRA BKN020CB

Będzie oznaczać:

  • [1012 / 1020] — od 12 do 20 godzin (czasu Greenwich);
  • [-TSRA] — burza (TS = burza) z deszczem (RA = deszcz) o małej intensywności (znak minus);
  • [BKN020CB] - znaczące (BKN = przerwane), chmury cumulonimbus (CB = cumulonimbus) na wysokości 2000 stóp (610 metrów) nad poziomem morza.

Terminów opisujących zjawiska pogodowe jest dość dużo, a ich zapamiętanie jest trudne. Kod żądania TAF jest napisany w podobny sposób.

Przesyłanie kodu do chmury

Aby nie tracić czasu, pobierzmy szablon bota telegramu z naszego repozytorium bot-telegram w chmurze. Jest wstępnie przygotowany wymagania.txt и konfiguracja.py z poprawną strukturą katalogów.

Ponieważ w kodzie będziemy mieli dostęp do modułu pytanief, to należy od razu dodać jego wersję wymagania.txt

pytaf~=1.2.1

  • Przejdźmy do edycji bot/tele_bot.py. Usuwamy wszystkie niepotrzebne rzeczy i dodajemy nasz kod.

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)

  • Pakujemy cały katalog do archiwum ZIP i przechodzimy do panelu sterowania do utworzonej funkcji.
  • Kliknij Edycja i pobierz archiwum z kodem.

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych

  • Wypełnij ścieżkę względną w pliku tele_bot (rozszerzenie .py może nie zostać określony) i funkcję punktu końcowego (w podanym przykładzie jest to główny).
  • W sekcji Zmienne środowiska napisz zmienną ZNAK i przypisz mu token żądanego bota telegramowego.
  • Kliknij Zapisz i rozwiń, po czym przechodzimy do sekcji Wyzwalacze.
  • Umieściliśmy przełącznik Żądanie HTTPo podanie żądania do wiadomości publicznej.

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych
Mamy teraz adres URL umożliwiający publiczne wywołanie funkcji. Jedyne co pozostało to skonfiguruj webhooka. Znajdź naszego bota @SelectelServerless_bot w Telegramie i zarejestruj swojego bota za pomocą polecenia:

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

Doświadcz mocnych i skutecznych rezultatów

Jeśli wszystko zostanie wykonane poprawnie, Twój bot od razu zacznie działać i wyświetli najnowszy lotniczy raport pogody bezpośrednio w komunikatorze.

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych
Kod można oczywiście ulepszyć, ale nawet w jego obecnym stanie wystarczy poznać najdokładniejszą pogodę i prognozę z zaufanego źródła.

Pełną wersję kodu znajdziesz w naszym repozytoria na GitHubie.

Najdokładniejsza prognoza pogody: bot dla Telegramu na funkcjach chmurowych

Źródło: www.habr.com

Dodaj komentarz