Awọn iṣẹ pupọ lo wa ti o pese alaye oju ojo, ṣugbọn ewo ni o yẹ ki o gbẹkẹle? Nigbati mo bẹrẹ gigun kẹkẹ nigbagbogbo, Mo fẹ lati ni alaye ti o peye julọ nipa awọn ipo oju-ọjọ ni ibiti Mo ti gun.
Ero mi akọkọ ni lati kọ ibudo oju ojo kekere DIY pẹlu awọn sensọ ati gba data lati ọdọ rẹ. Ṣugbọn Emi ko “tun kẹkẹ naa pada” ati yan alaye oju-ọjọ ti o lo ninu ọkọ oju-ofurufu ara ilu gẹgẹbi orisun data ti o jẹrisi, eyun METAR (METeorological Aerodrome Iroyin) ati iṣẹ (TAF - Asọtẹlẹ Aerodrome Terminal). Ni ọkọ ofurufu, awọn igbesi aye awọn ọgọọgọrun eniyan da lori oju ojo, nitorinaa awọn asọtẹlẹ jẹ deede bi o ti ṣee.
Alaye yii jẹ ikede XNUMX/XNUMX nipasẹ ohun ni gbogbo papa ọkọ ofurufu ode oni ni fọọmu naa ATIS (Aifọwọyi ebute Alaye Service) ati VOLMET (lati Faranse. flight - ofurufu ati Meteo - oju ojo). Ni igba akọkọ ti pese alaye nipa oju ojo gangan ni papa ọkọ ofurufu, ati keji pese asọtẹlẹ fun awọn wakati 24-30 to nbọ, kii ṣe ni aaye afẹfẹ igbohunsafefe nikan, ṣugbọn tun ni awọn miiran.
Apẹẹrẹ ti iṣẹ ATIS ni papa ọkọ ofurufu Vnukovo:
Apeere ti bii VOLMET ṣe n ṣiṣẹ ni Papa ọkọ ofurufu Vnukovo
Ko ṣe aibalẹ lati gbe ọlọjẹ redio tabi transceiver pẹlu rẹ ni gbogbo igba fun ibiti o baamu, ati pe Mo fẹ lati ṣẹda bot ni Telegram ti, ni titẹ bọtini kan, gba ọ laaye lati gba asọtẹlẹ kanna. O kere ju iwulo lati pin olupin lọtọ fun eyi, bakanna bi fifiranṣẹ awọn ibeere si Rasipibẹri ile rẹ.
Nitorinaa, Mo pinnu lati lo iṣẹ naa bi ẹhin
Backend igbaradi
Ṣiṣẹda Iṣẹ kan
Ni awọn iṣakoso nronu
Lẹhin ti a ṣẹda ise agbese, lọ si apakan Awọn iṣẹ:
Titari bọtini naa Ṣẹda iṣẹ kan ki o si fun ni orukọ ti o fẹ:
Lẹhin titẹ Ṣẹda iṣẹ kan a yoo ni aṣoju iṣẹ ti a ṣẹda:
Ṣaaju ki o to bẹrẹ ṣiṣẹda koodu ni Python, iwọ yoo nilo lati ṣẹda bot ni Telegram. Emi kii yoo ṣe apejuwe bi eyi ṣe ṣe - awọn ilana alaye wa
Ngbaradi koodu
Mo yan National Oceanic and Atmospheric Administration (NOAA) gẹgẹbi orisun data ti o gbẹkẹle. Ile-ibẹwẹ imọ-jinlẹ yii ṣe imudojuiwọn data ni akoko gidi lori olupin rẹ ni ọna kika TXT.
Ọna asopọ lati gba data METAR (ṣe akiyesi ọran naa):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Ninu ọran mi, papa ọkọ ofurufu ti o sunmọ julọ jẹ Vnukovo, koodu ICAO rẹ jẹ UUWW. Lilọ si URL ti ipilẹṣẹ yoo fun ni atẹle:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Laini akọkọ jẹ akoko lọwọlọwọ ti asọtẹlẹ ni Akoko Itumọ Greenwich. Laini keji jẹ akopọ ti oju ojo gangan. Awọn awakọ ọkọ ofurufu ti ilu kii yoo ni iṣoro lati ni oye kini laini yii tumọ si, ṣugbọn a nilo alaye kan:
- [UUWW] - Vnukovo, Moscow (Russia - RU);
- [101130Z] - Ọjọ kẹwa ti oṣu, 10:11 owurọ GMT;
- [31004MPS] - itọsọna afẹfẹ 310 iwọn, iyara 4 m / s;
- [9999] - hihan petele 10 km tabi diẹ ẹ sii;
- [SCT048] - awọn awọsanma ti a ti tuka / ti o ti tuka ni awọn ẹsẹ 4800 (~ 1584 m);
- [24 / 13] - iwọn otutu 24 ° C, aaye ìri 13 ° C;
- [Q1014] - titẹ (QNH) 1014 hectopascals (750 mm Hg);
- [R01/000070] - olùsọdipúpọ ti adhesion lori ona 01 - 0,70;
- [NOSIG] - lai significant ayipada.
Jẹ ki a bẹrẹ kikọ koodu eto. Ni akọkọ o nilo lati gbe awọn iṣẹ wọle ìbéèrè и pytaf:
from urllib import request
import pytaf
Pato awọn oniyipada ati mura iṣẹ iyipada:
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()
Jẹ ki a lọ si TAF (ọran tun ṣe pataki).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Gẹgẹbi apẹẹrẹ ti tẹlẹ, jẹ ki a wo asọtẹlẹ ni papa ọkọ ofurufu 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
Jẹ ki a paapa san ifojusi si awọn ila TEMPO и BECMG. TEMPO tumọ si pe oju ojo gangan lakoko akoko ti a sọ pato yoo yipada lorekore. BECMG - oju ojo yoo yipada ni diėdiė laarin akoko kan pato.
Iyẹn ni, ila:
TEMPO 1012/1020 -TSRA BKN020CB
Yoo tumọ si:
- [1012 / 1020] - laarin awọn wakati 12 ati 20 (Aago Itumọ Greenwich);
- [-TSRA] - ãra (TS = ãra) pẹlu ojo (RA = ojo) ti kekere kikankikan (ami iyokuro);
- [BKN020CB] - pataki (BKN = baje), cumulonimbus (CB = cumulonimbus) awọsanma ni 2000 ẹsẹ (610 mita) loke ipele okun.
Awọn ofin pupọ lo wa fun awọn iyalẹnu oju ojo, ati iranti wọn nira. Awọn koodu fun TAF ìbéèrè ti wa ni kikọ ni a iru ona.
Ikojọpọ koodu si awọsanma
Ni ibere ki o ma ṣe padanu akoko, jẹ ki a mu awoṣe bot telegram kan lati ibi ipamọ wa
Niwon ninu koodu a yoo wọle si module pytaf, lẹhinna ẹya rẹ yẹ ki o wa ni afikun lẹsẹkẹsẹ si awọn ibeere.txt
pytaf~=1.2.1
- Jẹ ki a tẹsiwaju si ṣiṣatunkọ bot/tele_bot.py. A yọ gbogbo awọn nkan ti ko wulo ati ṣafikun koodu wa.
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)
- A ṣe akopọ gbogbo ilana sinu ibi ipamọ ZIP kan ki o lọ si igbimọ iṣakoso si iṣẹ ti a ṣẹda.
- Ti Ṣatunkọ ati ki o gba awọn pamosi pẹlu awọn koodu.
- Fọwọsi ọna ojulumo ninu faili naa tele_bot (itẹsiwaju .py le ma wa ni pato) ati awọn ẹya endpoint iṣẹ (ninu awọn apẹẹrẹ fun yi ni akọkọ).
- Ninu ori iwe Awọn iyipada Ayika kọ oniyipada Àmi ki o si fun ni ami ami ti bot telegram ti o fẹ.
- Ti Fipamọ ati Faagun, lẹhin eyi a lọ si apakan awọn okunfa.
- A fi yipada HTTP ìbéèrèlati ṣe ibeere ni gbangba.
A ni URL kan fun pipe iṣẹ naa ni gbangba. Gbogbo nkan to ku ni
/setwebhook <you bot token> <public URL of your function>
Esi
Ti ohun gbogbo ba ṣe ni deede, bot rẹ yoo bẹrẹ ṣiṣẹ lẹsẹkẹsẹ ati ṣafihan ijabọ oju ojo oju-ofurufu tuntun taara ninu ojiṣẹ naa.
Nitoribẹẹ, koodu naa le ni ilọsiwaju, ṣugbọn paapaa ni ipo lọwọlọwọ o to lati wa oju ojo deede julọ ati asọtẹlẹ lati orisun ti o gbẹkẹle.
Iwọ yoo wa ẹya kikun ti koodu ninu wa
orisun: www.habr.com