
Sok időjárási információt szolgáltató szerviz közül nehéz megmondani, melyikre érdemes hallgatni. Amikor gyakran elkezdtem biciklizni, pontos időjárási információkra vágytam azokról a helyekről, ahol tekerészek.
Első gondolatom egy DIY időjárási állomás összeszerelése volt érzékelőkkel, hogy az adatok neki érkezzenek. De nem akartam "újra feltalálni a spanyolviaszt", így a megbízható adatok forrásaként a polgári repülésben használt időjárási információt választottam, nevezetesen METAR (METeorológiai Aerodrome Jelentés) és TAF (TAF — Terminális Aerodrome Előrejelzés). A repülésben az időjárás élet és halál kérdése, ezért a előrejelzések a lehető legpontosabbak.
Ezek az információk 24 órás üzemmódban hanggal kerülnek továbbításra minden modern repülőtéren ATIS (Automatikus Terminális Információs Szolgáltatás) és VOLMET (a francia vol — repülés és météo — időjárás). Az első az adott repülőtér aktuális időjárásáról ad információt, míg a második a következő 24-30 órás előrejelzést, nemcsak a továbbító repülőtéren, hanem más repülőtereken is. Az ATIS Vnukovo repülőtér működése például: A VOLMET Vnukovo repülőtér működése például: Kényelmetlen minden alkalommal rádióskannert vagy a megfelelő Frekvencián működő transzivert cipelni, így szerettem volna létrehozni egy Telegram botot, ami egy gombnyomásra lehetővé teszi hasonló előrejelzések megkapását. Nem érdemes külön szervert külön erre felállítani, akárcsak nem praktikus a házi Raspberry-re bonyolítani a lekérdezéseket. Ezért a backendként az
Selectel Cloud Functions
szolgáltatását választottam. A lekérdezések száma elhanyagolható, így ez a szolgáltatás valójában ingyenes lesz (a számításaim szerint 22 rubel 100 000 lekérdezésért).
A backend előkészítése
Funkció létrehozása megnyitjuk a nézetet
Cloud Platform
és létrehozunk egy új projektet:
Miután a projekt létrejött, átmegyünk az Régi általános menü megnyitásához kattintsunk az gombra.

Adjunk neki egy megfelelő nevet: Funkciók:

A kattintás után Funkció létrehozása meg fog jelenni a létrehozott funkció nézete:

Mielőtt elkezdjük a Python kód létrehozását, szükség lesz egy Telegram bot létrehozására. Nem fogom részletezni, hogyan kell ezt tenni — részletes útmutató található Funkció létrehozása tudásbázisunkban.

