Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud
Ka janë shumë shërbime që ofrojnë informacion mbi motin, por cilit duhet t'i besosh? Kur fillova të udhëtoj shpesh me biçikletë, doja që të kisha informacionin më të saktë mbi kushtet atmosferike në vendin ku udhëtoj.

Mendimi i parĂ« ishte tĂ« mbledh njĂ« stacion moti DIY me sensorĂ« dhe tĂ« merrja tĂ« dhĂ«nat prej tij. Por nuk desha tĂ« «shpik rrotĂ«n», kĂ«shtu qĂ« si burim tĂ« dhĂ«nash tĂ« verifikuara zgjodha informacionin pĂ«r motin qĂ« pĂ«rdoret nĂ« aviacionin civil, mĂ« konkretisht METAR (METeorological Aerodrome Report) dhe TAF (TAF — Terminal Aerodrome Forecast). NĂ« aviacion, moti ka ndikim mbi jetĂ«t e qindra njerĂ«zve, prandaj parashikimet janĂ« sa mĂ« tĂ« sakta.

Ky informacion transmetohet nĂ« mĂ«nyrĂ« 24-orĂ«she me zĂ« nĂ« çdo aeroport modern nĂ« formĂ«n e ATIS (Automatic Terminal Information Service) dhe VOLMET (nga fr. vol — fluturim dhe mĂ©tĂ©o — mot). ATIS ofron informacion mbi motin aktual nĂ« aeroport, ndĂ«rsa VOLMET jep parashikimin pĂ«r 24-30 orĂ«t e ardhshme, dhe jo vetĂ«m pĂ«r aeroportin qĂ« transmeton, por edhe pĂ«r tĂ« tjerĂ«.

Shembulli i funksionimit të ATIS në aeroportin Vnukovo:

Shembulli i funksionimit të VOLMET në aeroportin Vnukovo

Të mbash gjithmonë me vete një radiopërçues ose transmetues në gamën përkatëse është e papraktikueshme, dhe doja të krijoja një bot në Telegram, i cili me një klikim butoni do të siguronte të njëjtin parashikim. Të dedikosh një server për këtë është më shumë se sa e nevojshme, ashtu si dhe të dërgosh kërkesa në Raspberry-n tim në shtëpi.

Prandaj, si backend vendosa të përdor shërbimin Funksionet Cloud të Selectel.Numri i kërkesave do të jetë shumë i vogël, kështu që ky shërbim do të jetë praktikisht falas (sipërmarrjet e mia tregojnë se do të kushtojë 22 rubla për 100,000 kërkesa).

Përgatitja e backend-it

Krijimi i funksionit

Në panelin e menaxhimit my.selectel.ru hapim pamjen Platforma Cloud dhe krijojmë një projekt të ri:

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud
Pas rregullimit të projektit, kalojmë në seksionin Funksionet:

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud
Klikoni butonin Krijo funksion dhe i japim emrin e nevojshëm:

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud
Pas klikuar Krijo funksion ne do të kemi pamjen e funksionit të krijuar:

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud
Para se tĂ« fillojmĂ« me krijimin e kodit nĂ« Python, do tĂ« duhet tĂ« krijojmĂ« njĂ« bot nĂ« Telegram. Nuk do tĂ« pĂ«rshkruaj se si bĂ«het kjo — ka njĂ« udhĂ«zues tĂ« detajuar nĂ« bazĂ«n tonĂ« tĂ« njohurive. E rĂ«ndĂ«sishme pĂ«r ne Ă«shtĂ« — token e botit tĂ« krijuar.

Përgatitja e kodit

Si burim të dhënash të besueshme kam zgjedhur Administratën Kombëtare të Okeaneve dhe Atmosferës të SHBA-së (shkurt. National Oceanic and Atmospheric Administration, NOAA). Ky agjenci shkencor azhurnon të dhënat në serverin e saj në formatin TXT në kohë reale.

Lidhja për të marrë të dhënat METAR (kushtojini vëmendje regjistrit):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/<kod aeroporti sipas ICAO>.TXT

Në rastin tim, aeroporti më i afërt është Vnukovo, kodi i tij sipas ICAO është UUWW. Kalimi në URL-në e formuar do të japë këtë rezultat:

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

Rreshti i parë është koha e vlefshmërisë së parashikimit sipas Greenwich-it. Rreshti i dytë është përmbledhja e motit aktual. Pilotët e aviacionit civil do ta kuptojnë pa probleme se çfarë do të thotë ky rresht, megjithatë na nevojitet një shpjegim:

  • [UUWW] — Vnukovo, qyteti i MoskĂ«s (Rusia — RU);
  • [101130Z] — Dita e 10-tĂ« e muajit, ora 11:30 sipas Greenwich-it;
  • [31004MPS] — drejtimi i erĂ«s 310 gradĂ«, shpejtĂ«sia 4 m/s;
  • [9999] — dukshmĂ«ria horizontale 10 km e mĂ« shumĂ«;
  • [SCT048] — re tĂ« shpĂ«rndara nĂ« lartĂ«sinĂ« 4800 kĂ«mbĂ« (~1584m);
  • [24/13] — temperatura 24°C, pika e avullit 13°C;
  • [Q1014] — presioni (QNH) 1014 hektopaskale (750 mm Hg);
  • [R01/000070] — koeficienti i ngjitjes nĂ« pistĂ«n 01 — 0,70;
  • [NOSIG] — pa ndryshime tĂ« rĂ«ndĂ«sishme.

