Има много услуги, които предоставят информация за времето, но на коя да се доверим? Когато започнах да карам често колело, исках да имам най-точна информация за метеорологичните условия на мястото, където карам.
Първата ми мисъл беше да сглобя малка DIY метеорологична станция със сензори и да получавам данни от нея. Но аз не „преоткрих колелото“ и избрах информацията за времето, която се използва в гражданската авиация като източник на проверени данни, а именно METAR (METeorological Aerodrome Report) и TAF (TAF - Прогноза за терминално летище). В авиацията животът на стотици хора зависи от времето, така че прогнозите са максимално точни.
Тази информация се излъчва денонощно с глас на всяко модерно летище във формата АТИС (Автоматична терминална информационна услуга) и VOLMET (от френски том - полет и Meteo - метеорологично време). Първият предоставя информация за действителното време на летището, а вторият - прогнозата за следващите 24-30 часа, не само на летището за излъчване, но и на други.
Пример за работа на ATIS на летище Внуково:
Пример за работа на VOLMET на летище Внуково
Всеки път е неудобно да носите радиоскенер или приемо-предавател със себе си до съответния диапазон и исках да създам бот в Telegram, който с натискане на бутон ви позволява да получите същата прогноза. Отделянето на отделен сървър за това е най-малкото нецелесъобразно, както и изпращането на заявки до домашната Raspberry.
Затова като бекенд реших да използвам услугата
Подготовка на бекенда
Създайте функция
В контролния панел
След като проектът е създаден, отидете в раздела функции:
Натиснете бутона Създайте функция и му дайте желаното име:
След натискане Създайте функция ще имаме представяне на създадената функция:
Преди да започнете да създавате код на Python, трябва да създадете бот в Telegram. Няма да описвам как се прави - има подробни инструкции
Код за готвене
Избрах Националната администрация за океаните и атмосферата (NOAA) като източник на надеждни данни. Тази научна агенция актуализира данните в реално време на своя сървър във формат TXT.
Връзка за получаване на METAR данни (обърнете внимание на регистъра):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
В моя случай най-близкото летище е Внуково, кодът му е ICAO UUWW. Навигирането до генерирания URL ще доведе до следното:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Първият ред е GMT времето за релевантност на прогнозата. Вторият ред е обобщение на действителното време. Пилотите на гражданската авиация няма да имат проблем да разберат какво означава този ред, но имаме нужда от препис:
- [UUWW] — Внуково, Москва (Русия — RU);
- [101130Z] — 10-ти ден от месеца, 11:30 GMT;
- [31004MPS] — посока на вятъра 310 градуса, скорост 4 m/s;
- [9999] — хоризонтална видимост от 10 km или повече;
- [SCT048] — разпръснати/разпръснати облаци на 4800 фута (~1584 м);
- [24 / 13] — температура 24°C, точка на оросяване 13°C;
- [Q1014] - налягане (QNH) 1014 хектопаскала (750 mm Hg);
- [R01/000070] — коефициент на сцепление на лента 01 — 0,70;
- [NOSIG] - без съществени промени.
Да започнем да пишем код. Първо трябва да импортирате функциите поиска и питаф:
from urllib import request
import pytaf
Посочете променливи и подгответе функцията за декодиране:
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()
Нека да преминем към TAF (кейсът също е важен).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Както в предишния пример, нека видим прогнозата на летище Внуково:
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
Обърнете специално внимание на линиите TEMPO и BECMG. TEMPO означава, че действителното време през определения период ще се променя периодично. BECMG - времето постепенно ще се променя през посочения интервал от време.
Това е линията:
TEMPO 1012/1020 -TSRA BKN020CB
Ще означава:
- [1012 / 1020] - в периода от 12 до 20 часа (средно време по Гринуич);
- [-TSRA] — гръмотевична буря (TS = гръмотевична буря) с дъжд (RA = дъжд) с ниска интензивност (знак минус);
- [BKN020CB] - значителна (BKN = разкъсана), купесто-дъждовна (CB = купесто-дъждовна) облачност на надморска височина от 2000 фута (610 метра).
Има много термини, които означават метеорологични явления, и е трудно да ги запомните. Кодът за TAF заявка е написан по подобен начин.
Качване на код в облака
За да не губим време, нека вземем шаблон за телеграма бот от нашето хранилище
Тъй като в кода ще се позоваваме на модула питаф, то неговата версия трябва незабавно да се добави към изисквания.txt
pytaf~=1.2.1
- Да преминем към редактирането бот/tele_bot.py. Премахваме всичко ненужно и добавяме нашия код.
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)
- Пакетираме цялата директория в ZIP архив и отиваме в контролния панел до създадената функция.
- тласък редактирам и изтеглете архива с кода.
- Попълнете относителния път във файла теле_бот (разширение .py може да се пропусне) и функция за крайна точка (в горния пример това основен).
- В раздел Променливи на средата напишете променлива ЛЕКСЕМА и му задайте токена на желания телеграм бот.
- тласък Запазване и разширяване, след което отидете в секцията тригери.
- Поставяме превключвателя HTTP заявкада направи заявката публична.
Имаме URL за извикване на публична функция. Всичко, което остава е
/setwebhook <you bot token> <public URL of your function>
Резултат
Ако всичко е направено правилно, вашият бот веднага ще започне да работи и ще покаже текущия авиационен метеорологичен доклад директно в месинджъра.
Разбира се, кодът може да бъде подобрен, но дори и в сегашното си състояние е достатъчен, за да разберете най-точното време и прогноза от доверен източник.
Можете да намерите пълната версия на кода в нашия
Източник: www.habr.com