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
Preparación do backend
Crear unha función
No panel de control
Despois de crear o proxecto, vai á sección Funcións:
Preme o botón Crear unha función e ponlle o nome desexado:
Despois de presionar Crear unha función teremos unha representación da función creada:
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
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
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.
- 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.
Agora temos un URL para chamar publicamente a función. Todo o que queda é
/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.
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
Fonte: www.habr.com