Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan
Eguraldiaren informazioa ematen duten zerbitzu asko daude, baina zeinetan fidatu behar zara? Maiz bizikletan ibiltzen hasi nintzenean, ibiltzen naizen tokiko eguraldi baldintzei buruzko informazio zehatzena eduki nahi nuen.

Nire lehenengo pentsatua sentsoreekin brikolajeko estazio meteorologiko txiki bat eraikitzea eta bertatik datuak jasotzea izan zen. Baina ez nuen "gurpila berrasmatu" eta hegazkin zibilean erabiltzen den eguraldiaren informazioa aukeratu nuen egiaztatutako datuen iturri gisa, alegia. METAR (Aerodromo Meteorologikoaren Txostena) eta TAF (TAF - Terminaleko Aerodromoen Iragarpena). Hegazkintzan, ehunka pertsonen bizitza eguraldiaren araberakoa da, beraz, iragarpenak ahalik eta zehatzenak dira.

Informazio hau XNUMX/XNUMX ahots bidez igortzen da aireportu moderno guztietan formularioan ATIS (Terminal Automatikoko Informazio Zerbitzua) eta VOLMET (frantsesetik. vol - hegaldia eta Météo - Eguraldia). Lehenengoak aireportuko benetako eguraldiari buruzko informazioa ematen du, eta bigarrenak hurrengo 24-30 orduetarako iragarpena ematen du, ez bakarrik emisioko aireportuan, baita beste batzuetan ere.

ATIS funtzionamenduaren adibidea Vnukovo aireportuan:

VOLMET Vnukovo aireportuan lan egiten duen adibide bat

Deserosoa da aldi bakoitzean irrati-eskaner edo transceptor bat zurekin eramatea dagokion barrutirako, eta Telegramen bot bat sortu nahi nuen, botoi bat sakatzean, iragarpen bera lortzeko aukera ematen duena. Gutxienez ez da praktikoa horretarako zerbitzari bereizi bat esleitzea, baita zure etxerako Raspberry eskaerak bidaltzea ere.

Horregatik, zerbitzua backend gisa erabiltzea erabaki nuen Aukeratu Hodeiko Ezaugarriak. Eskaeren kopurua arbuiagarria izango da, beraz, zerbitzu hori ia doakoa izango da (nire kalkuluen arabera, 22 errublo izango dira 100 eskaerarentzat).

Backend prestaketa

Sortu funtzio bat

Kontrol panelean my.selectel.ru ireki ikuspegia Hodeiko plataforma eta sortu proiektu berri bat:

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan
Proiektua sortu ondoren, joan atalera funtzio:

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan
Sakatu botoia Sortu funtzio bat eta eman nahi den izena:

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan
Sakatu ondoren Sortu funtzio bat sortutako funtzioaren irudikapena izango dugu:

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan
Python-en kodea sortzen hasi aurretik, bot bat sortu beharko duzu Telegram-en. Ez dut deskribatuko nola egiten den: argibide zehatzak daude gure ezagutza oinarrian. Guretzat gauza nagusia sortutako bot-aren tokena da.

Kodea prestatzen

Datu fidagarrien iturri gisa National Oceanic and Atmospheric Administration (NOAA) aukeratu nuen. Agentzia zientifiko honek datuak denbora errealean eguneratzen ditu bere zerbitzarian TXT formatuan.

METAR datuak lortzeko esteka (kontuan izan kasua):

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

Nire kasuan, hurbilen dagoen aireportua Vnukovo da, bere ICAO kodea da UUWW. Sortutako URLra joateak honako hau emango du:

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