Le t'i fillojmë shkrimet e kodit. Fillimisht do të na nevojiten funksionet e importuara ) me të dhënat. Ja një lidhje që mund ta vendosni thjesht në fushën e shfletuesit dhe pastaj të rikrijoni faqen (kjo duhet bërë vetëm një herë): dhe pytaf:

from urllib import request
import pytaf

Caktojmë variablat dhe përgatisim funksionin për dekodim:

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

Le të kalojmë te TAF (vetëm regjistri është i rëndësishëm).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<kod aeroporti sipas ICAO>.TXT

Sikurse në shembullin e mëparshëm, le të shohim parashikimin në aeroportin Vnukovo:

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

NĂ« veçanti le tĂ« kushtojmĂ« vĂ«mendje rreshtave TEMPO dhe BECMG. TEMPO do tĂ« thotĂ« se moti aktual nĂ« periudhĂ«n e caktuar do tĂ« ndryshojĂ« periodikisht. BECMG — moti do tĂ« ndryshojĂ« gradualisht nĂ« periudhĂ«n e caktuar.

Pra, rreshti:

TEMPO 1012/1020 -TSRA BKN020CB

Do të thotë:

  • [1012/1020] — nĂ« periudhĂ«n nga ora 12 deri nĂ« 20 (sipĂ«r Greenwich-it);
  • [-TSRA] — stuhia (TS = thunderstorm) me shi (RA = rain) intensiteti i vogĂ«l (sheni minus);
  • [BKN020CB] — re tĂ« konsiderueshme (BKN = broken), me shi me re tĂ« mbushura (CB = cumulonimbus) nĂ« lartĂ«sinĂ« 2000 kĂ«mbĂ« (610 metra) mbi nivelin e detit.

Ekzistojnë shumë terma që do të thonë fenomene të motit, dhe është e vështirë t'i memorizosh ato. Kodi për kërkesën TAF shkruhet në mënyrë të ngjashme.

Ngarkojmë kodin në cloud

Që të mos humbim kohën kot, le të marrim një model të bisedës Telegram nga depoja jonë cloud-telegram-bot. Atje ka një strukturë të përgatitur paraprakisht requirements.txt dhe setup.py me një strukturë të saktë dosjesh.

Duke qenë se në kod do të referohemi në modul pytaf, duhet të shtojmë versionin e tij menjëherë në requirements.txt

pytaf~=1.2.1

  • Kalo nĂ« redaktimin e bot/tele_bot.py. Hiq tĂ« gjitha tĂ« tepĂ«rta dhe shto kodin tonĂ«.

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 = "Përshëndetje. Ky është një bot për marrjen e parashikimeve të motit për aviacionin " 
          "nga serverët e NOAA. Boti është i konfiguruar për aeroportin Vnukovo (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):
    # Merrni informacion nga serveri.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Dërgo përgjigje të formatizuar.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # Merrni informacion nga serveri.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Dërgo përgjigje të formatizuar.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Router për komandat.
    """
    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):
    """
    Pikë hyrje në ambientin pa server.
    """
    print(f'Pranuar: "{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 në "{message.text}"')
        route_command(message.text.lower(), message)

  • PaketojmĂ« tĂ« gjithĂ« drejtorinĂ« nĂ« njĂ« arkiv ZIP dhe kalojmĂ« nĂ« panelin e kontrollit pĂ«r funksionin e krijuar.
  • Klikoni Redakto dhe ngarkojmĂ« arkivin me kodin.

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud

  • PlotĂ«sojmĂ« rrugĂ«n relative nĂ« skedarin tele_bot (shtesa .py nuk Ă«shtĂ« e nevojshme ta pĂ«rmendim) dhe funksionin e endpointit (nĂ« shembullin e dhĂ«nĂ« Ă«shtĂ« main).
  • NĂ« seksionin Variablat e ambientit shkruajmĂ« variablĂ«n TOKEN dhe i japim atij tokenin e nevojshĂ«m tĂ« botit tĂ« Telegramit.
  • Klikoni Ruaj dhe publikoj, pas sĂ« cilĂ«s kalojmĂ« nĂ« seksionin Triggerat.
  • Vendosim ndĂ«rruesin HTTP-requests, pĂ«r ta bĂ«rĂ« kĂ«rkesĂ«n publike.

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud
Kemi marrë një URL për thirrjen publike të funksionit. E vetmja gjë që mbetet është të konfigurojmë webhookun.Gjeni botin tonë @SelectelServerless_bot në Telegram dhe regjistroni botin tuaj me komandën:

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

Rezultati

Nëse gjithçka është bërë siç duhet, boti juaj do të fillojë menjëherë të funksionojë dhe të japë një përmbledhje të saktë të motit aviator direkt në mesazher.

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud
Natyrisht, kodi mund të përmirësohet, megjithatë edhe në këtë gjendje është mjaft për të marrë parashikimin më të saktë të motit nga një burim të verifikuar.

Versionin e plotë të kodit do ta gjeni në repo në GitHub.

Parashikimi më i saktë i motit: bot për Telegram mbi funksionet cloud

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster