
Det finns mÄnga tjÀnster som tillhandahÄller vÀderinformation, men vilken av dem ska man lita pÄ? NÀr jag började cykla ofta ville jag ha den mest exakta informationen om vÀderförhÄllandena dÀr jag cyklar.
Den första tanken var att bygga en liten DIY vĂ€derstation med sensorer och hĂ€mta data frĂ„n den. Men jag ville inte "uppfinna hjulet" och valde som kĂ€lla för verifierad data vĂ€derinformation som anvĂ€nds inom civil luftfart, nĂ€mligen METAR (METeorological Aerodrome Report) och TAF (TAF â Terminal Aerodrome Forecast). Inom luftfarten beror hundratals mĂ€nniskors liv pĂ„ vĂ€dret, sĂ„ prognoserna Ă€r sĂ„ exakta som möjligt.
Den hĂ€r informationen sĂ€nds dygnet runt i tal pĂ„ varje modern flygplats i form av ATIS (Automatic Terminal Information Service) och VOLMET (frĂ„n franskans vol â flyg och mĂ©tĂ©o â vĂ€der). Den första ger information om den aktuella vĂ€dret pĂ„ flygplatsen, medan den andra ger prognoser för de nĂ€rmaste 24-30 timmarna, inte bara för flygplatsen dĂ€r sĂ€ndningen görs, utan ocksĂ„ för andra.
Exempel pÄ ATIS frÄn Vnukovo-flygplatsen:
Exempel pÄ VOLMET frÄn Vnukovo-flygplatsen
Att konstant bÀra med sig en radioscanner eller transceiver pÄ rÀtt frekvens Àr besvÀrligt, sÄ jag ville skapa en bot i Telegram som med ett knapptryck ger samma prognos. Att avsÀtta en separat server för detta Àr minst sagt oklokt, liksom att skicka begÀrningar till en hemmaanordnad Raspberry.
DÀrför beslutade jag att anvÀnda tjÀnsten . Antalet förfrÄgningar kommer att vara försumbar, sÄ en sÄdan tjÀnst blir nÀstan gratis (enligt mina berÀkningar kommer det att kosta 22 rubel för 100 000 förfrÄgningar).
Förberedelse av backend
Skapa en funktion
I kontrollpanelen öppnar vi vyn Molnplattform och skapar ett nytt projekt:

NÀr projektet Àr skapat gÄr vi till avsnittet Funktioner:

Vi trycker pÄ knappen Skapa funktion och ger den ett lÀmpligt namn:

Efter att ha tryckt pÄ Skapa funktion fÄr vi upp vyn för den skapade funktionen:

