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
Preparação de back-end
Crie uma função
No painel de controle
Após a criação do projeto, vá para a seção funções:
Pressione o botão Criar uma função e dê o nome desejado:
Depois de pressionar Criar uma função teremos uma representação da função criada:
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
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
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.
- 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.
Agora temos uma URL para chamar publicamente a função. Tudo o que resta é
/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.
É 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
Fonte: habr.com