Mnogo je servisa koji pružaju informacije o vremenu, ali kojem od njih vjerovati? Kada sam počeo često voziti bicikl, želio sam imati što točniju informaciju o vremenskim uvjetima u mjestu gdje vozim.
Moja prva pomisao bila je napraviti malu DIY meteorološku stanicu sa senzorima i primati podatke s nje. No, nisam “izmišljao kotač” i kao izvor provjerenih podataka odabrao informacije o vremenu koje se koriste u civilnom zrakoplovstvu, tj. METAR (METeorological Aerodrome Report) i posao (TAF - Terminal Aerodrome Forecast). U zrakoplovstvu životi stotina ljudi ovise o vremenu, pa su prognoze što točnije.
Ove informacije se emitiraju XNUMX/XNUMX putem glasa na svakom modernom aerodromu u obrascu ATIS (Automatska informacijska služba terminala) i VOLMET (s francuskog. vol - let i Meteo - vrijeme). Prvi pruža informacije o stvarnom vremenu na aerodromu, a drugi daje prognozu za sljedećih 24-30 sati, ne samo na aerodromu za emitiranje, već i na ostalima.
Primjer rada ATIS-a u zračnoj luci Vnukovo:
Primjer kako VOLMET radi u zračnoj luci Vnukovo
Nezgodno je svaki put sa sobom nositi radio skener ili primopredajnik za odgovarajući raspon, a ja sam želio napraviti bota u Telegramu koji vam na klik gumba omogućuje da dobijete istu prognozu. U najmanju ruku je nepraktično dodijeliti poseban server za to, kao i slanje zahtjeva na kućnu malinu.
Stoga sam odlučio koristiti uslugu kao backend
Priprema backenda
Napravite funkciju
U upravljačkoj ploči
Nakon što je projekt izrađen, idite na odjeljak Funkcije:
Pritisni gumb Stvorite funkciju i dajte mu željeno ime:
Nakon pritiskanja Stvorite funkciju imat ćemo prikaz stvorene funkcije:
Prije nego počnete stvarati kod u Pythonu, morat ćete izraditi bota u Telegramu. Neću opisivati kako se to radi - postoje detaljne upute
Priprema koda
Odabrao sam Nacionalnu upravu za oceane i atmosferu (NOAA) kao izvor pouzdanih podataka. Ova znanstvena agencija ažurira podatke u stvarnom vremenu na svom poslužitelju u TXT formatu.
Link za dobivanje METAR podataka (obratite pozornost na mala i mala slova):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
U mom slučaju, najbliži aerodrom je Vnukovo, njegov ICAO kod je UUWW. Odlaskom na generirani URL dobit ćete sljedeće:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Prvi red je trenutno vrijeme prognoze u srednjem vremenu po Greenwichu. Drugi red je sažetak stvarnog vremena. Piloti civilnog zrakoplovstva neće imati problema razumjeti što ova linija znači, ali trebamo objašnjenje:
- [UUWW] — Vnukovo, Moskva (Rusija — RU);
- [101130Z] — 10. dan u mjesecu, 11:30 GMT;
- [31004MPS] — smjer vjetra 310 stupnjeva, brzina 4 m/s;
- [9999] — horizontalna vidljivost 10 km ili više;
- [SCT048] — raštrkani/raspršeni oblaci na 4800 stopa (~1584m);
- [24 / 13] — temperatura 24°C, rosište 13°C;
- [Q1014] — tlak (QNH) 1014 hektopaskala (750 mm Hg);
- [R01/000070] — koeficijent prianjanja na stazi 01 — 0,70;
- [NOSIG] - bez bitnih promjena.
Počnimo pisati programski kod. Prvo morate uvesti funkcije zatražiti и pitaf:
from urllib import request
import pytaf
Navedite varijable i pripremite funkciju dekodiranja:
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()
Prijeđimo na TAF (mala i mala slova su također bitna).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Kao i u prethodnom primjeru, pogledajmo prognozu u zračnoj luci 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
Obratimo posebnu pozornost na linije TEMPO и BECMG. TEMPO znači da će se stvarno vrijeme tijekom navedenog razdoblja povremeno mijenjati. BECMG - vrijeme će se postupno mijenjati u određenom vremenskom razdoblju.
Odnosno redak:
TEMPO 1012/1020 -TSRA BKN020CB
značit će:
- [1012 / 1020] — između 12 i 20 sati (srednje vrijeme po Greenwichu);
- [-TSRA] — grmljavinsko nevrijeme (TS = thunderstorm) s kišom (RA = rain) slabog intenziteta (predznak minus);
- [BKN020CB] - značajni (BKN = isprekidani), kumulonimbusi (CB = kumulonimbusi) oblaci na 2000 stopa (610 metara) iznad razine mora.
Pojmova za vremenske pojave ima dosta i teško ih je zapamtiti. Kod za TAF zahtjev napisan je na sličan način.
Prijenos koda u oblak
Kako ne bismo gubili vrijeme, uzmimo predložak telegram bota iz našeg repozitorija
Budući da ćemo u kodu pristupati modulu pitaf, tada njegovu verziju treba odmah dodati zahtjevi.txt
pytaf~=1.2.1
- Prijeđimo na uređivanje bot/tele_bot.py. Uklanjamo sve nepotrebne stvari i dodajemo naš kod.
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)
- Spakiramo cijeli imenik u ZIP arhivu i idemo na upravljačku ploču do stvorene funkcije.
- Gurnuti Uređivanje i preuzmite arhivu s kodom.
- Ispunite relativni put u datoteci tele_bot (proširenje .py možda nije navedeno) i funkcija krajnje točke (u danom primjeru to je glavni).
- U odjeljku Varijable okoline napisati varijablu TOKEN i dodijelite mu token željenog telegram bota.
- Gurnuti Spremi i proširi, nakon čega idemo na odjeljak okidači.
- Stavili smo prekidač HTTP zahtjevda se zahtjev javno objavi.
Sada imamo URL za javno pozivanje funkcije. Sve što je ostalo je
/setwebhook <you bot token> <public URL of your function>
Rezultirati
Ako je sve učinjeno ispravno, vaš će bot odmah početi s radom i prikazati najnovije zrakoplovno vremensko izvješće izravno u messengeru.
Naravno, šifra se može poboljšati, ali čak iu trenutnom stanju dovoljna je da saznate najtočniju vremensku prognozu iz provjerenog izvora.
Punu verziju koda pronaći ćete u našem
Izvor: www.habr.com