
I servizi che forniscono informazioni sul tempo sono molto numerosi, ma a quale di essi credere? Quando ho iniziato a fare spesso ciclismo, ho voluto avere le informazioni più precise sulle condizioni meteorologiche nei luoghi in cui vado in bicicletta.
La prima idea è stata quella di assemblare una piccola stazione meteorologica fai-da-te con sensori e ricevere i dati da essa. Ma non volevo 'reinventare la ruota' e come fonte di dati verificati ho scelto le informazioni meteorologiche utilizzate nell'aviazione civile, ovvero METAR (METeorological Aerodrome Report) e TAF (TAF — Terminal Aerodrome Forecast). Nell'aviazione, le condizioni meteorologiche influenzano la vita di centinaia di persone, quindi le previsioni sono estremamente precise.
Queste informazioni vengono trasmesse in tempo reale con voce in ogni moderno aeroporto attraverso ATIS (Automatic Terminal Information Service) e VOLMET (da francese, vol — volo e météo — tempo). Il primo fornisce informazioni sulle condizioni meteorologiche attuali in aeroporto, mentre il secondo offre previsioni per le prossime 24-30 ore, non solo per l'aeroporto della trasmissione, ma anche per altri.
Esempio di funzionamento dell'ATIS dell'aeroporto di Vnukovo:
Esempio di funzionamento del VOLMET dell'aeroporto di Vnukovo
Portare sempre con sé uno scanner radio o un trasmettitore sulla gamma corrispondente è scomodo, quindi ho voluto creare un bot su Telegram che, premendo un pulsante, consenta di ricevere la stessa previsione. Dedicare un server separato per questo è perlomeno poco efficiente, così come inviare richieste al mio Raspberry domestico.
Pertanto, come backend ho deciso di usare il servizio . Il numero di richieste sarà insignificante, quindi un tale servizio costerà praticamente nulla (secondo i miei calcoli, sarà 22 rubli per 100.000 richieste).
Preparazione del backend
Creazione della funzione
Nella console di gestione apri la vista Cloud Platform e crea un nuovo progetto:

Dopo che il progetto è stato creato, passiamo alla sezione Funzioni:

Facciamo clic sul pulsante Crea funzione e assegnagli un nome appropriato:

Dopo aver fatto clic su Crea funzione ci sarà una vista della funzione creata:

Prima di iniziare a scrivere il codice in Python, sarà necessario creare un bot su Telegram. Non descriverò come farlo — c'è una guida dettagliata . L'importante per noi è il token del bot creato.
Prepariamo il codice
Come fonte di dati affidabili ho scelto la NOAA (National Oceanic and Atmospheric Administration). Questo ente scientifico aggiorna in tempo reale i dati sul proprio server in formato TXT.
Link per ottenere i dati METAR (prestare attenzione al maiuscolo):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTNel mio caso, l'aeroporto più vicino è Vnukovo, il cui codice ICAO è UUWW. L'accesso all'URL formato restituirà quanto segue:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
La prima riga indica l'orario di validità della previsione in GMT. La seconda riga è un riassunto delle condizioni meteorologiche attuali. I piloti dell'aviazione civile riconosceranno facilmente il significato di questa riga, ma abbiamo bisogno di una spiegazione:
- [UUWW] — Vnukovo, città di Mosca (Russia — RU);
- [101130Z] — 10° giorno del mese, 11 ore e 30 minuti in GMT;
- [31004MPS] — direzione del vento 310 gradi, velocità 4 m/s;
- [9999] — visibilità orizzontale 10 km o più;
- [SCT048] — nuvole sparse a un'altezza di 4800 piedi (~1584m);
- [24/13] — temperatura 24°C, punto di rugiada 13°C;
- [Q1014] — pressione (QNH) 1014 hPa (750 mmHg);
- [R01/000070] — coefficiente di aderenza sulla pista 01 — 0,70;
- [NOSIG] — senza cambiamenti significativi.
Iniziamo a scrivere il codice. Per cominciare, è necessario importare le funzioni request e pytaf:
from urllib import request
import pytafDefinire le variabili e preparare la funzione di decodifica:
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()Passiamo a TAF (anche la maiuscola è importante).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTCome nel precedente esempio, diamo un'occhiata alla previsione per l'aeroporto di 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
Presteremo particolare attenzione alle righe TEMPO e BECMG. TEMPO significa che il tempo effettivo cambierà periodicamente nel intervallo indicato. BECMG indica che il tempo cambierà gradualmente nell'intervallo di tempo specificato.
In altre parole, la riga:
TEMPO 1012/1020 -TSRA BKN020CBsignificherà:
- [1012/1020] — nell'intervallo dalle 12 alle 20 ore (in GMT);
- [-TSRA] — temporale (TS = thunderstorm) con pioggia (RA = rain) di intensità moderata (segno meno);
- [BKN020CB] — significativa (BKN = spezzata), nuvolosità cumulonembi (CB = cumulonembo) a un'altezza di 2000 piedi (610 metri) sul livello del mare.
Ci sono molti termini che indicano fenomeni meteorologici e memorizzarli è piuttosto difficile. Il codice per richiedere il TAF viene scritto in modo analogo.
Inseriamo il codice nel cloud
Per non perdere tempo, prenderemo il modello del bot di Telegram dal nostro repository . Lì c'è già un requirements.txt e setup.py con la corretta struttura delle directory.
Poiché nel codice ci riferiremo al modulo pytaf, è necessario aggiungere subito la sua versione in requirements.txt
pytaf~=1.2.1- Passiamo alla modifica bot/tele_bot.py. Rimuoviamo tutto il superfluo e aggiungiamo il nostro codice.
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 = "Ciao. Questo è un bot per ricevere previsioni meteorologiche aeree "
"dai server NOAA. Il bot è impostato per l'aeroporto di 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):
# Recupera informazioni dal server.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Invia risposta formattata.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# Recupera informazioni dal server.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Invia risposta formattata.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Router comandi.
"""
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):
"""
Punto di ingresso per ambiente serverless.
"""
print(f'Ricevuto: "{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 su "{message.text}"')
route_command(message.text.lower(), message)
- Impacchettiamo l'intera directory in un archivio ZIP e andiamo al pannello di controllo della funzione creata.
- Clicchiamo su Modifica e carichiamo l'archivio con il codice.

- Compiliamo il percorso relativo del file tele_bot (l'estensione .py può non essere specificata) e la funzione endpoint (nel caso specifico è main).
- Nella sezione Variabili d'ambiente scriviamo la variabile TOKEN e le assegniamo il token del bot di Telegram desiderato.
- Clicchiamo su Salva e distribuisci, dopodiché andiamo alla sezione Trigger.
- Abilitiamo l'interruttore Richiesta HTTP, per rendere la richiesta pubblica.

Abbiamo creato un URL per la chiamata pubblica della funzione. Resta solo . Trova il nostro bot su Telegram e registra il tuo bot con il comando:
/setwebhook <you bot token> <public URL of your function>Risultato
Se tutto è stato fatto correttamente, il tuo bot inizierà subito a funzionare e mostrerà un riepilogo aggiornato del meteo aereo direttamente nel messenger.

Naturalmente, il codice può essere ulteriormente sviluppato, ma anche nella sua attuale condizione è sufficiente per ottenere il meteo più preciso e le previsioni da una fonte affidabile.
Troverai la versione completa del codice nel nostro .
Fonte: habr.com
