Hava haqqında məlumat verən bir çox xidmət var, amma hansına etibar etmək lazımdır? Tez-tez velosiped sürməyə başlayanda, sürdüyüm yerdəki hava şəraiti haqqında ən dəqiq məlumata sahib olmaq istəyirdim.
İlk fikrim sensorlarla kiçik bir DIY hava stansiyası yığmaq və ondan məlumat almaq idi. Ancaq mən "təkəri yenidən ixtira etmədim" və təsdiqlənmiş məlumat mənbəyi kimi mülki aviasiyada istifadə olunan hava məlumatlarını seçdim, yəni METAR (METeoroloji Aerodrom Hesabatı) və TSK (TAF - Terminal Aerodrom Proqnozu). Aviasiyada yüzlərlə insanın həyatı hava şəraitindən asılıdır, ona görə də proqnozlar mümkün qədər dəqiqdir.
Bu məlumat formada hər bir müasir aerodromda səslə gecə-gündüz yayımlanır ATİS (Avtomatik Terminal Məlumat Xidməti) və VOLMET (fransız dilindən vol - uçuş və Météo - hava). Birincisi, aerodromdakı faktiki hava haqqında məlumat verir, ikincisi - yalnız yayım aerodromunda deyil, digərlərində də növbəti 24-30 saat üçün proqnoz.
Vnukovo hava limanında ATIS-in işinə bir nümunə:
Vnukovo hava limanında VOLMET əməliyyatının nümunəsi
Hər dəfə radio skaner və ya qəbuledicini özünüzlə uyğun diapazona aparmaq əlverişsiz olur və mən Telegram-da bir düyməyə basmaqla eyni proqnozu əldə etməyə imkan verən bot yaratmaq istədim. Bunun üçün ayrıca bir server ayırmaq ən azı məqsədəuyğun deyil, həm də ev Raspberry-ə sorğu göndərmək.
Buna görə də, bir backend olaraq, xidmətdən istifadə etmək qərarına gəldim
Arxa uçun hazırlanması
Funksiya yaradın
İdarəetmə panelində
Layihə yaradıldıqdan sonra bölməyə keçin Funksiyalar:
Düyməni basın Funksiya yaradın və istədiyiniz adı verin:
Basdıqdan sonra Funksiya yaradın yaradılmış funksiyanın təqdimatına sahib olacağıq:
Python-da kod yaratmağa başlamazdan əvvəl Telegram-da bot yaratmalısınız. Bunun necə edildiyini təsvir etməyəcəyəm - ətraflı təlimatlar var
Kodun hazırlanması
Mən etibarlı məlumat mənbəyi kimi Milli Okean və Atmosfer Administrasiyasını (NOAA) seçdim. Bu elmi agentlik öz serverindəki məlumatları real vaxt rejimində TXT formatında yeniləyir.
METAR məlumatlarını əldə etmək üçün keçid (reestri qeyd edin):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Mənim vəziyyətimdə ən yaxın hava limanı Vnukovodur, onun ICAO kodudur UUWW. Yaradılmış URL-ə keçid aşağıdakıları yaradacaq:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Birinci sətir proqnozun aktuallığının GMT vaxtıdır. İkinci sətir faktiki havanın xülasəsidir. Mülki aviasiya pilotlarının bu xəttin nə demək olduğunu anlamaqda heç bir problemi olmayacaq, lakin bizə transkript lazımdır:
- [UUWW] — Vnukovo, Moskva (Rusiya — RU);
- [101130Z] — ayın 10-cu günü, GMT 11:30;
- [31004MPS] — küləyin istiqaməti 310 dərəcə, sürəti 4 m/s;
- [9999] — üfüqi görünürlük 10 km və ya daha çox;
- [SCT048] — 4800 futda (~1584m) səpələnmiş/səpələnmiş buludlar;
- [24 / 13] — temperatur 24°C, şeh nöqtəsi 13°C;
- [Q1014] - təzyiq (QNH) 1014 hektopaskal (750 mm Hg);
- [R01/000070] — zolaqda yapışma əmsalı 01 — 0,70;
- [NOSIG] - əhəmiyyətli dəyişikliklər olmadan.
Kodu yazmağa başlayaq. Əvvəlcə funksiyaları idxal etməlisiniz xahiş и pytaf:
from urllib import request
import pytaf
Dəyişənləri təyin edin və dekodlaşdırma funksiyasını hazırlayın:
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()
TAF-a keçək (iş də vacibdir).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Əvvəlki nümunədə olduğu kimi, Vnukovo hava limanında proqnoza baxaq:
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
Xətlərə xüsusi diqqət yetirin TEMPO и BECMG. TEMPO o deməkdir ki, göstərilən dövrdə faktiki hava vaxtaşırı dəyişəcək. BECMG - müəyyən edilmiş vaxt intervalında hava tədricən dəyişəcək.
Bu xətt:
TEMPO 1012/1020 -TSRA BKN020CB
Demək olar:
- [1012 / 1020] - 12 saatdan 20 saata qədər (Qrinviç vaxtı);
- [-TSRA] — aşağı intensivliyə malik yağışla (RA = yağış) ildırım (TS = tufan) (mənfi işarə);
- [BKN020CB] - dəniz səviyyəsindən 2000 fut (610 metr) yüksəklikdə əhəmiyyətli (BKN = qırıq), cumulonimbus (CB = cumulonimbus) bulud örtüyü.
Hava hadisələrini ifadə edən çoxlu terminlər var və onları yadda saxlamaq çətindir. TSK sorğusunun kodu da oxşar şəkildə yazılır.
Buluda kodu yükləyin
Vaxt itirməmək üçün anbarımızdan teleqram bot şablonunu götürək
Kodda modula müraciət edəcəyik pytaf, onda onun versiyası dərhal əlavə edilməlidir tələblər.txt
pytaf~=1.2.1
- Gəlin redaktəyə keçək bot/tele_bot.py. Bütün lazımsızları çıxarırıq və kodumuzu əlavə edirik.
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)
- Bütün kataloqu ZIP arxivinə yığırıq və yaradılan funksiyaya idarəetmə panelinə keçirik.
- Push Редактировать və arxivi kodla yükləyin.
- Faylda nisbi yolu doldurun tele_bot (uzatma .py buraxıla bilər) və son nöqtə funksiyası (yuxarıdakı misalda bu Elanlar ).
- Bölmədə Ətraf mühit dəyişənləri dəyişən yazın Nişan və ona istədiyiniz teleqram botunun işarəsini təyin edin.
- Push Saxla və genişləndir, sonra bölməyə keçin tetikler.
- Anahtarı qoyduq HTTP sorğususorğunu ictimailəşdirmək.
Bizdə ictimai funksiya çağırışı üçün URL var. Qalan hər şey
/setwebhook <you bot token> <public URL of your function>
Nəticə
Hər şey düzgün aparılırsa, botunuz dərhal işə başlayacaq və cari aviasiya havası hesabatını birbaşa messencerdə göstərəcək.
Əlbəttə ki, kodu təkmilləşdirmək olar, lakin indiki vəziyyətdə belə etibarlı mənbədən ən dəqiq hava və proqnozu öyrənmək kifayətdir.
Kodun tam versiyasını bizim saytda tapa bilərsiniz
Mənbə: www.habr.com