A legfontosabb számunkra a létrehozott bot tokenje. Készítjük a kódot
Kódolt készség
A megbízható adatok forrásaként az Egyesült Államok Óceán- és Légköri Kutatóintézetét (angolul National Oceanic and Atmospheric Administration, NOAA) választottam. Ez a tudományos ügynökség valós időben frissíti az adatait TXT formátumban a szerverén.
A METAR adatok lekéréséhez szükséges link (figyeljen a kis- és nagybetűk használatára):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTAz én esetemben a legközelebbi repülőtér Vnukovo, ennek ICAO kódja — UUWW. A generált URL-re lépve a következő információt kapjuk:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Az első sor az előrejelzés érvényességének idejét mutatja GMT szerint. A második sor a tényleges időjárás összefoglalója. A polgári repülés pilótái könnyedén megértik, mit jelent ez a sor, de nekünk szükségünk van a dekódolásra:
- [UUWW] — Vnukovo, Moszkva város (Oroszország — RU);
- [101130Z] — a hónap 10. napja, 11 óra és 30 perc GMT szerint;
- [31004MPS] — a szél iránya 310 fok, sebesség 4 m/s;
- [9999] — a horizontális látótávolság 10 km és annál nagyobb;
- [SCT048] — szétszórt felhők 4800 láb (~1584m) magasságban;
- [24/13] — hőmérséklet 24°C, harmatpont 13°C;
- [Q1014] — nyomás (QNH) 1014 hectopascal (750 mmHg);
- [R01/000070] — a tapadási együttható az 01-es pályán — 0,70;
- [NOSIG] — jelentős változás nélkül.
Kezdjük el a programkód megírását. Először importálnunk kell a funkciókat request és pytaf:
from urllib import request
import pytafÁllítsuk be a változókat és készítsük elő a dekódoló függvényt:
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()Térjünk át a TAF-ra (a kis- és nagybetűk itt is fontosak).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTMint az előző példában, nézzük meg a Vnukovo repülőtér előrejelzését:
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
Különösen figyeljük meg a sorokat TEMPO és BECMG. A TEMPO azt jelenti, hogy a tényleges időjárás az adott időintervallumban időről időre változni fog. A BECMG — az időjárás fokozatosan megváltozik az adott időintervallumban.
Tehát a sor:
TEMPO 1012/1020 -TSRA BKN020CBAzt jelenti:
- [1012/1020] — az időintervallumban 12 és 20 óra között (GMT szerint);
- [-TSRA] — zivatar (TS = thunderstorm) esővel (RA = rain) kis intenzitással (mínuszjel);
- [BKN020CB] — jelentős (BKN = törött), gomolyfelhős (CB = cumulonimbus) felhőzet 2000 láb (610 méter) magasan a tengerszint felett.
Sok kifejezés létezik az időjárási jelenségekre, és nehéz megjegyezni őket. A TAF kérés kódját hasonló módon írjuk.
Betöltjük a kódot a felhőbe
Hogy ne pazaroljuk az időt, vegyük az időjárási bot sablonját a tárolónkból . Ott előre elkészített requirements.txt és setup.py helyes könyvtár struktúrával rendelkezik.
Mivel a kódban hivatkozni fogunk a modulra pytaf, ezért a verzióját azonnal hozzá kell adni requirements.txt
pytaf~=1.2.1- Átmegyünk a szerkesztéshez bot/tele_bot.py. Eltávolítjuk az összes felesleges elemet, és hozzáírjuk a kódunkat.
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 = "Helló. Ez egy bot az időjárási előrejelzés megszerzésére "
"a NOAA szerveréről. A bot beállítva a Vnukovo repülőtérre (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):
# Információ beszerzése a szervertől.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Formázott válasz küldése.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# Információ beszerzése a szervertől.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Formázott válasz küldése.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Parancs irányító.
"""
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 környezet belépési pontja.
"""
print(f'Fogadva: "{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 a "{message.text}"-en')
route_command(message.text.lower(), message)
- Csomagoljuk be az egész könyvtárt ZIP-archívumba, majd lépünk a vezérlőpanelre az elkészült funkcióhoz.
- Kattintunk Szerkeszteni és feltöltjük az archívumot a kóddal.

- Kitöltjük a fájl relatív útvonalát tele_bot (kiterjesztést .py nem szükséges megadni) és az elérési pont funkciót (az alábbi példában ez) main).
- A részben Környezeti változók írjuk a változót TOKEN és hozzárendeljük a kívánt telegram-bot tokenjét.
- Kattintunk Mentés és telepítés, majd lépünk a Triggered.
- Kapcsoljuk be a HTTP-kérdést, hogy a kérés nyilvános legyen.

Most már van egy URL a nyilvános funkcióhíváshoz. Csak annyit kell tennünk, hogy . Keresd a botunkat a Telegramon, és regisztráld a botodat a következő paranccsal:
/setwebhook <you bot token> <public URL of your function>Eredmény
Ha minden helyesen lett beállítva, a botod azonnal elkezd működni, és az aktuális légiforgalmi időjárási összefoglalót közvetlenül a messengerben mutatja.

Természetesen a kódot tovább lehet fejleszteni, de a jelenlegi állapotában is elegendő ahhoz, hogy a legpontosabb időjárási adatokat és előrejelzéseket kapd egy megbízható forrásból.
A kód teljes verzióját a .
Forrás: habr.com
