A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube
Hai moitos servizos que proporcionan información meteorolóxica, pero en cal debes confiar? Cando comecei a andar a miúdo en bicicleta, quería ter a información máis precisa sobre as condicións meteorolóxicas do lugar onde ando.

O meu primeiro pensamento foi construír unha pequena estación meteorolóxica de bricolaxe con sensores e recibir datos dela. Pero non "reinventei a roda" e escollín a información meteorolóxica que se usa na aviación civil como fonte de datos verificados, é dicir METAR (Informe meteorolóxico do aeródromo) e traballo (TAF - Previsión de Aeródromo Terminal). Na aviación, a vida de centos de persoas depende do tempo, polo que as previsións son o máis precisas posible.

Esta información emítese XNUMX horas ao día, XNUMX días ao día, por voz en todos os aeródromos modernos no formulario ATIS (Servizo de Información de Terminal Automático) e VOLMET (do francés. vol - voo e Météo - tempo). O primeiro ofrece información sobre o tempo real no aeródromo, e o segundo ofrece unha previsión para as próximas 24-30 horas, non só no aeródromo de emisión, senón tamén noutros.

Exemplo de operación ATIS no aeroporto de Vnukovo:

Un exemplo de como funciona VOLMET no aeroporto de Vnukovo

É un inconveniente levar contigo cada vez un radio escáner ou un transceptor para o rango correspondente, e quería crear un bot en Telegram que, con só facer clic nun botón, che permita obter a mesma previsión. Polo menos é pouco práctico asignar un servidor separado para iso, así como enviar solicitudes á túa casa Raspberry.

Polo tanto, decidín usar o servizo como backend Funcións de Selectel Cloud. O número de solicitudes será insignificante, polo que tal servizo será practicamente gratuíto (segundo os meus cálculos, será de 22 rublos por 100 solicitudes).

Preparación do backend

Crear unha función

No panel de control my.selectel.ru abrir a vista Plataforma na nube e crea un novo proxecto:

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube
Despois de crear o proxecto, vai á sección Funcións:

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube
Preme o botón Crear unha función e ponlle o nome desexado:

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube
Despois de presionar Crear unha función teremos unha representación da función creada:

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube
Antes de comezar a crear código en Python, terás que crear un bot en Telegram. Non vou describir como se fai isto: hai instrucións detalladas na nosa base de coñecemento. O principal para nós é o token do bot creado.

Preparando o código

Elixín a Administración Nacional Oceánica e Atmosférica (NOAA) como fonte de datos fiables. Esta axencia científica actualiza os datos en tempo real no seu servidor en formato TXT.

Ligazón para obter datos METAR (nótese no caso):

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

No meu caso, o aeroporto máis próximo é Vnukovo, o seu código ICAO é UUWW. Ir ao URL xerado dará o seguinte:

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

A primeira liña é a hora actual da previsión na hora media de Greenwich. A segunda liña é un resumo do tempo real. Os pilotos de aviación civil non terán ningún problema en entender o que significa esta liña, pero necesitamos unha explicación:

  • [UUWW] — Vnukovo, Moscova (Rusia — RU);
  • [101130Z] — 10o día do mes, 11:30 am GMT;
  • [31004 MPS] - dirección do vento 310 graos, velocidade 4 m/s;
  • [9999] — visibilidade horizontal de 10 km ou máis;
  • [SCT048] — nubes dispersas a 4800 pés (~1584m);
  • [24 / 13] - temperatura 24 °C, punto de orballo 13 °C;
  • [Q1014] — presión (QNH) 1014 hectopascais (750 mm Hg);
  • [R01/000070] — coeficiente de adhesión no carril 01 — 0,70;
  • [NOSIG] - sen cambios significativos.

Imos comezar a escribir o código do programa. Primeiro cómpre importar funcións solicitar и pytaf:

from urllib import request
import pytaf

Especifique as variables e prepare a 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 (o caso tamén é importante).

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

Como no exemplo anterior, vexamos a previsión no aeroporto 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

Prestemos especialmente atención ás liñas O TEMPO и BECMG. TEMPO significa que o tempo real durante o período especificado cambiará periodicamente. BECMG: o tempo cambiará gradualmente nun período de tempo especificado.

É dicir, a liña:

TEMPO 1012/1020 -TSRA BKN020CB

Significará:

  • [1012 / 1020] — entre 12 e 20 horas (hora do medio de Greenwich);
  • [-TSRA] — treboada (TS = treboada) con chuvia (RA = chuvia) de baixa intensidade (signo menos);
  • [BKN020CB] - nubes significativas (BKN = quebradas), cumulonimbus (CB = cumulonimbus) a 2000 pés (610 metros) sobre o nivel do mar.

Hai bastantes termos para os fenómenos meteorolóxicos, e lembralos é difícil. O código para a solicitude de TAF está escrito dun xeito similar.

Cargando código á nube

Para non perder tempo, collemos un modelo de bot de telegram do noso repositorio cloud-telegram-bot. Hai un preparado previamente requisitos.txt и setup.py coa estrutura de directorios correcta.

Xa que no código iremos accedendo ao módulo pytaf, entón a súa versión debería engadirse inmediatamente requisitos.txt

pytaf~=1.2.1

  • Pasemos á edición bot/tele_bot.py. Eliminamos todas as cousas innecesarias e engadimos o noso 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 o directorio nun arquivo ZIP e imos ao panel de control para a función creada.
  • Faga clic aquí Para editar e descarga o arquivo co código.

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube

  • Encha o camiño relativo no ficheiro tele_bot (extensión .py quizais non se especifique) e unha función de punto final (no exemplo dado isto é Inicio).
  • Na sección Variables de ambiente escribir unha variable FICHA e asígnelle o token do bot de telegrama desexado.
  • Faga clic aquí Gardar e expandir, despois pasamos á sección disparadores.
  • Poñemos o interruptor Solicitude HTTPpara facer pública a solicitude.

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube
Agora temos un URL para chamar publicamente a función. Todo o que queda é configurar webhook. Busca o noso bot @SelectelServerless_bot en Telegram e rexistra o teu bot co comando:

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

Resultado

Se todo se fai correctamente, o teu bot comezará a traballar inmediatamente e amosará o último informe meteorolóxico da aviación directamente no messenger.

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube
Por suposto, o código pódese mellorar, pero mesmo no seu estado actual é suficiente para descubrir o tempo e a previsión máis precisos dunha fonte de confianza.

Atoparás a versión completa do código na nosa web repositorios en GitHub.

A previsión meteorolóxica máis precisa: bot para Telegram nas funcións da nube

Fonte: www.habr.com

Engadir un comentario