Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner
Der er mange tjenester, der giver vejrinformation, men hvilken skal du stole på? Da jeg begyndte at cykle ofte, ville jeg gerne have den mest nøjagtige information om vejrforholdene på det sted, hvor jeg cykler.

Min første tanke var at samle en lille DIY vejrstation med sensorer og modtage data fra den. Men jeg har ikke "genopfundet hjulet" og valgte vejrinformation, der bruges i civil luftfart som kilde til verificerede data, nemlig METAR (METeorological Aerodrome Report) og TAF (TAF - Terminal Aerodrome Forecast). I luftfarten afhænger hundredvis af menneskers liv af vejret, så prognoserne er så nøjagtige som muligt.

Denne information udsendes XNUMX/XNUMX med stemmen på alle moderne flyvepladser i formularen ATIS (Automatisk Terminal Information Service) og VOLMET (fra fransk. vol - flyvning og Météo - vejr). Den første giver information om det faktiske vejr på flyvepladsen, og den anden giver en vejrudsigt for de næste 24-30 timer, ikke kun på sendeflyvepladsen, men også på andre.

Eksempel på ATIS-drift i Vnukovo lufthavn:

Et eksempel på, hvordan VOLMET fungerer i Vnukovo Lufthavn

Det er ubelejligt at have en radioscanner eller transceiver med dig hver gang for den tilsvarende rækkevidde, og jeg ønskede at oprette en bot i Telegram, der ved et klik på en knap giver dig mulighed for at få den samme prognose. Det er i det mindste upraktisk at allokere en separat server til dette, samt at sende anmodninger til dit hjem Raspberry.

Derfor besluttede jeg at bruge tjenesten som backend Vælg Cloud-funktioner. Antallet af anmodninger vil være ubetydeligt, så en sådan tjeneste vil være praktisk talt gratis (ifølge mine beregninger vil det være 22 rubler for 100 anmodninger).

Forberedelse af backend

Oprettelse af en funktion

I Kontrolpanel my.selectel.ru åbne udsigten cloud platform og opret et nyt projekt:

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner
Når projektet er oprettet, skal du gå til sektionen Funktioner:

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner
Tryk på knappen Opret en funktion og giv den det ønskede navn:

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner
Efter tryk Opret en funktion vi vil have en repræsentation af den oprettede funktion:

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner
Før du begynder at oprette kode i Python, skal du oprette en bot i Telegram. Jeg vil ikke beskrive, hvordan dette gøres - der er detaljerede instruktioner i vores vidensbase. Det vigtigste for os er tokenet for den oprettede bot.

Forberedelse af koden

Jeg valgte National Oceanic and Atmospheric Administration (NOAA) som en kilde til pålidelige data. Dette videnskabelige bureau opdaterer data i realtid på sin server i TXT-format.

Link for at få METAR-data (bemærk sagen):

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

I mit tilfælde er den nærmeste lufthavn Vnukovo, dens ICAO-kode er UUWW. At gå til den genererede URL vil give følgende:

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

Den første linje er det aktuelle tidspunkt for prognosen i Greenwich Mean Time. Den anden linje er en oversigt over det faktiske vejr. Civile luftfartspiloter vil ikke have noget problem med at forstå, hvad denne linje betyder, men vi har brug for en forklaring:

  • [UUWW] — Vnukovo, Moskva (Rusland — RUC);
  • [101130Z] — 10. dag i måneden, kl. 11:30 GMT;
  • [31004MPS] — vindretning 310 grader, hastighed 4 m/s;
  • [9999] — vandret sigtbarhed 10 km eller mere;
  • [SCT048] — spredte/spredte skyer ved 4800 fod (~1584m);
  • [24 / 13] — temperatur 24°C, dugpunkt 13°C;
  • [Q1014] — tryk (QNH) 1014 hektopascal (750 mm Hg);
  • [R01/000070] — vedhæftningskoefficient på bane 01 — 0,70;
  • [NOSIG] - uden væsentlige ændringer.

Lad os begynde at skrive programkode. Først skal du importere funktioner anmode и pytaf:

from urllib import request
import pytaf

Angiv variablerne og klargør afkodningsfunktionen:

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

Lad os gå videre til TAF (case er også vigtig).

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

Som i det foregående eksempel, lad os se på vejrudsigten i Vnukovo lufthavn:

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

Lad os især være opmærksomme på linjerne TEMPO и BECMG. TEMPO betyder, at det faktiske vejr i den angivne periode vil ændre sig periodisk. BECMG - vejret vil gradvist ændre sig inden for et bestemt tidsrum.

Det vil sige linjen:

TEMPO 1012/1020 -TSRA BKN020CB

Vil betyde:

  • [1012 / 1020] — mellem 12 og 20 timer (Greenwich Mean Time);
  • [-TSRA] — tordenvejr (TS = tordenvejr) med regn (RA = regn) af lav intensitet (minustegn);
  • [BKN020CB] - betydelige (BKN = brudt), cumulonimbus (CB = cumulonimbus) skyer i 2000 fod (610 meter) over havets overflade.

Der er ret mange udtryk for vejrfænomener, og det er svært at huske dem. Koden til TAF-anmodningen er skrevet på lignende måde.

Uploader kode til skyen

For ikke at spilde tid, lad os tage en telegram-bot-skabelon fra vores lager sky-telegram-bot. Der er en på forhånd forberedt krav.txt и setup.py med den korrekte mappestruktur.

Siden i koden vil vi få adgang til modulet pytaf, så skal dens version straks tilføjes krav.txt

pytaf~=1.2.1

  • Lad os gå videre til redigering bot/tele_bot.py. Vi fjerner alle unødvendige ting og tilføjer vores kode.

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)

  • Vi pakker hele mappen ind i et ZIP-arkiv og går til kontrolpanelet til den oprettede funktion.
  • Klik Edit og download arkivet med koden.

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner

  • Udfyld den relative sti i filen tele_bot (udvidelse .py angives muligvis ikke) og en slutpunktsfunktion (i det angivne eksempel er dette main).
  • I afsnit miljøvariabler skrive en variabel POLET og tildel den token for den ønskede telegrambot.
  • Klik Gem og udvid, hvorefter vi går til afsnittet triggers.
  • Vi sætter kontakten HTTP-anmodningat offentliggøre anmodningen.

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner
Vi har nu en URL til offentligt at kalde funktionen. Det eneste der er tilbage er konfigurere webhook. Find vores bot @SelectelServerless_bot i Telegram og registrer din bot med kommandoen:

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

Outcome

Hvis alt er gjort korrekt, vil din bot straks begynde at arbejde og vise den seneste luftfartsvejrrapport direkte i messengeren.

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner
Selvfølgelig kan koden forbedres, men selv i dens nuværende tilstand er det nok at finde ud af det mest nøjagtige vejr og vejrudsigt fra en pålidelig kilde.

Du finder den fulde version af koden i vores repositories på GitHub.

Den mest nøjagtige vejrudsigt: en bot til Telegram på skyfunktioner

Kilde: www.habr.com

Tilføj en kommentar