Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks
Ilmateavet pakuvad palju teenuseid, kuid millist neist peaksite usaldama? Kui hakkasin sageli jalgrattaga sõitma, tahtsin saada võimalikult täpset teavet selle koha ilmastikutingimuste kohta, kus ma sõidan.

Minu esimene mõte oli ehitada väike DIY ilmajaam koos anduritega ja sealt andmeid vastu võtta. Kuid ma ei leiutanud ratast uuesti ja valisin kontrollitud andmete allikaks tsiviillennunduses kasutatava ilmateabe, nimelt METAR (METeorological Aerodrome Report) ja TAF (TAF – Terminal Aerodrome Forecast). Lennunduses sõltub ilmast sadade inimeste elu, seega on prognoosid võimalikult täpsed.

Seda teavet edastatakse XNUMX/XNUMX häälega igal kaasaegsel lennuväljal kujul ATIS (Automaatne terminali teabeteenus) ja VOLMET (prantsuse keelest. maht - lend ja météo - ilm). Esimene annab teavet lennuvälja tegeliku ilma kohta ja teine ​​​​prognoosi järgmiseks 24-30 tunniks mitte ainult saatelennuväljal, vaid ka teistel.

Näide ATISe tegevusest Vnukovo lennujaamas:

Näide sellest, kuidas VOLMET Vnukovo lennujaamas töötab

Ebamugav on iga kord vastava vahemiku jaoks raadioskannerit või transiiverit kaasas kanda ja tahtsin luua Telegramis roboti, mis võimaldab ühe nupuvajutusega saada sama prognoosi. Eraldi serveri eraldamine selleks, nagu ka päringute saatmine oma kodusesse Raspberrysse, on vähemalt ebapraktiline.

Seetõttu otsustasin teenust taustaprogrammina kasutada Valige pilvefunktsioonid. Päringute arv on tühine, nii et selline teenus on praktiliselt tasuta (minu arvutuste kohaselt on see 22 rubla 100 000 päringu kohta).

Taustaprogrammi ettevalmistamine

Looge funktsioon

Juhtpaneelil my.selectel.ru avage vaade Pilveplatvorm ja looge uus projekt:

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks
Pärast projekti loomist minge jaotisse Funktsioonid:

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks
Vajutage nuppu Looge funktsioon ja andke sellele soovitud nimi:

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks
Pärast vajutamist Looge funktsioon meil on loodud funktsiooni esitus:

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks
Enne Pythonis koodi loomise alustamist peate Telegramis looma roboti. Ma ei kirjelda, kuidas seda tehakse - seal on üksikasjalikud juhised meie teadmistebaasis. Meie jaoks on peamine loodud boti märk.

Koodi ettevalmistamine

Usaldusväärsete andmete allikaks valisin National Oceanic and Atmospheric Administration (NOAA). See teadusagentuur värskendab andmeid reaalajas oma serveris TXT-vormingus.

Link METAR-i andmete saamiseks (pange tähele juhtumit):

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

Minu puhul on lähim lennujaam Vnukovo, selle ICAO kood on UUWW. Loodud URL-i avamine annab järgmise:

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

Esimene rida on prognoosi praegune aeg Greenwichi aja järgi. Teine rida on kokkuvõte tegelikust ilmast. Tsiviillennunduse pilootidel pole probleeme selle rea tähenduse mõistmisega, kuid vajame selgitust:

  • [UUWW] — Vnukovo, Moskva (Venemaa — RU);
  • [101130Z] — kuu 10. päev, 11 GMT;
  • [31004MPS] — tuule suund 310 kraadi, kiirus 4 m/s;
  • [9999] — horisontaalne nähtavus 10 km või rohkem;
  • [SCT048] — hajus-/hajupilved 4800 jala (~1584 m) kõrgusel;
  • [24 / 13] — temperatuur 24°C, kastepunkt 13°C;
  • [Q1014] — rõhk (QNH) 1014 hektopaskalit (750 mm Hg);
  • [R01/000070] — haardetegur rajal 01 — 0,70;
  • [NOSIG] - ilma oluliste muudatusteta.

Alustame programmi koodi kirjutamist. Kõigepealt peate funktsioonid importima taotleda и pytaf:

from urllib import request
import pytaf

Määrake muutujad ja valmistage ette dekodeerimisfunktsioon:

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

Liigume edasi TAF-i juurde (tähtis on ka suurtäht).

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

Nagu eelmises näites, vaatame Vnukovo lennujaama prognoosi:

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

Pöörame erilist tähelepanu joontele AEG и BECMG. TEMPO tähendab, et tegelik ilm määratud perioodil muutub perioodiliselt. BECMG – ilm muutub teatud aja jooksul järk-järgult.

See tähendab, et rida:

TEMPO 1012/1020 -TSRA BKN020CB

Tähendab:

  • [1012 / 1020] — 12–20 tundi (Greenwichi aja järgi);
  • [-TSRA] — äikesetorm (TS = äike) madala intensiivsusega vihmaga (RA = vihm) (miinusmärk);
  • [BKN020CB] - olulised (BKN = murtud), rünkpilved (CB = cumulonimbus) 2000 jala (610 meetri) kõrgusel merepinnast.

Ilmastikunähtuste mõisteid on päris palju ja nende meeldejätmine on keeruline. TAF päringu kood on kirjutatud sarnaselt.

Koodi pilve üleslaadimine

Et mitte aega raisata, võtame oma hoidlast telegrammi roboti malli pilv-telegramm-bot. Olemas on eelnevalt ettevalmistatud nõuded.txt и setup.py õige kataloogistruktuuriga.

Kuna koodis pääseme juurde moodulile pytaf, siis tuleks selle versioon kohe lisada nõuded.txt

pytaf~=1.2.1

  • Liigume edasi toimetamise juurde bot/tele_bot.py. Eemaldame kõik mittevajalikud asjad ja lisame oma koodi.

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)

  • Pakime kogu kataloogi ZIP-arhiivi ja läheme juhtpaneelile loodud funktsiooni juurde.
  • Vajuta siia Muuda ja laadige alla arhiiv koos koodiga.

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks

  • Täitke faili suhteline tee tele_bot (pikendus .py ei pruugi olla määratud) ja lõpp-punkti funktsioon (antud näites on see põhiline).
  • Jaotises Keskkonnamuutujad kirjutada muutuja PÖÖRDUD ja määrake sellele soovitud telegrammi roboti tunnus.
  • Vajuta siia Salvesta ja laienda, mille järel läheme sektsiooni Päästikud.
  • Panime lüliti sisse HTTP taotluset taotlus avalikuks teha.

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks
Nüüd on meil funktsiooni avalikuks kutsumiseks URL. Kõik, mis on jäänud, on veebihaagi seadistamine. Otsige üles meie bot @SelectelServerless_bot Telegramis ja registreerige oma robot käsuga:

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

Tulemus

Kui kõik on õigesti tehtud, hakkab teie bot kohe tööle ja kuvab värskeima lennuilmateate otse messengeris.

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks
Loomulikult saab koodi täiustada, kuid ka praeguses seisus piisab sellest, kui usaldusväärsest allikast teada saada kõige täpsem ilm ja prognoos.

Koodi täisversiooni leiate meie veebisaidilt hoidlad GitHubis.

Kõige täpsem ilmateade: bot Telegrami pilvefunktsioonide jaoks

Allikas: www.habr.com

Lisa kommentaar