Yra daug paslaugų, teikiančių informaciją apie orus, tačiau kuria iš jų turėtumėte pasitikėti? Kai pradėjau dažnai važinėti dviračiu, norėjau turėti kuo tikslesnę informaciją apie oro sąlygas toje vietoje, kur važiuoju.
Pirma mintis buvo pastatyti nedidelę „pasidaryk pats“ orų stotį su jutikliais ir gauti iš jos duomenis. Bet aš „neišradau dviračio iš naujo“ ir kaip patikrintų duomenų šaltinį pasirinkau informaciją apie orą, kuri naudojama civilinėje aviacijoje, t. METARAS (METeorologinio aerodromo ataskaita) ir TAF (TAF – Terminal Aerodrome Forecast). Aviacijoje šimtų žmonių gyvenimas priklauso nuo oro sąlygų, todėl prognozės yra kuo tikslesnės.
Ši informacija yra transliuojama balsu 24 valandas per parą, 7 dienas per savaitę kiekviename šiuolaikiniame aerodrome ATIS (Automatinė terminalo informacijos tarnyba) ir VOLMET (iš prancūzų kalbos. t - skrydis ir Météo - oras). Pirmajame pateikiama informacija apie faktinius orus aerodrome, o antrajame – artimiausios 24-30 valandų prognozės ne tik transliuojamajame aerodrome, bet ir kituose.
ATIS operacijos Vnukovo oro uoste pavyzdys:
Pavyzdys, kaip VOLMET veikia Vnukovo oro uoste
Nepatogu kiekvieną kartą su savimi nešiotis radijo skaitytuvą ar siųstuvą-imtuvą atitinkamam diapazonui, todėl norėjau sukurti „Telegram“ robotą, kuris vienu mygtuko paspaudimu leistų gauti tą pačią prognozę. Bent jau nepraktiška tam skirti atskirą serverį, taip pat siųsti užklausas į savo namų Raspberry.
Todėl nusprendžiau naudoti paslaugą kaip užpakalinę programą
Backend paruošimas
Funkcijos kūrimas
Valdymo skydelyje
Sukūrę projektą eikite į skyrių Funkcijos:
Paspauskite mygtuką Sukurkite funkciją ir suteikite norimą pavadinimą:
Paspaudus Sukurkite funkciją turėsime sukurtos funkcijos vaizdą:
Prieš pradėdami kurti kodą „Python“, turėsite sukurti robotą „Telegram“. Neapibūdinsiu, kaip tai daroma - yra išsamios instrukcijos
Kodo paruošimas
Kaip patikimų duomenų šaltinį pasirinkau Nacionalinę vandenynų ir atmosferos administraciją (NOAA). Ši mokslinė agentūra atnaujina duomenis realiuoju laiku savo serveryje TXT formatu.
Nuoroda į METAR duomenis (atkreipkite dėmesį į atvejį):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Mano atveju artimiausias oro uostas yra Vnukovo, jo ICAO kodas yra UUWW. Nuėjus į sugeneruotą URL bus pateikta ši informacija:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Pirmoje eilutėje yra dabartinis prognozės laikas Grinvičo laiku. Antroji eilutė yra tikrojo oro santrauka. Civilinės aviacijos pilotams nebus sunku suprasti, ką ši eilutė reiškia, tačiau mums reikia paaiškinimo:
- [UUWW] — Vnukovo, Maskvos (Rusija — RU);
- [101130Z] — 10 mėnesio diena, 11:30 GMT;
- [31004MPS] — vėjo kryptis 310 laipsnių, greitis 4 m/s;
- [9999] — horizontalus matomumas 10 km ar daugiau;
- [SCT048] — 4800 pėdų (~1584 m) aukštyje išsibarstę / išsibarstę debesys;
- [24 / 13] — temperatūra 24°C, rasos taškas 13°C;
- [Q1014] — slėgis (QNH) 1014 hektopaskalių (750 mm Hg);
- [R01/000070] — sukibimo koeficientas 01 juostoje — 0,70;
- [NOSIG] – be reikšmingų pokyčių.
Pradėkime rašyti programos kodą. Pirmiausia turite importuoti funkcijas prašyti и pytaf:
from urllib import request
import pytaf
Nurodykite kintamuosius ir paruoškite dekodavimo funkciją:
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()
Pereikime prie TAF (atvejis taip pat svarbus).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Kaip ir ankstesniame pavyzdyje, pažiūrėkime į Vnukovo oro uosto prognozę:
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
Ypač atkreipkime dėmesį į linijas LAIKAS и BECMG. TEMPO reiškia, kad faktiniai orai nurodytu laikotarpiu periodiškai keisis. BECMG – orai palaipsniui keisis per tam tikrą laikotarpį.
Tai yra, eilutė:
TEMPO 1012/1020 -TSRA BKN020CB
Reiškia:
- [1012 / 1020] — nuo 12 iki 20 valandų (Grinvičo laikas);
- [-TSRA] — perkūnija (TS = perkūnija) su mažo intensyvumo lietumi (RA = lietus) (minuso ženklas);
- [BKN020CB] - reikšmingi (BKN = sulaužyti), kamuoliniai (CB = kamuoliniai) debesys 2000 pėdų (610 metrų) virš jūros lygio.
Oro reiškiniams yra gana daug terminų, kuriuos sunku prisiminti. TAF užklausos kodas parašytas panašiai.
Kodo įkėlimas į debesį
Kad negaištume laiko, paimkime iš savo saugyklos telegramos roboto šabloną
Kadangi kode mes pasieksime modulį pytaf, tada jo versija turėtų būti nedelsiant įtraukta reikalavimai.txt
pytaf~=1.2.1
- Pereikime prie redagavimo bot/tele_bot.py. Pašaliname visus nereikalingus dalykus ir pridedame savo 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)
- Supakuojame visą katalogą į ZIP archyvą ir einame į valdymo skydelį prie sukurtos funkcijos.
- Spauskite čia Redaguoti ir atsisiųskite archyvą su kodu.
- Įveskite santykinį kelią faile tele_bot (pratęsimas .py gali būti nenurodyta) ir pabaigos taško funkcija (pateiktame pavyzdyje tai yra pagrindinis).
- Skyriuje aplinkos įvairovė parašyti kintamąjį TOKENAS ir priskirkite jam norimo telegramų roboto žetoną.
- Spauskite čia Išsaugoti ir išplėsti, po kurio einame į skyrių Trigeriai.
- Įdedame jungiklį HTTP užklausakad prašymas būtų viešas.
Dabar turime URL, skirtą viešai iškviesti funkciją. Liko tik
/setwebhook <you bot token> <public URL of your function>
Rezultatas
Jei viskas bus padaryta teisingai, jūsų robotas nedelsdamas pradės veikti ir tiesiogiai messengeryje parodys naujausią aviacijos orų ataskaitą.
Žinoma, kodą galima patobulinti, tačiau net ir dabartinėje būsenoje pakanka sužinoti tiksliausią orą ir prognozę iš patikimo šaltinio.
Visą kodo versiją rasite mūsų svetainėje
Šaltinis: www.habr.com