Lehen lerroa iragarpenaren uneko ordua da, Greenwich Mean Time-n. Bigarren lerroa benetako eguraldiaren laburpena da. Abiazio zibileko pilotuek ez dute arazorik izango lerro honek zer esan nahi duen ulertzeko, baina azalpen bat behar dugu:

  • [UUWW] - Vnukovo, Mosku (Errusia — RU);
  • [101130Z] — Hilaren 10ean, 11:30etan GMT;
  • [31004MPS] — haizearen norabidea 310 gradu, abiadura 4 m/s;
  • [9999] — 10 km edo gehiagoko ikusgarritasun horizontala;
  • [SCT048] — laino sakabanatuak 4800 oinetan (~1584m);
  • [24 / 13] — tenperatura 24°C, ihintz-puntua 13°C;
  • [1014.G.] — presioa (QNH) 1014 hektopascal (750 mm Hg);
  • [R01/000070] — 01 erreian atxikimendu koefizientea — 0,70;
  • [NOSIG] - aldaketa esanguratsurik gabe.

Has gaitezen programaren kodea idazten. Lehenik eta behin funtzioak inportatu behar dituzu eskatu и pytaf:

from urllib import request
import pytaf

Zehaztu aldagaiak eta prestatu deskodetze funtzioa:

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

Goazen TAFera (kasua ere garrantzitsua da).

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

Aurreko adibidean bezala, ikus ditzagun Vnukovo aireportuko iragarpena:

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

Errepara diezaiegun lerroei bereziki TIME и BECMG. TEMPO esan nahi du zehaztutako aldian benetako eguraldia aldian-aldian aldatuko dela. BECMG - Eguraldia pixkanaka aldatuko da denbora-tarte jakin batean.

Hau da, lerroa:

TEMPO 1012/1020 -TSRA BKN020CB

Esan nahi du:

  • [1012 / 1020] — 12 eta 20 ordu artean (Greenwicheko ordua);
  • [-TSRA] — trumoi-ekaitza (TS = trumoia) intentsitate baxuko euriarekin (RA = euria) (minus ikurra);
  • [BKN020CB] - hodei esanguratsuak (BKN = hautsita), kumuloninboak (CB = kumuloninbusak) itsas mailatik 2000 oin (610 metro) aldean.

Fenomeno meteorologikoetarako termino dezente daude, eta zaila da horiek gogoratzea. TAF eskaeraren kodea antzeko moduan idatzita dago.

Kodea hodeira kargatzen

Denbora ez galtzeko, har dezagun telegram bot txantiloi bat gure biltegitik hodei-telegrama-bot. Aurrez prestatutako bat dago eskakizunak.txt и konfigurazioa.py direktorio-egitura zuzenarekin.

Kodean moduluan sartuko garenez pytaf, orduan bere bertsioa berehala gehitu behar zaio eskakizunak.txt

pytaf~=1.2.1

  • Goazen ediziora bot/tele_bot.py. Behar ez diren gauza guztiak kentzen ditugu eta gure kodea gehitzen dugu.

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)

  • Direktorio osoa ZIP artxibo batean sartzen dugu eta kontrol panelera joango gara sortutako funtziora.
  • prentsa Editatu eta deskargatu artxiboa kodearekin.

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan

  • Bete fitxategian bide erlatiboa tele_bot (luzapena PY agian ez da zehaztu) eta amaierako funtzio bat (ematen den adibidean hau da nagusia).
  • Atalean Inguruneko aldagaiak idatzi aldagai bat TOKENA eta esleitu nahi duzun telegram bot-aren tokena.
  • prentsa Gorde eta Zabaldu, ondoren atalera joango gara abiarazleak.
  • Etengailua jarri dugu HTTP eskaeraeskaera publiko egiteko.

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan
Orain funtzioari publikoki deitzeko URL bat dugu. Geratzen dena da konfiguratu webhook. Aurkitu gure bot @SelectelServerless_bot Telegram-en eta erregistratu zure bot komandoarekin:

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

Emaitza

Dena behar bezala egiten bada, zure bot-a berehala hasiko da lanean eta abiazio-eguraldiaren azken txostena zuzenean bistaratuko du mezularitzan.

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan
Noski, kodea hobetu daiteke, baina gaur egungo egoeran ere nahikoa da iturri fidagarri batetik eguraldi eta iragarpen zehatzena jakitea.

Gure kodearen bertsio osoa aurkituko duzu biltegiak GitHub-en.

Eguraldi iragarpen zehatzena: Telegramentzako bot hodeiko funtzioetan

Iturria: www.habr.com

Gehitu iruzkin berria