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

Parashikimi më i saktë i motit: bot për Telegram në funksionet cloud
Ka shumë shërbime që ofrojnë informacione për motin, por cilit duhet t'i besoni? Kur fillova të bëja biçikletë shpesh, doja të kisha informacionin më të saktë për kushtet e motit në vendin ku shëtit.

Mendimi im i parë ishte të ndërtoja një stacion të vogël moti DIY me sensorë dhe të merrja të dhëna prej tij. Por unë nuk "rishpikova timonin" dhe zgjodha informacionin e motit që përdoret në aviacionin civil si një burim të dhënash të verifikuara, përkatësisht METARI (Raporti i Aerodromit Meteorologjik) dhe TAF (TAF - Terminal Aerodrome Forecast). Në aviacion, jeta e qindra njerëzve varet nga moti, kështu që parashikimet janë sa më të sakta.

Ky informacion transmetohet XNUMX/XNUMX me zë në çdo aeroport modern në formë ATIS (Shërbimi Automatik i Informacionit të Terminalit) dhe VOLMET (nga frëngjishtja. vol - fluturim dhe Meteo - moti). E para jep informacion për motin aktual në aeroport, dhe e dyta ofron një parashikim për 24-30 orët e ardhshme, jo vetëm në aeroportin e transmetimit, por edhe në të tjerët.

Shembull i operacionit ATIS në aeroportin Vnukovo:

Një shembull se si funksionon VOLMET në Aeroportin Vnukovo

Është e papërshtatshme të mbash me vete një skaner ose transmetues radio çdo herë për diapazonin përkatës, dhe doja të krijoja një bot në Telegram që, me klikimin e një butoni, të lejon të marrësh të njëjtin parashikim. Është të paktën jopraktike të ndani një server të veçantë për këtë, si dhe të dërgoni kërkesa në shtëpinë tuaj Raspberry.

Prandaj, vendosa ta përdor shërbimin si një backend Veçoritë Selectel Cloud. Numri i kërkesave do të jetë i papërfillshëm, kështu që një shërbim i tillë do të jetë praktikisht falas (sipas llogaritjeve të mia, do të jetë 22 rubla për 100 kërkesa).

Përgatitja e backend-it

Krijo një funksion

Në panelin e kontrollit my.selectel.ru hapni pamjen Platforma e resë dhe krijoni një projekt të ri:

Parashikimi më i saktë i motit: bot për Telegram në funksionet cloud
Pasi të krijohet projekti, shkoni te seksioni Funksionet:

Parashikimi më i saktë i motit: bot për Telegram në funksionet cloud
Shtypni butonin Krijo një funksion dhe jepini emrin e dëshiruar:

Parashikimi më i saktë i motit: bot për Telegram në funksionet cloud
Pas shtypjes Krijo një funksion do të kemi një paraqitje të funksionit të krijuar:

Parashikimi më i saktë i motit: bot për Telegram në funksionet cloud
Para se të filloni të krijoni kodin në Python, do t'ju duhet të krijoni një bot në Telegram. Unë nuk do të përshkruaj se si bëhet kjo - ka udhëzime të hollësishme në bazën tonë të njohurive. Gjëja kryesore për ne është shenja e botit të krijuar.

Përgatitja e kodit

Zgjodha Administratën Kombëtare të Oqeanit dhe Atmosferës (NOAA) si një burim të dhënash të besueshme. Kjo agjenci shkencore përditëson të dhënat në kohë reale në serverin e saj në formatin TXT.

Lidhja për të marrë të dhëna METAR (vini re rastin):

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

Në rastin tim, aeroporti më i afërt është Vnukovo, kodi i tij ICAO është UUWW. Shkuarja në URL-në e krijuar do të japë sa vijon:

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

