La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube
Hay muchos servicios que brindan información sobre el clima, pero ¿en cuál confiar? Cuando comencé a andar en bicicleta con frecuencia, quería tener la información más precisa sobre las condiciones climáticas en el lugar donde viajo.

Lo primero que pensé fue montar una pequeña estación meteorológica de bricolaje con sensores y recibir datos de ella. Pero no "reinventé la rueda" y elegí como fuente de datos verificados 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). En la aviación, la vida de cientos de personas depende del tiempo, por eso las previsiones son lo más precisas posible.

Esta información se transmite las XNUMX horas del día por voz en todos los aeródromos modernos en el formulario ATIS (Servicio Automático de Información de Terminales) y VOLMETO (del francés vol - vuelo y Tiempo - clima). El primero proporciona información sobre el tiempo real en el aeródromo, y el segundo, el pronóstico para las próximas 24 a 30 horas, no sólo en el aeródromo de transmisión, sino también en otros.

Un ejemplo del funcionamiento de ATIS en el aeropuerto de Vnukovo:

Un ejemplo de operación VOLMET en el aeropuerto de Vnukovo

Cada vez es un inconveniente llevar un escáner de radio o un transceptor al rango apropiado, y quería crear un bot en Telegram que, con solo tocar un botón, le permita obtener el mismo pronóstico. Dedicar un servidor separado para esto es al menos inconveniente, así como enviar solicitudes a la Raspberry de origen.

Por eso, como backend, decidí utilizar el servicio. Funciones de la nube Selectel. El número de solicitudes será insignificante, por lo que dicho servicio será realmente gratuito (según mis cálculos, serán 22 rublos por 100 solicitudes).

Preparando el backend

Creando una función

En el panel de control mi.selectel.com vista abierta Plataforma en la nube y crear un nuevo proyecto:

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube
Una vez creado el proyecto, vaya a la sección funciones:

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube
Presione el botón Crear una función y dale el nombre deseado:

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube
Después de presionar Crear una función tendremos una representación de la función creada:

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube
Antes de comenzar a crear código Python, debes crear un bot en Telegram. No describiré cómo se hace esto; hay instrucciones detalladas. en nuestra base de conocimientos. Lo principal para nosotros es el token del bot creado.

código de cocina

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

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

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

En mi caso, el aeropuerto más cercano es Vnukovo, su código OACI es UUWW. Navegar a la URL generada producirá 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 GMT de relevancia del pronóstico. La segunda línea es un resumen del tiempo real. Los pilotos de aviación civil no tendrán problemas para entender lo que significa esta línea, pero necesitamos una transcripción:

  • [UUWW] — Vnukovo, Moscú (Rusia — RU);
  • [101130Z] — décimo día del mes, 10:11 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 4800 pies (~1584 m);
  • [24 / 13] — temperatura 24°C, punto de rocío 13°C;
  • [P1014] - presión (QNH) 1014 hectopascales (750 mm Hg);
  • [R01/000070] — coeficiente de adherencia en el carril 01 — 0,70;
  • [NOSOTROS] - sin cambios significativos.

Comencemos a escribir código. Primero necesitas importar las funciones. solicita и pytaf:

from urllib import request
import pytaf

Especifique variables y prepare 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 al TAF (el caso también es importante).

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

Como en el ejemplo anterior, veamos la previsión 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

Presta especial atención a las líneas. EL TIEMPO и BECMG. TEMPO significa que el clima real en el período especificado cambiará periódicamente. BECMG: el clima cambiará gradualmente durante el intervalo de tiempo especificado.

Esa es la línea:

TEMPO 1012/1020 -TSRA BKN020CB

Significará:

  • [1012 / 1020] - en el período comprendido entre las 12 y las 20 horas (hora media de Greenwich);
  • [-TSRA] — tormenta (TS = tormenta) con lluvia (RA = lluvia) de baja intensidad (signo menos);
  • [BKN020CB] - nubosidad significativa (BKN = rota), cumulonimbus (CB = cumulonimbus) a una altitud de 2000 pies (610 metros) sobre el nivel del mar.

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

Subir código a la nube

Para no perder el tiempo, tomemos una plantilla de bot de Telegram de nuestro repositorio. robot-telegram-en la nube. Hay un preparado previamente requerimientos.txt и configuración.py con la estructura de directorios correcta.

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

pytaf~=1.2.1

  • Pasemos a la edición. 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)

  • Empaquetamos todo el directorio en un archivo ZIP y vamos al panel de control a la función creada.
  • Haga clic aquí Editar y descargar el archivo con el código.

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube

  • Complete la ruta relativa en el archivo tele_bot (extensión py se puede omitir) y una función de punto final (en el ejemplo anterior, esta principal).
  • En la sección Variables de entorno escribe una variable SIMBÓLICO y asígnele el token del bot de Telegram deseado.
  • Haga clic aquí Guardar y expandir, luego ve a la sección Gatillos.
  • ponemos el interruptor solicitud HTTPhacer pública la solicitud.

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube
Tenemos una URL para una llamada a función pública. Todo lo que queda es configurar un webhook. Encuentra nuestro robot @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 funcionar inmediatamente y mostrará el informe meteorológico de aviación actual directamente en el Messenger.

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube
Por supuesto, el código se puede mejorar, pero incluso en su estado actual es suficiente con 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 repositorios en GitHub.

La previsión meteorológica más precisa: un bot para Telegram en funciones en la nube

Fuente: habr.com

Añadir un comentario