A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem
Existem muitos serviços que fornecem informações meteorológicas, mas em qual deles você deve confiar? Quando comecei a pedalar com frequência, queria ter informações mais precisas sobre as condições climáticas do local onde pedalo.

Meu primeiro pensamento foi construir uma pequena estação meteorológica DIY com sensores e receber dados dela. Mas não “reinventei a roda” e escolhi a informação meteorológica que é utilizada na aviação civil como fonte de dados verificados, nomeadamente METAR (Relatório MEteorológico do Aeródromo) e TAF (TAF - Previsão do Aeródromo Terminal). Na aviação, a vida de centenas de pessoas depende do clima, por isso as previsões são tão precisas quanto possível.

Esta informação é transmitida XNUMX horas por dia, XNUMX dias por semana, por voz, em todos os aeródromos modernos, na forma ATIS (Serviço Automático de Informações de Terminal) e VOLUME (do francês vol - voo e Tempo - clima). O primeiro fornece informações sobre o clima real no aeródromo e o segundo fornece uma previsão para as próximas 24 a 30 horas, não apenas no aeródromo de transmissão, mas também em outros.

Exemplo de operação ATIS no Aeroporto de Vnukovo:

Um exemplo de como o VOLMET funciona no aeroporto de Vnukovo

É inconveniente carregar sempre um scanner de rádio ou transceptor com você para o alcance correspondente, e eu queria criar um bot no Telegram que, com o clique de um botão, permite obter a mesma previsão. É no mínimo impraticável alocar um servidor separado para isso, bem como enviar solicitações para o Raspberry doméstico.

Portanto, decidi usar o serviço como backend Recursos selecionados da nuvem. O número de solicitações será insignificante, portanto, esse serviço será praticamente gratuito (de acordo com meus cálculos, serão 22 rublos por 100 solicitações).

Preparação de back-end

Crie uma função

No painel de controle meu.selectel.ru abra a visualização Plataforma em nuvem e crie um novo projeto:

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem
Após a criação do projeto, vá para a seção funções:

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem
Pressione o botão Criar uma função e dê o nome desejado:

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem
Depois de pressionar Criar uma função teremos uma representação da função criada:

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem
Antes de começar a criar código em Python, você precisará criar um bot no Telegram. Não vou descrever como isso é feito - há instruções detalhadas em nossa base de conhecimento. O principal para nós é o token do bot criado.

Preparando o código

Escolhi a Administração Oceânica e Atmosférica Nacional (NOAA) como fonte de dados confiáveis. Esta agência científica atualiza os dados em tempo real em seu servidor em formato TXT.

Link para obter dados METAR (observe o caso):

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

No meu caso, o aeroporto mais próximo é Vnukovo, seu código ICAO é UUWW. Acessar o URL gerado fornecerá o seguinte:

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

A primeira linha é a hora atual da previsão no horário de Greenwich. A segunda linha é um resumo do clima real. Os pilotos da aviação civil não terão problemas em entender o que esta linha significa, mas precisamos de uma explicação:

  • [UUWW] — Vnukovo, Moscovo (Rússia — RU);
  • [101130Z] — 10º dia do mês, 11h30 GMT;
  • [31004 MPS] — direção do vento 310 graus, velocidade 4 m/s;
  • [9999] — visibilidade horizontal igual ou superior a 10 km;
  • [SCT048] — nuvens dispersas/dispersas a 4800 pés (~1584 m);
  • [24 / 13] — temperatura 24°C, ponto de orvalho 13°C;
  • [T1014] — pressão (QNH) 1014 hectopascais (750 mm Hg);
  • [R01/000070] — coeficiente de aderência na pista 01 — 0,70;
  • [NOSIG] - sem alterações significativas.

Vamos começar a escrever o código do programa. Primeiro você precisa importar funções solicitar и pitaf:

from urllib import request
import pytaf

Especifique as variáveis ​​e prepare a função de decodificação:

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

Passemos ao TAF (o caso também é importante).

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

Como no exemplo anterior, vejamos a previsão 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 especial atenção às linhas TEMPO и BECMG. TEMPO significa que o clima real durante o período especificado mudará periodicamente. BECMG - o clima mudará gradualmente dentro de um período de tempo especificado.

Ou seja, a linha:

TEMPO 1012/1020 -TSRA BKN020CB

Significará:

  • [1012 / 1020] — entre 12 e 20 horas (horário de Greenwich);
  • [-TSRA] — trovoada (TS = trovoada) com chuva (RA = chuva) de fraca intensidade (sinal menos);
  • [BKN020CB] - nuvens significativas (BKN = quebradas), cumulonimbus (CB = cumulonimbus) a 2000 pés (610 metros) acima do nível do mar.

Existem muitos termos para fenômenos climáticos e é difícil lembrá-los. O código para a solicitação TAF é escrito de maneira semelhante.

Upload de código para a nuvem

Para não perder tempo, vamos pegar um modelo de bot de telegrama do nosso repositório bot de telegrama em nuvem. Existe um pré-preparado requisitos.txt и setup.py com a estrutura de diretório correta.

Já que no código estaremos acessando o módulo pitaf, então sua versão deve ser adicionada imediatamente a requisitos.txt

pytaf~=1.2.1

  • Vamos passar para a edição bot/tele_bot.py. Removemos todas as coisas desnecessárias e adicionamos nosso 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)

  • Empacotamos todo o diretório em um arquivo ZIP e vamos ao painel de controle para a função criada.
  • Clique aqui Editar e baixe o arquivo com o código.

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem

  • Preencha o caminho relativo no arquivo tele_bot (extensão .py não pode ser especificado) e uma função de ponto final (no exemplo dado, isso é principal).
  • Na seção variáveis ​​ambientais escreva uma variável SÍMBOLO e atribua a ele o token do bot de telegrama desejado.
  • Clique aqui Salvar e expandir, após o qual vamos para a seção Gatilhos.
  • Colocamos o interruptor Solicitação HTTPpara tornar a solicitação pública.

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem
Agora temos uma URL para chamar publicamente a função. Tudo o que resta é configurar webhook. Encontre nosso bot @SelectelServerless_bot no Telegram e cadastre seu bot com o comando:

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

resultado

Se tudo for feito corretamente, seu bot começará a funcionar imediatamente e exibirá o último boletim meteorológico da aviação diretamente no messenger.

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem
É claro que o código pode ser melhorado, mas mesmo em seu estado atual é suficiente descobrir o clima e a previsão mais precisos de uma fonte confiável.

Você encontrará a versão completa do código em nosso repositórios no GitHub.

A previsão do tempo mais precisa: um bot para Telegram nas funções da nuvem

Fonte: habr.com

Adicionar um comentário