Það er fullt af þjónustu sem veitir veðurupplýsingar, en hverjum ættir þú að treysta? Þegar ég byrjaði að hjóla oft vildi ég hafa sem nákvæmastar upplýsingar um veðurskilyrði á þeim stað sem ég hjóla á.
Fyrsta hugsun mín var að byggja litla DIY veðurstöð með skynjurum og taka á móti gögnum frá henni. En ég „fann ekki upp hjólið aftur“ og valdi veðurupplýsingar sem eru notaðar í almenningsflugi sem uppspretta sannreyndra gagna, þ.e. METAR (Veðurfræðiflugvallarskýrsla) og TAF (TAF - Terminal Aerodrome Forecast). Í flugi er líf hundruða manna háð veðri og því eru spár eins nákvæmar og hægt er.
Þessar upplýsingar eru sendar út XNUMX/XNUMX með rödd á öllum nútíma flugvöllum í formi ATIS (Sjálfvirk flugstöðvarupplýsingaþjónusta) og VOLMET (úr frönsku. vol - flug og Météo - veður). Sá fyrsti gefur upplýsingar um raunverulegt veður á flugvellinum og sá síðari gefur spá fyrir næstu 24-30 klukkustundir, ekki aðeins á útsendingarvellinum, heldur einnig á öðrum.
Dæmi um starfsemi ATIS á Vnukovo flugvelli:
Dæmi um hvernig VOLMET virkar á Vnukovo flugvelli
Það er óþægilegt að hafa útvarpsskanni eða senditæki með sér í hvert skipti fyrir samsvarandi svið, og ég vildi búa til vélmenni í Telegram sem, með því að smella á hnapp, gerir þér kleift að fá sömu spá. Það er að minnsta kosti óraunhæft að úthluta sérstökum netþjóni fyrir þetta, auk þess að senda beiðnir heim til Raspberry.
Þess vegna ákvað ég að nota þjónustuna sem bakhlið
Undirbúningur bakenda
Búðu til aðgerð
Í stjórnborðinu
Eftir að verkefnið er búið til skaltu fara í hlutann Aðgerðir:
Ýttu á takkann Búðu til aðgerð og gefðu því nafnið sem þú vilt:
Eftir að hafa ýtt á Búðu til aðgerð við munum hafa framsetningu á stofnuðu falli:
Áður en þú byrjar að búa til kóða í Python þarftu að búa til vélmenni í Telegram. Ég mun ekki lýsa því hvernig þetta er gert - það eru nákvæmar leiðbeiningar
Að undirbúa kóðann
Ég valdi National Oceanic and Atmospheric Administration (NOAA) sem uppsprettu áreiðanlegra gagna. Þessi vísindastofnun uppfærir gögn í rauntíma á netþjóni sínum á TXT sniði.
Tengill til að fá METAR gögn (athugaðu málið):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Í mínu tilfelli er næsti flugvöllur Vnukovo, ICAO kóða hans er UUWW. Ef farið er á myndaða vefslóð gefur eftirfarandi:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Fyrsta línan er núverandi tími spárinnar á Greenwich Mean Time. Önnur línan er samantekt á raunverulegu veðri. Flugmenn í almenningsflugi munu ekki eiga í neinum vandræðum með að skilja hvað þessi lína þýðir, en við þurfum skýringu:
- [UUWW] - Vnukovo, Moskvu (Rússland - HR);
- [101130Z] — 10. dagur mánaðarins, 11:30 GMT;
- [31004MPS] — vindátt 310 gráður, hraði 4 m/s;
- [9999] — lárétt skyggni 10 km eða meira;
- [SCT048] — dreifð/dreifð ský í 4800 fetum (~1584m);
- [24 / 13] — hitastig 24°C, daggarmark 13°C;
- [Q1014] — þrýstingur (QNH) 1014 hektópascals (750 mm Hg);
- [R01/000070] — viðloðunarstuðull á braut 01 — 0,70;
- [NOSIG] - án teljandi breytinga.
Við skulum byrja að skrifa forritskóða. Fyrst þarftu að flytja inn aðgerðir óska eftir и pytaf:
from urllib import request
import pytaf
Tilgreindu breyturnar og undirbúið afkóðunaraðgerðina:
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()
Förum yfir í TAF (tilfelli er líka mikilvægt).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Eins og í fyrra dæmi, skulum við líta á spána á Vnukovo flugvelli:
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
Gætum sérstaklega að línunum TEMPO и BECMG. TEMPO þýðir að raunverulegt veður á tilgreindu tímabili mun breytast reglulega. BECMG - veðrið mun breytast smám saman innan ákveðins tíma.
Það er línan:
TEMPO 1012/1020 -TSRA BKN020CB
Mun meina:
- [1012 / 1020] — á milli 12 og 20 klukkustundir (Greenwich meðaltími);
- [-TSRA] — þrumuveður (TS = þrumuveður) með rigningu (RA = rigning) af lágum styrkleika (mínusmerki);
- [BKN020CB] - veruleg (BKN = brotinn), cumulonimbus (CB = cumulonimbus) ský í 2000 fetum (610 metrum) yfir sjávarmáli.
Það eru ansi mörg hugtök yfir veðurfyrirbæri og erfitt er að muna þau. Kóðinn fyrir TAF beiðnina er skrifaður á svipaðan hátt.
Hleður upp kóða í skýið
Til þess að eyða ekki tíma, skulum við taka símskeyti bot sniðmát úr geymslunni okkar
Þar sem í kóðanum munum við fá aðgang að einingunni pytaf, þá ætti útgáfu þess strax að bætast við kröfur.txt
pytaf~=1.2.1
- Við skulum halda áfram að klippa bot/tele_bot.py. Við fjarlægjum alla óþarfa hluti og bætum við kóðanum okkar.
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)
- Við pökkum allri möppunni inn í ZIP skjalasafn og förum á stjórnborðið til að búa til aðgerðina.
- Ýttu Breyta og hlaðið niður skjalasafninu með kóðanum.
- Fylltu út hlutfallslega slóðina í skránni tele_bot (framlenging .py má ekki tilgreina) og endapunktsfall (í dæminu sem gefið er er þetta helstu).
- Í kafla Umhverfisbreytur skrifa breytu TOKEN og úthlutaðu því tákni viðkomandi símskeyti botni.
- Ýttu Vista og stækkaðu, eftir það förum við í kaflann kveikir.
- Við settum rofann HTTP beiðniað gera beiðnina opinbera.
Við höfum nú slóð til að kalla aðgerðina opinberlega. Það eina sem er eftir er
/setwebhook <you bot token> <public URL of your function>
Niðurstaðan
Ef allt er gert rétt mun vélmenni þinn strax byrja að vinna og birta nýjustu flugveðurskýrsluna beint í boðberanum.
Auðvitað er hægt að bæta kóðann, en jafnvel í núverandi ástandi er það nóg að finna út nákvæmasta veður og spá frá traustum aðilum.
Þú finnur fulla útgáfu kóðans í okkar
Heimild: www.habr.com