
Der findes mange tjenester, der leverer vejrinformation, men hvilken skal man stole pÄ? Da jeg begyndte at cykle ofte, Þnskede jeg at have den mest prÊcise information om vejrforholdene, der hvor jeg cykler.
Den fĂžrste tanke var at samle en lille DIY vejrmĂ„ler med sensorer og hente data fra den. Men jeg ville ikke 'opfinde cyklen' pĂ„ ny og valgte som kilde til pĂ„lidelige data den vejrinformation, der anvendes i civil luftfart, nemlig METAR (METeorological Aerodrome Report) og TAF (TAF â Terminal Aerodrome Forecast). I luftfart afhĂŠnger livet af mange mennesker af vejret, sĂ„ prognoserne er sĂ„ prĂŠcise som muligt.
Denne information transmitteres dĂžgnet rundt med stemme pĂ„ hver moderne lufthavn i form af ATIS (Automatic Terminal Information Service) og VOLMET (fra fransk, vol â flyvning og mĂ©tĂ©o â vejr). Den fĂžrste giver oplysninger om det aktuelle vejr pĂ„ lufthavnen, mens den anden giver en prognose for de nĂŠste 24-30 timer, ikke kun for lufthavnen, hvor transmissionen finder sted, men ogsĂ„ for andre.
Eksempel pÄ ATIS fra Vnukovo lufthavnen:
Eksempel pÄ VOLMET fra Vnukovo lufthavnen
At skulle slÊbe en radioscanner eller transceiver pÄ de relevante frekvenser hver gang er besvÊrligt, og jeg Þnskede at skabe en bot i Telegram, som ved et tryk pÄ en knap giver en lignende prognose. At dedikere en server til dette er i det mindste ikke hensigtsmÊssigt, ligesom at sende forespÞrgsler til en hjemme-Raspberry.
Derfor besluttede jeg at bruge tjenesten . Antallet af forespÞrgsler vil vÊre uhyre lille, sÄ en sÄdan tjeneste vil faktisk vÊre gratis (ifÞlge mine beregninger vil det koste 22 rubler for 100.000 forespÞrgsler).
Forberedelse af backend
Oprettelse af funktion
I kontrolpanelet Äbner vi visningen Cloud Platform og opretter et nyt projekt:

NÄr projektet er oprettet, gÄr vi til sektionen Functions:

Vi trykker pÄ knappen Opret funktion og giver den det Þnskede navn:

Efter at have trykket pÄ Opret funktion vil vi fÄ vist den oprettede funktion:

FĂžr vi gĂ„r i gang med at skrive koden i Python, skal vi oprette en bot i Telegram. Jeg vil ikke gĂ„ ind i detaljerne om, hvordan det gĂžres â der er en detaljeret vejledning . Det vigtigste for os er tokenet for den oprettede bot.
Vi forbereder koden
Som kilde til pÄlidelige data har jeg valgt den Nationale Oceaniske og AtmosfÊriske Administration i USA (National Oceanic and Atmospheric Administration, NOAA). Dette videnskabelige agentur opdaterer lÞbende data pÄ sin server i TXT-format.
Link til at hente METAR-data (vÊr opmÊrksom pÄ store/smÄ bogstaver):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTI mit tilfÊlde er den nÊrmeste lufthavn Vnukovo, dens ICAO-kode er UUWW. At gÄ til den genererede URL vil returnere fÞlgende:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Den fÞrste linje angiver tidspunktet for prognosens aktualitet i Greenwich. Den anden linje er en opdatering om det aktuelle vejr. Piloter i civil luftfart vil uden problemer forstÄ, hvad denne linje betyder, men vi har brug for en forklaring:
- [UUWW] â Vnukovo, byen Moskva (Rusland â RU);
- [101130Z] â 10. dag i mĂ„neden, kl. 11:30 Greenwich-tid;
- [31004MPS] â vindretning 310 grader, hastighed 4 m/s;
- [9999] â horisontal sigtbarhed 10 km eller mere;
- [SCT048] â spredte/fordelte skyer i 4800 fod (~1584 m);
- [24/13] â temperatur 24°C, dugpunkt 13°C;
- [Q1014] â tryk (QNH) 1014 hPa (750 mmHg);
- [R01/000070] â friktion pĂ„ bane 01 â 0,70;
- [NOSIG] â uden vĂŠsentlige ĂŠndringer.
Lad os begynde at skrive programmeringskoden. FĂžrst skal vi importere funktionerne request og pytaf:
from urllib import request
import pytafAngiv variablerne og forbered dekoderfunktionen:
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()Lad os gÄ videre til TAF (store bogstaver er ogsÄ vigtige).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTSom i det forrige eksempel ser vi pÄ prognosen i Vnukovo-lufthavnen:
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
Vi vil isĂŠr lĂŠgge mĂŠrke til linjerne TEMPO og BECMG. TEMPO betyder, at det aktuelle vejr i den angivne periode vil ĂŠndre sig periodisk. BECMG â vejret vil gradvist ĂŠndre sig i den angivne tidsperiode.
Det vil sige, at linjen:
TEMPO 1012/1020 -TSRA BKN020CBvil betyde:
- [1012/1020] â i perioden fra 12 til 20 timer (i Greenwich-tid);
- [-TSRA] â tordenvejr (TS = thunderstorm) med nedbĂžr (RA = rain) af lav intensitet (minus-tegn);
- [BKN020CB] â betydelig (BKN = broken), kumulonimbus (CB = cumulonimbus) skydĂŠkke i 2000 fod (610 meter) over havets overflade.
Der er mange termer, der betyder vejrfÊnomener, og det er svÊrt at huske dem. Koden til at anmode om TAF skrives pÄ samme mÄde.
Vi uploader koden til skyen
For at spare tid, lad os tage en skabelon til telegram-bot fra vores repository . Der findes en forberedt requirements.txt og setup.py med korrekt struktur af mapper.
Da vi vil referere til modulet i koden, skal vi straks tilfĂžje dets version i pytafpytaf~=1.2.1 requirements.txt
Vi gÄr videre til redigering af- bot/tele_bot.py . Vi fjerner alt unÞdvendigt og tilfÞjer vores kode.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 = "Hej. dette er en bot til at modtage luftfartsvejrprognoser " "fra NOAA-servere. Bot'en er indstillet til lufthavnen 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): # Hent information fra serveren. code = request.urlopen(URL_METAR).read().decode('utf-8') # Send formateret svar. bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard) def get_taf(message): # Hent information fra serveren. code = request.urlopen(URL_TAF).read().decode('utf-8') # Send formateret svar. bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard) def route_command(command, message): """ Kommando-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): """ Indgangspunkt for serverlÞs miljÞ. """ print(f'Modtaget: "{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 pÄ "{message.text}"') route_command(message.text.lower(), message)
Vi pakker hele mappen i en ZIP-arkiv og gÄr til kontrolpanelet for den oprettede funktion.
- Rediger
- Klik pÄ og uploader arkivet med koden. Udfyld den relative sti til filen

- tele_bot (filtypenavn .py kan udelades) og endpoint-funktionen (i det givne eksempel er dette MiljĂžvariabler main).
- I sektionen skriver vi variablen TOKEN og tildeler den tokenet til den relevante telegram-bot. Gem og implementer
- Klik pÄ , hvorefter vi gÄr til afsnittetUdlÞsere SÊtter vi kontaktknappen.
- HTTP-anmodning , for at gĂžre anmodningen offentlig., for at gĂžre anmodningen offentlig.

Vi har fÄet en URL til offentligt kald af funktionen. Det er kun tilbage at . Find vores bot pÄ Telegram og registrer din bot med kommandoen:
/setwebhook <you bot token> <public URL of your function>Resultat
Hvis alt er gjort korrekt, vil din bot straks begynde at arbejde og vise den aktuelle oversigt over luftfartsvejr direkte i messenger.

SelvfÞlgelig kan koden forbedres, men selv i dens nuvÊrende tilstand er den tilstrÊkkelig til at fÄ den mest nÞjagtige vejrudsigt og prognose fra en pÄlidelig kilde.
Du finder den fulde version af koden i vores .
Kilde: habr.com
