KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel
IlmasĂŒsteeme, mis pakuvad ilmainfoteenuseid, on palju, kuid millisele neist usaldada? Kui hakkasin sageli jalgrattaga sĂ”itma, soovisin omada kĂ”ige tĂ€psemat teavet ilmastikuolude kohta seal, kus ma sĂ”idan.

Esimene mĂ”te oli kokku panna vĂ€ike DIY ilmapost ja saada andmeid selle kaudu. Kuid ma ei hakanud „ratast leiutama“ ja valisin usaldusvÀÀrseteks andmeallikateks ilmainformatsiooni, mida kasutatakse tsiviillennunduses, nimelt METAR (METeorological Aerodrome Report) ja TAF (TAF — Terminal Aerodrome Forecast). Lennunduses sĂ”ltuvad ilmad eeskĂ€tt sadade inimeste eludest, mistĂ”ttu on prognoosid maksimaalselt tĂ€psed.

See teave edastatakse jooksvalt hÀÀlega igas kaasaegses lennujaamas ATIS (Automatic Terminal Information Service) ja VOLMET (prantsuse keelest vol — lend ja mĂ©tĂ©o — ilm). Esimene annab teavet lennujaamas toimuva reaalse ilma kohta, teine — lĂ€hiaja 24-30 tunni ilmaprognoosi, mitte ainult edastava lennujaama kohta, vaid ka teiste kohta.

Vnukovo lennujaama ATIS nÀide:

Vnukovo lennujaama VOLMET nÀide

Alati on ebamugav igal ajal kaasas kanda raadiovastuvĂ”tjat vĂ”i vastuvĂ”tjat vastavas sagedusvahemikus, seega soovisin luua Telegramis robotit, mis ĂŒhe nupuvajutusega vĂ”imaldab saada sarnast prognoosi. Eraldi serveri kĂ€itamine selleks oleks vĂ€hemalt ebaefektiivne, samuti pole mĂ”tet kĂ€ivitada pĂ€ringuid koduses Raspberry's.

SeetĂ”ttu otsustasin tagakĂŒljena kasutada teenust Selecteli pilvefunktsioonid. KĂŒsimuste arv jÀÀb olematuks, seega maksab selline teenus sisuliselt tasuta (minu arvutuste kohaselt umbes 22 rubla 100 000 pĂ€ringu kohta).

TagakĂŒlje ettevalmistamine

Funktsiooni loomine

Juhtpaneelil my.selectel.ru avamme rakenduse Pilveplatvorm ja loome uue projekti:

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel
PĂ€rast projekti loomist liikume jaotisse Funktsioonid:

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel
KlÔpsame nuppu Loo funktsioon ja mÀÀrame sellele vajaliku nime:

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel
PĂ€rast nupule vajutamist Loo funktsioon kuvatakse loodud funktsiooni vaade:

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel
Enne kui alustame Pythonis koodi loomist, tuleb luua robot Telegramis. Ma ei hakka kirjeldama, kuidas see kĂ€ib — ĂŒksikasjalik juhend on olemas meie teadmusbaasist. Meile on oluline loodud roboti token.

Valmistame koodi

UsaldusvÀÀrsete andmete allikana valisin USA Rahvusliku Ookeaniliste ja AtmosfÀÀriliste Uuringute Ameti (ingl. National Oceanic and Atmospheric Administration, NOAA). See teaduslik agentuur vÀrskendab oma serveris andmeid reaalajas TXT-formaadis.

METAR andmete saamise link (pange tÀhele suurtÀhtede kasutamist):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXT

Minu puhul on lĂ€him lennujaam Vnukovo, mille ICAO kood on UUWW. Üleminekul genereeritud URL-le kuvatakse jĂ€rgmine teave:

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

Esimene rida on prognoosi kehtivusaeg Greenwichi aja jÀrgi. Teine rida on tegeliku ilma kokkuvÔte. Tsiviillennunduse piloodid saavad sellest nÀiteks aru, kuid vajame selgitust:

  • [UUWW] — Vnukovo, Moskva linn (Venemaa — RU);
  • [101130Z] — kuu 10. pĂ€ev, 11 tundi 30 minutit Greenwichi aja jĂ€rgi;
  • [31004MPS] — tuule suund 310 kraadi, kiirus 4 m/s;
  • [9999] — horisontaalne nĂ€htavus 10 km vĂ”i rohkem;
  • [SCT048] — hajutatud/jaotunud pilved 4800 jalga (~1584m) kĂ”rgusel;
  • [24/13] — temperatuur 24°C, kastepunkt 13°C;
  • [Q1014] — rĂ”hk (QNH) 1014 hektopaskalit (750 mm elavhĂ”be);
  • [R01/000070] — pidurisĂŒsteemil 01 – 0,70;
  • [NOSIG] — ilma oluliste muutusteta.

