
Existuje spousta služeb, které poskytují informace o počasí, ale které z nich považovat za důvěryhodné? 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 oblasti, kde jezdím.
První myšlenkou bylo postavit si malou DIY meteorologickou stanici se senzory a získávat data z ní. Ale nechtěl jsem „vynalézat kolo“ a jako zdroj ověřených dat jsem zvolil informace o počasí používané v civilním letectví, konkrétně METAR (METeorological Aerodrome Report) a TAF (TAF — Terminal Aerodrome Forecast). V letectví závisí na počasí životy stovek lidí, takže předpovědi jsou maximálně přesné.
Tyto informace jsou ve zpracování k dispozici 24/7 a přenášejí se hlasem na každém moderním letišti jako ATIS (Automatic Terminal Information Service) a VOLMET (z francouzského vol — let a météo — počasí). První poskytuje informace o aktuálním počasí na letišti a druhý — předpověď na následujících 24-30 hodin, a to nejen na letišti, kde se přenáší, ale i na jiných.
Příklad funkce ATIS na letišti Vnukovo:
Příklad funkce VOLMET na letišti Vnukovo
Nosit neustále rádio nebo transceiver na odpovídající frekvenci je nepohodlné, a tak jsem chtěl vytvořit bota na Telegramu, který po stisknutí tlačítka umožní získat stejnou předpověď. Vyčleňovat na to samostatný server je nejméně neefektivní, stejně jako posílat požadavky na domácí Raspberry.
Proto jako backend jsem se rozhodl použít službu . Počet požadavků bude zanedbatelný, takže taková služba vyjde prakticky na nulu (podle mých odhadů 22 korun za 100 000 požadavků).
Příprava backendu
Vytvoření funkce
V řídicím panelu otevřeme pohled Cloudová platforma a vytvoříme nový projekt:

Jakmile je projekt vytvořen, přejdeme do sekce Funkce:

Stiskneme tlačítko Vytvořit funkci a dáme jí potřebný název:

Po stisknutí Vytvořit funkci se nám zobrazí pohled na vytvořenou funkci:

Předtím, než začneme vytvářet kód v Pythonu, bude třeba vytvořit bota na Telegramu. Popisovat, jak to udělat, nebudu — podrobný návod je . Hlavní pro nás je token vytvořeného bota.
Připravujeme kód
Jako zdroj spolehlivých dat jsem zvolil Národní úřad pro oceán a atmosféru USA (angl. National Oceanic and Atmospheric Administration, NOAA). Tento vědecký úřad aktualizuje data na svém serveru v reálném čase ve formátu TXT.
Odkaz pro získání dat METAR (vezměte na vědomí velikost písmen):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTV mém případě je nejbližším letištěm Vnukovo, jeho kód podle ICAO je UUWW. Přechod na vytvořenou URL vrátí následující:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
První řádek je čas aktuálnosti předpovědi podle Greenwichského času. Druhý řádek poskytuje shrnutí aktuálního počasí. Piloti obchodní letecké dopravy snadno pochopí, co tato řádka znamená, ale potřebujeme její rozklad:
- [UUWW] — Vnukovo, město Moskva (Rusko — RU);
- [101130Z] — 10. den měsíce, 11 hodin 30 minut podle Greenwichského času;
- [31004MPS] — směr větru 310 stupňů, rychlost 4 m/s;
- [9999] — horizontální viditelnost 10 km a více;
- [SCT048] — rozptýlené oblaky v výšce 4800 stop (~1584m);
- [24/13] — teplota 24°C, rosný bod 13°C;
- [Q1014] — tlak (QNH) 1014 hektopascalů (750 mmHg);
- [R01/000070] — koeficient adheze na dráze 01 — 0,70;
- [NOSIG] — bez významných změn.
Přejděme k psaní programového kódu. Nejprve potřebujeme importovat funkce request a pytaf:
from urllib import request
import pytafDefinujeme proměnné a připravíme funkci pro dekódová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()Přejděme k TAF (velikost písmen je také důležitá).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTStejně 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
Zvláštní pozornost věnujme řádkům TEMPO a BECMG. TEMPO znamená, že skutečné počasí se v uvedeném období bude periodicky měnit. BECMG — počasí se postupně změní v uvedeném časovém intervalu.
To znamená, že řádek:
TEMPO 1012/1020 -TSRA BKN020CBBude znamenat:
- [1012/1020] — v období od 12 do 20 hodin (podle Greenwichského času);
- [-TSRA] — bouřka (TS = thunderstorm) s deštěm (RA = rain) nízké intenzity (znak minus);
- [BKN020CB] — značná (BKN = broken), kupolovitá dešťová (CB = cumulonimbus) oblačnost ve výšce 2000 stop (610 metrů) nad mořem.
Existuje mnoho termínů, které označují meteorologické jevy, a je obtížné si je zapamatovat. Kód pro dotaz na TAF se vytváří obdobným způsobem.
Nahráváme kód do cloudu
Abychom neztráceli čas, vezmeme si šablonu telegramového bota z našeho repozitáře . Je tam předpřipravený requirements.txt a setup.py s korektní strukturou adresářů.
Protože se v kódu budeme odkazovat na modul pytaf, je nutné jeho verzi ihned přidat do requirements.txt
pytaf~=1.2.1- Přecházíme k úpravě bot/tele_bot.py. Odstraníme vše zbytečné a dopíšeme 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 = "Ahoj. Tento bot slouží k obdržení letecké předpovědi počasí "
"ze serverů NOAA. Bot je nastaven na letiště Vnukovo (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):
# Získejte informace ze serveru.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Odešlete formátovanou odpověď.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# Získejte informace ze serveru.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Odešlete formátovanou odpověď.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Router příkazů.
"""
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):
"""
Vstupní bod serverless prostředí.
"""
print(f'Bylo přijato: "{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 na "{message.text}"')
route_command(message.text.lower(), message)
- Zabalíme celý adresář do ZIP archivu a přejdeme do ovládacího panelu k vytvořené funkci.
- Klikneme Upravit a nahrajeme archiv s kódem.

- Vyplňte relativní cestu k souboru tele_bot (přípona .py není nutné uvádět) a endpoint funkce (v uvedeném příkladu je to main).
- V sekci Proměnné prostředí napíšeme proměnnou TOKEN a přiřadíme jí token potřeba telegramového bota.
- Klikneme Uložit a nasadit, po čemž přejdeme do sekce Spouštěče.
- Přepněte přepínač HTTP-žádost, aby se žádost stala veřejnou.

Máme URL pro veřejné volání funkce. Je jen potřeba . Najděte našeho bota na Telegramu a zaregistrujte svého bota příkazem:
/setwebhook <you bot token> <public URL of your function>Výsledek
Pokud je vše provedeno správně, váš bot začne okamžitě fungovat a zobrazovat aktuální přehled leteckého počasí přímo v Messengeru.

Samozřejmě, kód lze upravit, ale i v současném stavu je dostatečný na to, abyste získali nejpřesnější počasí a předpověď z ověřeného zdroje.
Celou verzi kódu naleznete v našem .
Zdroj: habr.com
