Aya seueur jasa anu nyayogikeun inpormasi cuaca, tapi anu mana anu anjeun kedah percanten? Nalika kuring mimiti sering ngabuburit, kuring hoyong gaduh inpormasi anu paling akurat ngeunaan kaayaan cuaca di tempat kuring naek.
Pikiran munggaran kuring nyaéta ngumpul stasiun cuaca DIY leutik kalayan sensor sareng nampi data ti dinya. Tapi kuring henteu "reinvent kabayang" sareng milih inpormasi cuaca anu dianggo dina penerbangan sipil salaku sumber data anu diverifikasi, nyaéta METAR (Laporan Météorological Aerodrome) jeung padamelan (TAF - Ramalan Terminal Aerodrome). Dina penerbangan, kahirupan ratusan jalma gumantung kana cuaca, ku kituna ramalanna akurat-gancang.
Inpormasi ieu disiarkeun XNUMX/XNUMX ku sora di unggal lapangan udara modern dina bentuk ATIS (Service Émbaran Terminal otomatis) jeung VOLMET (tina basa Perancis. vol - hiber jeung météo - cuaca). Kahiji nyadiakeun informasi ngeunaan cuaca sabenerna di lapangan terbang, sarta kadua nyadiakeun ramalan keur 24-30 jam hareup, teu ukur di lapangan terbang siaran, tapi ogé di batur.
Conto operasi ATIS di Bandara Vnukovo:
Conto kumaha VOLMET jalan di Bandara Vnukovo
Éta henteu pikaresepeun pikeun nyandak panyeken radio atanapi transceiver sareng anjeun unggal waktos pikeun rentang anu saluyu, sareng kuring hoyong nyiptakeun bot dina Telegram anu, ku ngaklik tombol, ngamungkinkeun anjeun kéngingkeun ramalan anu sami. Ieu sahenteuna praktis pikeun allocate server misah pikeun ieu, kitu ogé ngirim requests ka buah prambus asal anjeun.
Ku alatan éta, kuring mutuskeun pikeun ngagunakeun jasa salaku backend a
Persiapan backend
Jieun fungsi
Dina panel kontrol
Saatos proyék didamel, angkat ka bagian éta fungsi:
Nyorong tombol Jieun fungsi sareng masihan nami anu dipikahoyong:
Sanggeus mencet Jieun fungsi urang bakal gaduh perwakilan tina fungsi anu diciptakeun:
Sateuacan anjeun ngamimitian nyieun kode dina Python, anjeun kedah ngadamel bot dina Telegram. Kuring moal ngajelaskeun kumaha ieu dilakukeun - aya petunjuk anu lengkep
Nyiapkeun kode
Kuring milih National Oceanic and Atmospheric Administration (NOAA) salaku sumber data anu tiasa dipercaya. Badan ilmiah ieu ngamutahirkeun data sacara real waktos dina server na dina format TXT.
Tautan pikeun meunangkeun data METAR (perhatikeun kasusna):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Bisi kuring, bandara pangcaketna nyaéta Vnukovo, kode ICAO na UUWW. Pindah ka URL anu dihasilkeun bakal masihan ieu:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Garis kahiji mangrupikeun waktos ramalan ayeuna di Greenwich Mean Time. Baris kadua mangrupa kasimpulan cuaca sabenerna. Pilot penerbangan sipil moal gaduh masalah ngartos naon hartosna garis ieu, tapi urang peryogi panjelasan:
- [UUWW] - Vnukovo, Moscow (Rusia - RU);
- [101130Z] — 10 poé dina bulan, 11:30 am GMT;
- [31004MPS] - arah angin 310 derajat, laju 4 m / s;
- [9999] - pisibilitas horizontal 10 km atawa leuwih;
- [SCT048] — awan paburencay / paburencay dina 4800 suku (~ 1584m);
- [24/13] - suhu 24°C, titik embun 13°C;
- [Q1014] - tekanan (QNH) 1014 hectopascals (750 mm Hg);
- [R01/000070] - koefisien adhesion dina jalur 01 - 0,70;
- [NOSIG] - tanpa parobahan signifikan.
Hayu urang mimitian nulis kode program. Mimiti anjeun kedah ngimpor fungsi kahoyong и pytaf:
from urllib import request
import pytaf
Sebutkeun variabel sareng nyiapkeun fungsi decoding:
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()
Hayu urang ngaléngkah ka TAF (kasus ogé penting).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Sapertos dina conto sateuacana, hayu urang tingali ramalan di bandara 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
Hayu urang utamana nengetan garis Waktos и BECMG. TEMPO hartina cuaca sabenerna salila periode nu ditangtukeun bakal robah périodik. BECMG - cuaca laun-laun bakal robih dina waktos anu ditangtukeun.
Maksudna, garis:
TEMPO 1012/1020 -TSRA BKN020CB
Bakal hartosna:
- [1012/1020] - antara 12 jeung 20 jam (Greenwich Mean Time);
- [-TSRA] - guludug (TS = guludug) kalawan hujan (RA = hujan) tina inténsitas low (tanda minus);
- [BKN020CB] - awan signifikan (BKN = pegat), cumulonimbus (CB = cumulonimbus) awan dina 2000 suku (610 méter) di luhur permukaan laut.
Aya cukup loba istilah pikeun fenomena cuaca, sarta remembering aranjeunna hese. Kodeu pikeun pamundut TAF ditulis dina cara nu sarupa.
Unggah kode ka awan
Supados teu miceunan waktos, hayu urang cokot témplat bot telegram tina gudang urang
Kusabab dina kode urang bakal ngakses modul pytaf, teras versi na kudu geuwat ditambahkeun kana sarat.txt
pytaf~=1.2.1
- Hayu urang ngaléngkah ka ngédit bot/tele_bot.py. Urang miceun sagala hal nu teu perlu jeung nambahkeun kode urang.
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)
- Urang pak sakabéh diréktori kana arsip ZIP tur buka panel kontrol kana fungsi dijieun.
- Teken Édit tur ngundeur arsip jeung kode.
- Eusian jalur relatif dina file tele_bot (pangpanjangna .py bisa jadi teu dieusian) jeung hiji fungsi titik tungtung (dina conto dibikeun ieu utama).
- bagean Variabel Lingkungan nulis variabel TOKEN jeung nangtukeun eta token tina bot telegram nu dipikahoyong.
- Teken Simpen jeung dilegakeun, sanggeus éta urang buka bagian micu.
- Urang nempatkeun saklar pamundut HTTPsangkan paménta umum.
Urang ayeuna gaduh URL pikeun nelepon sacara umum fungsina. Nu nyésa téh
/setwebhook <you bot token> <public URL of your function>
hasil
Upami sadayana parantos leres, bot anjeun bakal langsung ngamimitian damel sareng ningalikeun laporan cuaca penerbangan pangénggalna langsung di utusan.
Tangtosna, kodeu tiasa ningkat, tapi bahkan dina kaayaan ayeuna éta cekap pikeun mendakan cuaca anu paling akurat sareng ramalan ti sumber anu dipercaya.
Anjeun bakal mendakan versi lengkep kodeu dina kami
sumber: www.habr.com