Alustame programmi kirjutamist. Esiteks tuleb importida funktsioonid request ja pytaf:

from urllib import request
import pytaf

MÀÀrata muutujad ja valmistada 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 TAFi juurde (ka suurus on oluline).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXT

Nagu eelnevas nÀites, vaatame ennustust Vnukovo lennujaamas:

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

Eriti tĂ€helepanu pöörame ridadele TEMPO ja BECMG. TEMPO tĂ€hendab, et tegelik ilm antud ajavahemikus muutub perioodiliselt. BECMG – ilm muutub jĂ€rk-jĂ€rgult antud ajavahemikus.

See tÀhendab rida:

TEMPO 1012/1020 -TSRA BKN020CB

TĂ€hendab:

  • [1012/1020] — ajavahemikus 12 kuni 20 tundi (Greenwichi jĂ€rgi);
  • [-TSRA] — Ă€ike (TS = thunderstorm) mÔÔduka intensiivsusega vihma (RA = rain) eest vĂ€ikese intensiivsusega (miinusmĂ€rk);
  • [BKN020CB] — mĂ€rkimisvÀÀrne (BKN = purunenud), kogunemispilvedest (CB = kumulonimbus) koosnev pilvemass 2000 jalga (610 meetrit) merepinnast.

IlmastikunÀhtusi tÀhistavaid termineid on palju ja nende meeldejÀtmine on keeruline. TAF-i pÀringu kood kirjutatakse sarnasel viisil.

Laeme koodi pilve

Kuna aega ei taha raisata, vĂ”tame meie hoidlast Telegrami boti ŃˆĐ°Đ±Đ»ĐŸon. cloud-telegram-bot. Seal on eelnevalt valmistatud requirements.txt ja setup.py korrektse kataloogistruktuuriga.

Kuna me koodis pöördume mooduli poole, pytaftuleb selle versioon kohe lisada requirements.txt

pytaf~=1.2.1

  • Liigume redigeerimise juurde bot/tele_bot.py. Eemaldame kĂ”ik liigsed 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 = "Tere. See on bot, mis pakub lennujaamade ilmaennustust " 
          "NOAA serveritelt. Bot on seadistatud Vnukovo lennujaama (UUWW) jaoks."
    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)

  • Kompresseerime kogu kausta ZIP-arhiiviks ja liigume juhtpaneeli loodud funktsiooni juurde.
  • Vajutame Redigeeri ja laadime arhiivi koos koodiga ĂŒles.

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel

  • TĂ€idame faili suhtelise tee tele_bot (laiendust .py ei pruugi nĂ€idata) ja lĂ”pp-punkti funktsiooni (antud nĂ€ites see main).
  • Jaotises Keskkonnamuutujad defineerime muutujana TOKEN ja mÀÀrame sellele vajaliku Telegrami boti tokeni.
  • Vajutame Salvesta ja rakenda, pĂ€rast mida liigume jaotisse KĂ€ivitajad.
  • LĂŒlitame HTTP-pĂ€ringu, et teha pĂ€ring avalikuks.

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel
Meil on nĂŒĂŒd URL avaliku funktsioonikutsumise jaoks. JÀÀnud on vaid konfigureerida veebihark. Leidke meie bot @SelectelServerless_bot Telegramis ja registreerige oma bot jĂ€rgmise 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 lennuilma ĂŒlevaate otse messengeris.

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel
Muidugi on koodi vÔimalik tÀiustada, kuid isegi praeguses seisus on seda piisavalt, et saada kÔige tÀpsem ilm ja prognoos usaldusvÀÀrsest allikast.

Koodi tÀieliku versiooni leiate meie GitHubi repostaariumist.

KÔige tÀpsem ilmaprognoos: Telegrami bot pilvifunktsioonidel

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster