Existuje mnoho služeb, které poskytují informace o počasí, ale které z nich byste měli věřit? Když jsem začal často jezdit na kole, chtěl jsem mít co nejpřesnější informace o povětrnostních podmínkách v místě, kde jezdím.
Moje první myšlenka byla postavit malou DIY meteostanici se senzory a přijímat z ní data. Ale „nevynalézal jsem kolo“ a jako zdroj ověřených dat jsem zvolil informace o počasí, které se používají v civilním letectví, a to METAR (Meteorologická zpráva o letišti) a TAF (TAF - Terminal Aerodrome Forecast). V letectví závisí na počasí život stovek lidí, takže předpovědi jsou co nejpřesnější.
Tyto informace jsou vysílány XNUMX/XNUMX hlasem na každém moderním letišti ve formuláři ATIS (Automatická informační služba terminálu) a VOLMET (z francouzštiny vol - let a Météo - počasí). První poskytuje informace o aktuálním počasí na letišti a druhý poskytuje předpověď na dalších 24-30 hodin nejen na vysílaném letišti, ale i na dalších.
Příklad provozu ATIS na letišti Vnukovo:
Příklad, jak funguje VOLMET na letišti Vnukovo
Je nepohodlné nosit s sebou rádiový skener nebo transceiver pokaždé pro odpovídající rozsah a chtěl jsem vytvořit robota v Telegramu, který vám kliknutím na tlačítko umožní získat stejnou předpověď. Je přinejmenším nepraktické k tomu přidělovat samostatný server, stejně jako zasílání požadavků na domácí Raspberry.
Proto jsem se rozhodl službu využít jako backend
Příprava backendu
Vytvoření funkce
V ovládacím panelu
Po vytvoření projektu přejděte do sekce funkce:
Stiskněte tlačítko Vytvořte funkci a dejte mu požadovaný název:
Po stisknutí Vytvořte funkci budeme mít reprezentaci vytvořené funkce:
Než začnete vytvářet kód v Pythonu, budete muset vytvořit robota v Telegramu. Nebudu popisovat, jak se to dělá - existují podrobné pokyny
Příprava kódu
Jako zdroj spolehlivých dat jsem zvolil Národní úřad pro oceán a atmosféru (NOAA). Tato vědecká agentura aktualizuje data v reálném čase na svém serveru ve formátu TXT.
Odkaz pro získání dat METAR (všimněte si případu):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
V mém případě je nejbližší letiště Vnukovo, jeho ICAO kód je UUWW. Přechod na vygenerovanou adresu URL poskytne následující:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
První řádek je aktuální čas předpovědi v Greenwichském středním čase. Druhý řádek je souhrn aktuálního počasí. Piloti civilního letectví nebudou mít problém pochopit, co tento řádek znamená, ale potřebujeme vysvětlení:
- [UUWW] — Vnukovo, Moskva (Rusko – RU);
- [101130Z] — 10. den v měsíci, 11:30 GMT;
- [31004MPS] — směr větru 310 stupňů, rychlost 4 m/s;
- [9999] — vodorovná viditelnost 10 km nebo více;
- [SCT048] — rozptýlené/rozptýlené mraky ve výšce 4800 stop (~1584 m);
- [24 / 13] — teplota 24°C, rosný bod 13°C;
- [Q1014] — tlak (QNH) 1014 hektopascalů (750 mm Hg);
- [R01/000070] — koeficient adheze na dráze 01 — 0,70;
- [NOSIG] - bez výrazných změn.
Začněme psát programový kód. Nejprve musíte importovat funkce požádat и pytaf:
from urllib import request
import pytaf
Zadejte proměnné a připravte dekódovací funkci:
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()
Přejděme k TAF (důležité je i pouzdro).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Stejně jako v předchozím příkladu se podívejme na předpověď na letišti 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
Pozor si dejte především na čáry TEMPO и BECMG. TEMPO znamená, že se aktuální počasí během zadaného období bude periodicky měnit. BECMG - počasí se bude postupně měnit ve stanoveném časovém období.
Tedy řádek:
TEMPO 1012/1020 -TSRA BKN020CB
Bude znamenat:
- [1012 / 1020] — mezi 12 a 20 hodinami (greenwichský čas);
- [-TSRA] — bouřka (TS = bouřka) s deštěm (RA = déšť) nízké intenzity (znaménko mínus);
- [BKN020CB] - významné (BKN = rozbité), kupovité (CB = cumulonimbus) mraky ve výšce 2000 stop (610 metrů) nad mořem.
Termínů pro jevy počasí je poměrně hodně a zapamatovat si je je těžké. Kód pro požadavek TAF je napsán podobným způsobem.
Nahrávání kódu do cloudu
Abychom neztráceli čas, vezmeme si šablonu telegramového bota z našeho úložiště
Protože v kódu budeme přistupovat k modulu pytaf, pak by měla být jeho verze okamžitě přidána do požadavky.txt
pytaf~=1.2.1
- Pojďme k úpravám bot/tele_bot.py. Odstraňujeme všechny nepotřebné věci a přidáváme náš kód.
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)
- Celý adresář zabalíme do ZIP archivu a přejdeme na ovládací panel k vytvořené funkci.
- Klikněte zde Edit a stáhněte si archiv s kódem.
- Vyplňte relativní cestu v souboru tele_bot (rozšíření .py nemusí být specifikováno) a funkce koncového bodu (v uvedeném příkladu to je hlavní).
- V sekci Proměnné prostředí napsat proměnnou ŽETON a přiřaďte mu token požadovaného telegramového robota.
- Klikněte zde Uložit a rozbalit, načež přejdeme do oddílu Spouští.
- Dali jsme vypínač HTTP požadavekaby byl požadavek veřejný.
Nyní máme URL pro veřejné volání funkce. Zbývá už jen
/setwebhook <you bot token> <public URL of your function>
Výsledek
Pokud je vše provedeno správně, váš bot začne okamžitě pracovat a zobrazí nejnovější zprávu o leteckém počasí přímo v messengeru.
Kód lze samozřejmě vylepšit, ale i v aktuálním stavu stačí zjistit co nejpřesnější počasí a předpověď z důvěryhodného zdroje.
Plnou verzi kódu najdete v našem
Zdroj: www.habr.com