Innan vi börjar skapa koden i Python, behöver vi skapa en bot i Telegram. Jag kommer inte att beskriva hur det görs â det finns en detaljerad instruktion . Det viktigaste för oss Ă€r token för den skapade boten.
Vi förbereder koden
Som kÀlla för pÄlitliga data har jag valt den amerikanska national oceaniska och atmosfÀriska förvaltningen (NOAA). Detta vetenskapliga byrÄ uppdaterar i realtid data pÄ sin server i TXT-format.
LÀnk för att hÀmta METAR-data (observera storleken):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTI mitt fall Àr den nÀrmaste flygplatsen Vnukovo, dess ICAO-kod Àr UUWW. Att gÄ till den genererade URL:en kommer att ge följande:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Den första raden Àr tiden för prognosens aktualitet enligt Greenwich. Den andra raden Àr en sammanfattning av det faktiska vÀdret. Civilflygplanspiloter kommer utan problem att förstÄ vad denna rad innebÀr, men vi behöver en förklaring:
- [UUWW] â Vnukovo, stad Moskva (Ryssland â RU);
- [101130Z] â den 10:e dagen i mĂ„naden, klockan 11:30 enligt Greenwich;
- [31004MPS] â vindriktningen Ă€r 310 grader, hastigheten Ă€r 4 m/s;
- [9999] â horisontell sikt 10 km eller mer;
- [SCT048] â spridda moln pĂ„ en höjd av 4800 fot (~1584 m);
- [24/13] â temperatur 24°C, daggpunkt 13°C;
- [Q1014] â tryck (QNH) 1014 hektopascal (750 mmHg);
- [R01/000070] â greppkoefficient pĂ„ bana 01 â 0,70;
- [NOSIG] â utan betydande förĂ€ndringar.
Vi gÄr till kodningen. Först mÄste vi importera funktionerna request och pytaf:
from urllib import request
import pytafAnge variabler och förbered avkodningsfunktionen:
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()LÄt oss gÄ till TAF (registreringen Àr ocksÄ viktig).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTSom i det föregÄende exemplet, lÄt oss titta pÄ prognosen för flygplatsen 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
Vi ska speciellt notera raderna TEMPO och BECMG. TEMPO betyder att det faktiska vĂ€dret kommer att förĂ€ndras periodiskt under den angivna tidsperioden. BECMG â vĂ€dret kommer gradvis att förĂ€ndras under den angivna tidsperioden.
Det vill sÀga raden:
TEMPO 1012/1020 -TSRA BKN020CBKommer att innebÀra:
- [1012/1020] â under tidsperioden frĂ„n 12 till 20 timmar (enligt Greenwich);
- [-TSRA] â Ă„ska (TS = thunderstorm) med regn (RA = rain) av liten intensitet (minus-tecken);
- [BKN020CB] â betydande (BKN = bruten), cumulusregn (CB = cumulonimbus) molntĂ€cke pĂ„ 2000 fot (610 meter) över havet.
Det finns mÄnga termer som beskriver vÀderfenomen, och det kan vara svÄrt att komma ihÄg dem. TAF-förfrÄgningskoden skrivs pÄ ett liknande sÀtt.
Vi laddar upp koden till molnet
För att inte slösa tid tar vi en mall för en Telegram-bot frÄn vÄrt repository . DÀr finns en fÀrdigstÀlld requirements.txt och setup.py med en korrekt katalogstruktur.
Eftersom vi kommer att referera till modulen i koden pytaf, bör vi genast lÀgga till dess version i requirements.txt
pytaf~=1.2.1- LÄt oss gÄ vidare till redigering av bot/tele_bot.py. Vi tar bort allt onödigt och skriver till vÄrt 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 = "Hej. Detta Àr en bot för att fÄ flygvÀderprognoser "
"frÄn NOAA:s servrar. Botten Àr instÀlld pÄ flygplatsen 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):
# HÀmta information frÄn servern.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Skicka formaterat svar.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# HÀmta information frÄn servern.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Skicka formaterat svar.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Kommandorouter.
"""
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):
"""
IngÄngspunkt för serverlös miljö.
"""
print(f'Mottagen: "{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 packar hela katalogen i en ZIP-veck och gÄr till kontrollpanelen för den skapade funktionen.
- Klicka pÄ Redigera och laddar upp arkivet med koden.

- Fyll i den relativa sökvÀgen till filen tele_bot (tillÀgget .py kan uteslutas) och endpoint-funktion (i det angivna exemplet Àr detta main).
- I avsnittet Miljövariabler vi skriver variabeln TOKEN och tilldelar den token för den önskade Telegram-boten.
- Klicka pÄ Spara och distribuera, varefter vi gÄr till avsnittet Triggers.
- StÀll omkopplaren HTTP-förfrÄgan, för att göra förfrÄgan offentlig.

Vi har fÄtt en URL för offentlig anrop av funktionen. Kvar Àr bara . Hitta vÄr bot i Telegram och registrera din bot med kommandot:
/setwebhook <you bot token> <public URL of your function>Resultat
Om allt har gjorts korrekt kommer din bot att börja fungera omedelbart och visa aktuell sammanfattning av flygvÀdret direkt i meddelandetjÀnsten.

SjÀlvklart kan koden vidareutvecklas, men Àven i sitt nuvarande tillstÄnd Àr den tillrÀcklig för att ta reda pÄ det mest exakta vÀdret och prognosen frÄn en pÄlitlig kÀlla.
Den fullstÀndiga versionen av koden hittar du i vÄr .
KĂ€lla: habr.com
