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



Existem muitos serviços que fornecem informações meteorológicas, mas em qual acreditar? Quando comecei a pedalar muito, queria ter as informações mais precisas sobre as condições do tempo na região onde pedalo.



O 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 como fonte de dados verificados as informações meteorológicas que são utilizadas na aviação civil, nomeadamente METAR (METeorological Aerodrome Report) e TAF (TAF - Terminal Aerodrome Forecast). Na aviação, a vida de centenas de pessoas depende do clima, então as previsões são as mais precisas possíveis.



Esta informação é transmitida 24 horas por dia por voz em todos os aeroportos modernos na forma de ATIS (Serviço Automático de Informação de Terminais) e VOLMET (do francês vol - flight e météo - weather). O primeiro fornece informações sobre o tempo real no aeroporto, e o segundo - uma previsão para as próximas 24-30 horas, não apenas no aeroporto de transmissão, mas também em outros.



Um exemplo de ATIS no aeroporto de Vnukovo:




Exemplo de VOLMET no aeroporto de Vnukovo




É inconveniente carregar um rádio scanner ou transceptor comigo para a faixa correspondente todas as vezes, e eu queria criar um bot no Telegram, que, pressionando um botão, me permite obter a mesma previsão. Alocar um servidor separado para isso é pelo menos impraticável, assim como direcionar solicitações para o Raspberry doméstico.



Portanto, decidi usar o serviço Selectel Cloud Functions como back-end . O número de solicitações será insignificante, então este serviço custará virtualmente de graça (de acordo com meus cálculos, será de 22 rublos por 100.000 solicitações).



Preparação de back-end



Criação de função



No painel de controle my.selectel.ru, abra a visualização do Cloud Platform e crie um novo projeto:





Após a criação do projeto, vá para a seção Funções :





Clique no botão Criar função e dê a ele o nome desejado:





Após clicar em Criar função , teremos uma visualização da função criada:





Antes de começar a criar o código Python, você precisa criar um bot no Telegram. Não vou descrever como isso é feito - instruções detalhadas estão disponíveis em nossa base de conhecimento . O principal para nós é o token do bot criado.



Cozinhar 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 seu servidor em tempo real no 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 . Ir para 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 é o horário em que a previsão está no horário de Greenwich. A segunda linha é um resumo do clima atual. Os pilotos da aviação civil entenderão facilmente o que esta linha significa, mas precisamos de uma descriptografia:



  • [UUWW] - Vnukovo, Moscou (Rússia - RU);
  • [101130Z] - 10º dia do mês, 11:30 GMT;
  • [31004MPS] - direção do vento 310 graus, velocidade 4 m / s;
  • [9999] - visibilidade horizontal de 10 km ou mais;
  • [SCT048] - nuvens dispersas / dispersas a uma altitude de 4800 pés (~ 1584m);
  • [24/13] - temperatura 24 ° C, ponto de orvalho 13 ° C;
  • [Q1014] - 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 as funções request e pytaf :



from urllib import request
import pytaf


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


Vamos passar para o TAF (o registro também é importante).



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


Como no exemplo anterior, vamos ver a previsão do 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


Preste atenção especial às linhas TEMPO e BECMG . TEMPO significa que o clima real durante o período especificado mudará periodicamente. BECMG - o tempo mudará gradualmente durante o período de tempo especificado.



Ou seja, a linha:



TEMPO 1012/1020 -TSRA BKN020CB


Significará:



  • [1012/1020] - entre 12:00 e 20:00 (GMT);
  • [-TSRA] - trovoada (TS = trovoada) com chuva (RA = chuva) de baixa intensidade (sinal negativo);
  • [BKN020CB] Nuvens cumulonimbus (CB = cumulonimbus) significativas (BKN = quebradas) a 2.000 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 uma solicitação TAF é escrito de maneira semelhante.



Upload do código para a nuvem



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



Como no código iremos nos referir ao módulo pytaf , sua versão deve ser adicionada imediatamente a requirements.txt



pytaf~=1.2.1


  • Vamos editar bot / tele_bot.py . Removemos todos os desnecessários 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)


  • Empacote todo o diretório em um arquivo ZIP e vá para o painel de controle para a função criada.
  • .




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




Agora temos um URL para uma chamada de função pública. Resta apenas configurar o webhook . Encontre nosso bot @SelectelServerless_bot no Telegram e registre seu bot com o comando:



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


Resultado



Se tudo for feito corretamente, o seu bot começará a trabalhar imediatamente e exibirá o boletim meteorológico atual da aviação direto no messenger.





Claro, o código pode ser modificado, mas mesmo em seu estado atual, é suficiente descobrir o tempo e a previsão mais precisos de uma fonte confiável.



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






All Articles