Daar is baie dienste wat weerinligting verskaf, maar watter een moet jy vertrou? Toe ek gereeld begin fietsry het, wou ek die mees akkurate inligting hê oor die weerstoestande in die plek waar ek ry.
My eerste gedagte was om 'n klein selfdoenweerstasie met sensors te bou en data daarvan te ontvang. Maar ek het nie "die wiel herontdek" en weerinligting gekies wat in burgerlugvaart gebruik word as 'n bron van geverifieerde data, nl. METAAR (METeorologiese vliegveldverslag) en TAF (TAF - Terminal Aerodrome Forecast). In lugvaart is die lewens van honderde mense afhanklik van die weer, so voorspellings is so akkuraat as moontlik.
Hierdie inligting word 24/7 per stem by elke moderne vliegveld in die vorm uitgesaai ATIS (Outomatiese terminale inligtingsdiens) en VOLMET (uit Frans. vol - vlug en meteo - weer). Die eerste verskaf inligting oor die werklike weer by die vliegveld, en die tweede verskaf 'n voorspelling vir die volgende 24-30 uur, nie net by die uitsaaivliegveld nie, maar ook by ander.
Voorbeeld van ATIS-operasie by Vnukovo-lughawe:
'n Voorbeeld van hoe VOLMET by die Vnukovo-lughawe werk
Dit is ongerieflik om elke keer 'n radioskandeerder of -ontvanger vir die ooreenstemmende reeks by jou te dra, en ek wou 'n bot in Telegram skep wat jou met die klik van 'n knoppie toelaat om dieselfde voorspelling te kry. Dit is ten minste onprakties om 'n aparte bediener hiervoor toe te wys, asook om versoeke na jou huis Framboos te stuur.
Daarom het ek besluit om die diens as 'n backend te gebruik
Backend voorbereiding
Die skep van 'n funksie
In die beheerpaneel
Nadat die projek geskep is, gaan na die afdeling Funksies:
Druk die knoppie Skep 'n funksie en gee dit die gewenste naam:
Na druk Skep 'n funksie ons sal 'n voorstelling hê van die geskepde funksie:
Voordat jy begin om kode in Python te skep, sal jy 'n bot in Telegram moet skep. Ek sal nie beskryf hoe dit gedoen word nie - daar is gedetailleerde instruksies
Berei die kode voor
Ek het die Nasionale Oseaniese en Atmosferiese Administrasie (NOAA) as 'n bron van betroubare data gekies. Hierdie wetenskaplike agentskap werk data intyds op sy bediener op in TXT-formaat.
Skakel om METAR-data te kry (let op die geval):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
In my geval is die naaste lughawe Vnukovo, sy ICAO-kode is UUWW. Gaan na die gegenereerde URL sal die volgende gee:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Die eerste reël is die huidige tyd van die voorspelling in Greenwich Mean Time. Die tweede reël is 'n opsomming van die werklike weer. Burgerlugvaartvlieëniers sal geen probleem hê om te verstaan wat hierdie lyn beteken nie, maar ons het 'n verduideliking nodig:
- [UUWW] — Vnukovo, Moskou (Rusland — RU);
- [101130Z] — 10de dag van die maand, 11:30 GMT;
- [31004MPS] — windrigting 310 grade, spoed 4 m/s;
- [9999] — horisontale sigbaarheid 10 km of meer;
- [SCT048] — verspreide/verspreide wolke op 4800 voet (~1584m);
- [24 / 13] — temperatuur 24°C, doupunt 13°C;
- [V1014] - druk (QNH) 1014 hektopascal (750 mm Hg);
- [R01/000070] — adhesiekoëffisiënt op baan 01 — 0,70;
- [NOSIG] - sonder noemenswaardige veranderinge.
Kom ons begin programkode skryf. Eerstens moet jy funksies invoer vra и pytaf:
from urllib import request
import pytaf
Spesifiseer die veranderlikes en berei die dekoderingsfunksie voor:
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()
Kom ons gaan aan na TAF (geval is ook belangrik).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Soos in die vorige voorbeeld, kom ons kyk na die voorspelling by die Vnukovo-lughawe:
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
Kom ons let veral op die lyne TEMPO и BECMG. TEMPO beteken dat die werklike weer gedurende die gespesifiseerde tydperk periodiek sal verander. BECMG - die weer sal geleidelik verander binne 'n bepaalde tydperk.
Dit wil sê die lyn:
TEMPO 1012/1020 -TSRA BKN020CB
Sal beteken:
- [1012 / 1020] — tussen 12 en 20 uur (Greenwich Mean Time);
- [-TSRA] — donderstorm (TS = donderstorm) met reën (RA = reën) van lae intensiteit (minusteken);
- [BKN020CB] - beduidende (BKN = gebreek), cumulonimbus (CB = cumulonimbus) wolke op 2000 voet (610 meter) bo seespieël.
Daar is nogal baie terme vir weerverskynsels, en dit is moeilik om dit te onthou. Die kode vir die TAF-versoek word op 'n soortgelyke manier geskryf.
Laai kode op na die wolk
Om nie tyd te mors nie, kom ons neem 'n telegram-botsjabloon uit ons bewaarplek
Sedert in die kode sal ons toegang tot die module pytaf, dan moet die weergawe daarvan onmiddellik bygevoeg word vereistes.txt
pytaf~=1.2.1
- Kom ons gaan oor na redigering bot/tele_bot.py. Ons verwyder alle onnodige goed en voeg ons kode by.
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)
- Ons pak die hele gids in 'n zip-argief en gaan na die beheerpaneel na die geskepde funksie.
- druk Редактировать en laai die argief met die kode af.
- Vul die relatiewe pad in die lêer in tele_bot (uitbreiding .py mag nie gespesifiseer word nie) en 'n eindpuntfunksie (in die voorbeeld is dit hoof).
- In artikel Omgewings veranderlikes skryf 'n veranderlike TOKEN en ken dit die teken van die verlangde telegrambot toe.
- druk Stoor en brei uit, waarna ons na die afdeling gaan snellers.
- Ons sit die skakelaar HTTP-versoekom die versoek openbaar te maak.
Ons het nou 'n URL om die funksie in die openbaar te roep. Al wat oorbly is
/setwebhook <you bot token> <public URL of your function>
Gevolg
As alles reg gedoen word, sal jou bot dadelik begin werk en die jongste lugvaartweerverslag direk in die boodskapper vertoon.
Natuurlik kan die kode verbeter word, maar selfs in sy huidige toestand is dit genoeg om die mees akkurate weer en voorspelling van 'n betroubare bron uit te vind.
Jy sal die volledige weergawe van die kode in ons vind
Bron: will.com