Rreshti i parë është koha aktuale e parashikimit në kohën mesatare të Greenwich. Rreshti i dytë është një përmbledhje e motit aktual. Pilotët e aviacionit civil nuk do ta kenë problem të kuptojnë se çfarë do të thotë kjo linjë, por ne kemi nevojë për një shpjegim:

  • [UUWW] - Vnukovo, Moskë (Rusi - RU);
  • [101130Z] — dita e 10-të e muajit, ora 11:30 GMT;
  • [31004 MPS] — drejtimi i erës 310 gradë, shpejtësia 4 m/s;
  • [9999] — dukshmëria horizontale 10 km ose më shumë;
  • [SCT048] — retë e shpërndara/të shpërndara në 4800 këmbë (~1584 m);
  • [24 / 13] — temperatura 24°C, pika e vesës 13°C;
  • [Q1014] — presioni (QNH) 1014 hektopaskale (750 mm Hg);
  • [R01/000070] — koeficienti i ngjitjes në korsinë 01 — 0,70;
  • [NOSIG] - pa ndryshime të rëndësishme.

Le të fillojmë të shkruajmë kodin e programit. Së pari ju duhet të importoni funksione kërkojë и pytaf:

from urllib import request
import pytaf

Specifikoni variablat dhe përgatitni funksionin e dekodimit:

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ë në TAF (rasti është gjithashtu i rëndësishëm).

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

Si 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

Le t'i kushtojmë vëmendje veçanërisht linjave TIME и BECMG. TEMPO do të thotë që moti aktual gjatë periudhës së specifikuar do të ndryshojë periodikisht. BECMG - moti do të ndryshojë gradualisht brenda një periudhe të caktuar kohore.

Kjo është, linja:

TEMPO 1012/1020 -TSRA BKN020CB

Do të thotë:

  • [1012 / 1020] - ndërmjet 12 dhe 20 orë (koha mesatare e Greenwich);
  • [-TSRA] — stuhi (TS = stuhi) me shi (RA = shi) me intensitet të ulët (shenja minus);
  • [BKN020CB] - re të konsiderueshme (BKN = thyer), kumulonimbus (CB = kumulonimbus) në 2000 këmbë (610 metra) mbi nivelin e detit.

Ka mjaft terma për fenomenet e motit, dhe kujtimi i tyre është i vështirë. Kodi për kërkesën TAF është shkruar në mënyrë të ngjashme.

Ngarkimi i kodit në cloud

Për të mos humbur kohë, le të marrim një model bot telegram nga depoja jonë re-telegram-bot. Ka një të përgatitur paraprakisht kërkesat.txt и konfigurim.py me strukturën e duhur të drejtorisë.

Meqenëse në kod do të hyjmë në modul pytaf, atëherë versioni i tij duhet të shtohet menjëherë kërkesat.txt

pytaf~=1.2.1

  • Le të kalojmë në redaktim bot/tele_bot.py. Ne heqim të gjitha gjërat e panevojshme dhe shtojmë 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 = "Привет. Это бот для получения авиационного прогноза погоды " 
          "с серверов 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)

  • Ne e paketojmë të gjithë drejtorinë në një arkiv ZIP dhe shkojmë në panelin e kontrollit te funksioni i krijuar.
  • shtyp Redakto dhe shkarkoni arkivin me kodin.

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

  • Plotësoni rrugën relative në skedar tele_bot (zgjerim .py mund të mos specifikohet) dhe një funksion i pikës fundore (në shembullin e dhënë ky është kryesor).
  • Në seksionin Variablat e Mjedisit shkruani një ndryshore TOKEN dhe caktojeni shenjën e botit të dëshiruar të telegramit.
  • shtyp Ruaj dhe Zgjero, pas së cilës shkojmë në seksion nxitësit.
  • Vendosim çelësin Kërkesa HTTPpër ta bërë publike kërkesën.

Parashikimi më i saktë i motit: bot për Telegram në funksionet cloud
Tani kemi një URL për thirrjen publike të funksionit. Gjithçka që ka mbetur është konfiguroni uebhook. Gjeni botin tonë @SelectelServerless_bot në Telegram dhe regjistroni botin tuaj me komandën:

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

Result

Nëse gjithçka është bërë si duhet, roboti juaj do të fillojë menjëherë të punojë dhe do të shfaqë raportin më të fundit të motit të aviacionit direkt në mesazher.

Parashikimi më i saktë i motit: bot për Telegram në funksionet cloud
Sigurisht, kodi mund të përmirësohet, por edhe në gjendjen e tij aktuale mjafton të zbuloni motin dhe parashikimin më të saktë nga një burim i besuar.

Versionin e plotë të kodit do ta gjeni në faqen tonë depo në GitHub.

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

Burimi: www.habr.com

Shto një koment