Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud
Esistono molti servizi che forniscono informazioni meteorologiche, ma di quale dovresti fidarti? Quando ho iniziato a pedalare frequentemente, volevo avere informazioni più precise sulle condizioni meteorologiche del luogo in cui pedalo.

Il mio primo pensiero è stato quello di costruire una piccola stazione meteorologica fai-da-te con sensori e riceverne i dati. Ma non ho “reinventato la ruota” e ho scelto le informazioni meteorologiche utilizzate nell’aviazione civile come fonte di dati verificati, vale a dire METARO (Rapporto MEteorologico dell'Aerodromo) e TAF (TAF - Previsione Terminal Aerodromo). Nel settore dell'aviazione, la vita di centinaia di persone dipende dalle condizioni meteorologiche, quindi le previsioni sono quanto più accurate possibile.

Queste informazioni vengono trasmesse a voce XNUMX ore su XNUMX, XNUMX giorni su XNUMX in ogni aeroporto moderno sotto forma di modulo ATI (Servizio automatico di informazioni sui terminali) e VOLMET (dal francese. vol - volo e Tempo - tempo atmosferico). Il primo fornisce informazioni sul tempo reale presso l'aerodromo e il secondo fornisce previsioni per le prossime 24-30 ore, non solo presso l'aerodromo trasmesso, ma anche in altri.

Esempio di operazione ATIS all'aeroporto di Vnukovo:

Un esempio di come funziona VOLMET all'aeroporto di Vnukovo

È scomodo portare ogni volta con sé una radio scanner o un ricetrasmettitore per la portata corrispondente, e volevo creare un bot in Telegram che, con un semplice clic, ti permetta di ottenere la stessa previsione. È almeno poco pratico allocare un server separato per questo, così come inviare richieste al tuo Raspberry di casa.

Pertanto, ho deciso di utilizzare il servizio come backend Seleziona Funzionalità cloud. Il numero di richieste sarà trascurabile, quindi tale servizio sarà praticamente gratuito (secondo i miei calcoli saranno 22 rubli per 100 richieste).

Preparazione del back-end

Crea una funzione

Nel pannello di controllo my.selectel.ru aprire la vista Piattaforma cloud e creare un nuovo progetto:

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud
Dopo aver creato il progetto, vai alla sezione funzioni:

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud
Spingere il pulsante Crea una funzione e dagli il nome desiderato:

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud
Dopo aver premuto Crea una funzione avremo una rappresentazione della funzione creata:

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud
Prima di iniziare a creare codice in Python, dovrai creare un bot in Telegram. Non descriverò come è fatto: ci sono istruzioni dettagliate nella nostra base di conoscenza. La cosa principale per noi è il token del bot creato.

Preparazione del codice

Ho scelto la National Oceanic and Atmospheric Administration (NOAA) come fonte di dati affidabili. Questa agenzia scientifica aggiorna i dati in tempo reale sul suo server in formato TXT.

Link per ottenere i dati METAR (notare il caso):

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

Nel mio caso, l'aeroporto più vicino è Vnukovo, il suo codice ICAO è UUWW. Andando all'URL generato verrà visualizzato quanto segue:

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

La prima riga è l'ora attuale della previsione nel meridiano di Greenwich. La seconda riga è un riepilogo del tempo reale. I piloti dell'aviazione civile non avranno problemi a capire cosa significa questa riga, ma abbiamo bisogno di una spiegazione:

  • [UUWW] — Vnukovo, Mosca (Russia — RU);
  • [101130Z] — 10 del mese, 11:30 GMT;
  • [31004MPS] — direzione del vento 310 gradi, velocità 4 m/s;
  • , — visibilità orizzontale pari o superiore a 10 km;
  • [SCT048] — nubi sparse/sparse a 4800 piedi (~1584 m);
  • [24 / 13] — temperatura 24°C, punto di rugiada 13°C;
  • [Q1014] — pressione (QNH) 1014 ettopascal (750 mm Hg);
  • [R01/000070] — coefficiente di aderenza sulla corsia 01 — 0,70;
  • [NOSIG] - senza cambiamenti significativi.

Iniziamo a scrivere il codice del programma. Per prima cosa devi importare funzioni richiesta и pytaf:

from urllib import request
import pytaf

Specificare 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 al TAF (importante è anche il caso).

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

Come nell'esempio precedente, diamo un'occhiata alle previsioni 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

Prestiamo particolare attenzione alle linee TEMPO и BECMG. TEMPO significa che il tempo reale durante il periodo specificato cambierà periodicamente. BECMG: il tempo cambierà gradualmente entro un periodo di tempo specificato.

Cioè, la riga:

TEMPO 1012/1020 -TSRA BKN020CB

Significherà:

  • [1012 / 1020] — tra le 12 e le 20 ore (ora di Greenwich);
  • [-TSRA] — temporale (TS = temporale) con pioggia (RA = pioggia) di bassa intensità (segno meno);
  • [BKN020CB] - nubi significative (BKN = spezzate), cumulonembi (CB = cumulonembi) a 2000 piedi (610 metri) sopra il livello del mare.

Esistono molti termini per descrivere i fenomeni meteorologici ed è difficile ricordarli. Il codice per la richiesta TAF è scritto in modo simile.

Caricamento del codice sul cloud

Per non perdere tempo, prendiamo un modello di bot di Telegram dal nostro repository cloud-telegram-bot. C'è un pre-preparato requirements.txt и setup.py con la struttura di directory corretta.

Poiché nel codice accederemo al modulo pytaf, la sua versione dovrebbe essere immediatamente aggiunta requirements.txt

pytaf~=1.2.1

  • Passiamo alla modifica bot/tele_bot.py. Rimuoviamo tutte le cose non necessarie 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 = "Привет. Это бот для получения авиационного прогноза погоды " 
          "с серверов 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)

  • Imballiamo l'intera directory in un archivio ZIP e andiamo al pannello di controllo alla funzione creata.
  • Clicca qui Редактировать e scarica l'archivio con il codice.

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud

  • Compilare il percorso relativo nel file tele_bot (estensione .py potrebbe non essere specificato) e una funzione endpoint (nell'esempio fornito è principale).
  • Nella sezione variabili ambientali scrivere una variabile GETTONE e assegnagli il token del bot telegram desiderato.
  • Clicca qui Salva ed espandi, dopodiché andiamo alla sezione trigger.
  • Mettiamo l'interruttore Richiesta HTTPrendere pubblica la richiesta.

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud
Ora abbiamo un URL per chiamare pubblicamente la funzione. Tutto ciò che resta è configurare il webhook. Trova il nostro bot @SelectelServerless_bot in Telegram e registra il tuo bot con il comando:

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

risultato

Se tutto è stato eseguito correttamente, il tuo bot inizierà immediatamente a funzionare e visualizzerà l'ultimo bollettino meteorologico dell'aviazione direttamente nel messenger.

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud
Naturalmente, il codice può essere migliorato, ma anche nel suo stato attuale è sufficiente scoprire il tempo e le previsioni più accurate da una fonte attendibile.

Troverai la versione completa del codice nel nostro repository su GitHub.

Le previsioni del tempo più accurate: un bot per Telegram sulle funzioni cloud

Fonte: habr.com

Aggiungi un commento