El pronóstico del tiempo más preciso: bot para Telegram en funciones en la nube



Hay muchos servicios que brindan información meteorológica, pero ¿en cuál creer? Cuando comencé a andar mucho en bicicleta, quería tener la información más precisa sobre las condiciones climáticas en el lugar donde conduzco.



El primer pensamiento fue construir una pequeña estación meteorológica de bricolaje con sensores y recibir datos de ella. Pero no reinventé la rueda y elegí la información meteorológica que se utiliza en la aviación civil, a saber, METAR (Informe meteorológico de aeródromo) y TAF (TAF - Pronóstico de aeródromo terminal) como fuente de datos verificados . En la aviación, la vida de cientos de personas depende del clima, por lo que los pronósticos son lo más precisos posible.



Esta información se transmite las 24 horas del día por voz en todos los aeropuertos modernos en forma de ATIS (Servicio Automático de Información de Terminal) y VOLMET (del francés vol - flight y météo - weather). El primero proporciona información sobre el clima real en el aeropuerto, y el segundo, un pronóstico para las próximas 24 a 30 horas, no solo en el aeropuerto de transmisión, sino también en otros.



Un ejemplo de ATIS en el aeropuerto de Vnukovo:




Ejemplo de VOLMET en el aeropuerto de Vnukovo




Es inconveniente llevar un escáner de radio o transceptor conmigo al rango correspondiente cada vez, y quería crear un bot en Telegram, que, presionando un botón, me permite obtener el mismo pronóstico. Asignar un servidor separado para esto es al menos poco práctico, así como conducir solicitudes a la Raspberry doméstica.



Por lo tanto, decidí utilizar el servicio Selectel Cloud Functions como backend . El número de solicitudes será insignificante, por lo que este servicio costará prácticamente gratis (según mis cálculos, serán 22 rublos por cada 100.000 solicitudes).



Preparación de backend



Creación de funciones



En el panel de control my.selectel.ru, abra la vista de Cloud Platform y cree un nuevo proyecto:





Una vez creado el proyecto, vaya a la sección Funciones :





Haga clic en el botón Crear función y asígnele el nombre deseado:





Después de hacer clic en Crear función , tendremos una vista de la función creada:





Antes de comenzar a crear código Python, debe crear un bot en Telegram. No describiré cómo se hace esto; hay instrucciones detalladas disponibles en nuestra base de conocimientos . Lo principal para nosotros es el token del bot creado.



Cocinar el código



He elegido la Administración Nacional Oceánica y Atmosférica (NOAA) como fuente de datos fiables. Esta agencia científica actualiza los datos de su servidor en tiempo real en formato TXT.



Enlace para obtener datos METAR (tenga en cuenta el caso):



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


En mi caso, el aeropuerto más cercano es Vnukovo, su código ICAO es UUWW . Ir a la URL generada dará lo siguiente:



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


La primera línea es la hora en la que el pronóstico está actualizado según la hora media de Greenwich. La segunda línea es un resumen del tiempo real. Los pilotos de aviación civil entenderán fácilmente lo que significa esta línea, pero necesitamos un descifrado:



  • [UUWW] - Vnukovo, Moscú (Rusia - RU);
  • [101130Z] - 10º día del mes, 11:30 GMT;
  • [31004MPS] - dirección del viento 310 grados, velocidad 4 m / s;
  • [9999] - visibilidad horizontal de 10 km o más;
  • [SCT048] - nubes dispersas / dispersas a una altitud de 4800 pies (~ 1584 m);
  • [24/13] - temperatura 24 ° C, punto de rocío 13 ° C;
  • [Q1014] - presión (QNH) 1014 hectopascales (750 mm Hg);
  • [R01 / 000070] - coeficiente de adherencia en el carril 01 - 0,70;
  • [NOSIG] - sin cambios significativos.


Comencemos a escribir el código del programa. Primero, necesita importar las funciones de solicitud y pytaf :



from urllib import request
import pytaf


Especificar variables y preparar la función de decodificación:



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


Pasemos a TAF (el registro también es importante).



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


Como en el ejemplo anterior, veamos el pronóstico en el aeropuerto de 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


Preste especial atención a las líneas TEMPO y BECMG . TEMPO significa que el clima real durante el período especificado cambiará periódicamente. BECMG: el clima cambiará gradualmente durante el período de tiempo especificado.



Es decir, la línea:



TEMPO 1012/1020 -TSRA BKN020CB


Significará:



  • [1012/1020] - entre las 12:00 y las 20:00 (GMT);
  • [-TSRA] - tormenta (TS = tormenta) con lluvia (RA = lluvia) de baja intensidad (signo menos);
  • [BKN020CB] Nubes significativas (BKN = quebradas) cumulonimbus (CB = cumulonimbus) a 2000 pies (610 metros) sobre el nivel del mar.


Hay muchos términos para los fenómenos meteorológicos y es difícil recordarlos. El código para una solicitud de TAF está escrito de manera similar.



Subiendo el código a la nube



Para no perder el tiempo, tomemos una plantilla de bot de telegramas de nuestro repositorio de bots de telegramas en la nube . Hay un requirements.txt y setup.py preparados previamente con la estructura de directorio correcta.



Dado que en el código nos referiremos al módulo pytaf , su versión debe agregarse inmediatamente a requirements.txt



pytaf~=1.2.1


  • Vayamos a editar bot / tele_bot.py . Eliminamos todo lo innecesario y agregamos nuestro código.


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)


  • Empaquete todo el directorio en un archivo ZIP y vaya al panel de control a la función creada.
  • .




  • tele_bot ( .py ) - ( main).
  • TOKEN -.
  • , .
  • HTTP-, .




Ahora tenemos una URL para una llamada a función pública. Solo queda configurar el webhook . Encuentra nuestro bot @SelectelServerless_bot en Telegram y registra tu bot con el comando:



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


Resultado



Si todo se hace correctamente, su bot comenzará a trabajar inmediatamente y mostrará el informe meteorológico de aviación actual directamente en el mensajero.





Por supuesto, el código se puede modificar, pero incluso en su estado actual es suficiente para encontrar el tiempo y el pronóstico más precisos de una fuente confiable.



Puede encontrar la versión completa del código en nuestro repositorio en GitHub .






All Articles