
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 .
