La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj
Estas multaj servoj, kiuj provizas veterinformojn, sed kiun vi fidi? Kiam mi komencis bicikli ofte, mi volis havi la plej precizajn informojn pri la veterkondiĉoj en la loko kie mi veturas.

Mia unua penso estis konstrui malgrandan memfaritan veterstacion kun sensiloj kaj ricevi datumojn de ĝi. Sed mi ne "reinventis la radon" kaj elektis veterinformojn, kiuj estas uzataj en civila aviado kiel fonton de kontrolitaj datumoj, nome METAR (METeorologia Aerodroma Raporto) kaj TAF (TAF - Fina Aerodrome Forecast). En aviado, la vivo de centoj da homoj dependas de la vetero, do prognozoj estas kiel eble plej precizaj.

Ĉi tiu informo estas elsendo XNUMX/XNUMX per voĉo ĉe ĉiu moderna flughaveno en la formo ATIS (Automatic Terminal Information Service) kaj VOLMET (el la franca. vol - flugo kaj Météo - vetero). La unua provizas informojn pri la reala vetero ĉe la flughaveno, kaj la dua provizas prognozon por la venontaj 24-30 horoj, ne nur ĉe la elsenda flughaveno, sed ankaŭ ĉe aliaj.

Ekzemplo de ATIS-operacio en Vnukovo Flughaveno:

Ekzemplo de kiel VOLMET funkcias en Vnukovo Flughaveno

Estas maloportune kunporti radioskanilon aŭ radio-ricevilon ĉiufoje por la responda gamo, kaj mi volis krei bot en Telegramo kiu, je la klako de butono, ebligas al vi ricevi la saman prognozon. Estas almenaŭ nepraktike asigni apartan servilon por ĉi tio, kaj ankaŭ sendi petojn al via hejmo Raspberry.

Tial mi decidis uzi la servon kiel backend Elektu Nubajn Trajtojn. La nombro da petoj estos nekonsiderinda, do tia servo estos preskaŭ senpaga (laŭ miaj kalkuloj, ĝi estos 22 rubloj por 100 000 petoj).

Backend preparo

Krei funkcion

En la kontrolpanelo mia.selectel.ru malfermu la vidon Nuba platformo kaj kreu novan projekton:

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj
Post kiam la projekto estas kreita, iru al la sekcio Funkcioj:

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj
Premu la butonon Krei funkcion kaj donu al ĝi la deziratan nomon:

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj
Post premado Krei funkcion ni havos reprezenton de la kreita funkcio:

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj
Antaŭ ol vi komencas krei kodon en Python, vi devos krei bot en Telegramo. Mi ne priskribos kiel tio estas farita - estas detalaj instrukcioj en nia sciobazo. La ĉefa afero por ni estas la ĵetono de la kreita bot.

Preparante la kodon

Mi elektis la Nacian Oceanan kaj Atmosferan Administracion (NOAA) kiel fonton de fidindaj datumoj. Ĉi tiu scienca agentejo ĝisdatigas datumojn en reala tempo sur sia servilo en formato TXT.

Ligo por akiri METAR-datumojn (notu la kazon):

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

En mia kazo, la plej proksima flughaveno estas Vnukovo, ĝia ICAO-kodo estas UUWW. Iri al la generita URL donos la jenon:

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

La unua linio estas la nuna tempo de la prognozo en Greenwich Mean Time. La dua linio estas resumo de la reala vetero. Civilaviadaj pilotoj ne havos problemon kompreni, kion signifas ĉi tiu linio, sed ni bezonas klarigon:

  • [UUWW] — Vnukovo, Moskvo (Rusio — RU);
  • [101130Z] — 10-a tago de la monato, 11:30 GMT;
  • [31004MPS] — direkto de vento 310 gradoj, rapido 4 m/s;
  • [9999] — horizontala videbleco 10 km aŭ pli;
  • [SCT048] — disaj/disaj nuboj je 4800 futoj (~1584 m);
  • [24 / 13] — temperaturo 24°C, rosopunkto 13°C;
  • [Q1014] — premo (QNH) 1014 hektopaskaloj (750 mm Hg);
  • [R01/000070] — koeficiento de aliĝo sur vojo 01 — 0,70;
  • [NOSIG] - sen gravaj ŝanĝoj.

Ni komencu skribi programkodon. Unue vi devas importi funkciojn peto и pytaf:

from urllib import request
import pytaf

Specifu la variablojn kaj preparu la malkodan funkcion:

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

Ni transiru al TAF (kazo ankaŭ gravas).

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

Kiel en la antaŭa ekzemplo, ni rigardu la prognozon ĉe la flughaveno 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

Ni precipe atentu la liniojn TEMPO и BECMG. TEMPO signifas, ke la reala vetero dum la specifita periodo ŝanĝiĝos periode. BECMG - la vetero iom post iom ŝanĝiĝos en difinita tempodaŭro.

Tio estas, la linio:

TEMPO 1012/1020 -TSRA BKN020CB

Signifos:

  • [1012 / 1020] — inter 12 kaj 20 horoj (Greenviĉa meztempo);
  • [-TSRA] — fulmotondro (TS = fulmotondro) kun pluvo (RA = pluvo) de malalta intenseco (minussigno);
  • [BKN020CB] - signifaj (BKN = rompita), kumulonimbo (CB = kumulonimbo) nuboj je 2000 futoj (610 metroj) super la marnivelo.

Estas sufiĉe multaj terminoj por veterfenomenoj, kaj memori ilin estas malfacile. La kodo por la TAF-peto estas skribita en simila maniero.

Alŝutante kodon al la nubo

Por ne perdi tempon, ni prenu ŝablonon de telegrama bot el nia deponejo nubo-telegramo-bot. Estas antaŭpreparita postuloj.txt и Setup.py kun la ĝusta dosierujo-strukturo.

Ĉar en la kodo ni aliros la modulon pytaf, tiam ĝia versio devus esti tuj aldonita al postuloj.txt

pytaf~=1.2.1

  • Ni transiru al redaktado bot/tele_bot.py. Ni forigas ĉiujn nenecesajn aferojn kaj aldonas nian kodon.

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)

  • Ni pakas la tutan dosierujon en ZIP-arkivon kaj iras al la kontrolpanelo al la kreita funkcio.
  • Puŝi Redaktu kaj elŝutu la arkivon kun la kodo.

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj

  • Plenigu la relativan vojon en la dosiero tele_bot (etendo .py eble ne estas specifita) kaj finpunktofunkcio (en la ekzemplo donita ĉi tio estas ĉefa).
  • sekcio Mediaj variabloj skribu variablon ĴETONO kaj asignu al ĝi la ĵetonon de la dezirata telegrambot.
  • Puŝi Konservu kaj Vastigu, post kio ni iras al la sekcio ellasiloj.
  • Ni metas la ŝaltilon HTTP-petopor publikigi la peton.

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj
Ni nun havas URL por publike voki la funkcion. Restas nur agordi rethook. Trovu nian bot @SelectelServerless_bot en Telegramo kaj registri vian bot per la komando:

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

rezulto

Se ĉio estas farita ĝuste, via bot tuj ekfunkcios kaj montros la lastan aviadan veterraporton rekte en la mesaĝisto.

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj
Kompreneble, la kodo estas plibonigebla, sed eĉ en ĝia nuna stato sufiĉas ekscii la plej precizan veteron kaj prognozon el fidinda fonto.

Vi trovos la plenan version de la kodo en nia deponejoj sur GitHub.

La plej preciza veterprognozo: bot por Telegram pri nubaj funkcioj

fonto: www.habr.com

Aldoni komenton