Terdapat banyak perkhidmatan yang menyediakan maklumat cuaca, tetapi yang manakah harus anda percayai? Apabila saya mula berbasikal dengan kerap, saya ingin mendapatkan maklumat yang paling tepat tentang keadaan cuaca di tempat saya menunggang.
Fikiran pertama saya ialah membina stesen cuaca DIY kecil dengan penderia dan menerima data daripadanya. Tetapi saya tidak "mencipta semula roda" dan memilih maklumat cuaca yang digunakan dalam penerbangan awam sebagai sumber data yang disahkan, iaitu METAR (Laporan Aerodrom METeorologi) dan TAF (TAF - Ramalan Aerodrom Terminal). Dalam penerbangan, nyawa ratusan orang bergantung pada cuaca, jadi ramalan adalah setepat mungkin.
Maklumat ini disiarkan XNUMX/XNUMX melalui suara di setiap lapangan terbang moden dalam bentuk ATIS (Perkhidmatan Maklumat Terminal Automatik) dan VOLMET (dari bahasa Perancis. vol - penerbangan dan Cuaca - cuaca). Yang pertama memberikan maklumat tentang cuaca sebenar di lapangan terbang, dan yang kedua menyediakan ramalan untuk 24-30 jam akan datang, bukan sahaja di lapangan terbang penyiaran, tetapi juga di tempat lain.
Contoh operasi ATIS di Lapangan Terbang Vnukovo:
Contoh cara VOLMET berfungsi di Lapangan Terbang Vnukovo
Adalah menyusahkan untuk membawa pengimbas radio atau transceiver dengan anda setiap kali untuk julat yang sepadan, dan saya ingin mencipta bot dalam Telegram yang, dengan mengklik butang, membolehkan anda mendapatkan ramalan yang sama. Sekurang-kurangnya tidak praktikal untuk memperuntukkan pelayan yang berasingan untuk ini, serta menghantar permintaan ke Raspberry rumah anda.
Oleh itu, saya memutuskan untuk menggunakan perkhidmatan ini sebagai backend
Penyediaan bahagian belakang
Buat fungsi
Dalam panel kawalan
Selepas projek dibuat, pergi ke bahagian Fungsi:
Tolak butang Buat fungsi dan berikan nama yang dikehendaki:
Selepas menekan Buat fungsi kami akan mempunyai perwakilan fungsi yang dibuat:
Sebelum anda mula membuat kod dalam Python, anda perlu membuat bot dalam Telegram. Saya tidak akan menerangkan cara ini dilakukan - terdapat arahan terperinci
Menyediakan kod
Saya memilih National Oceanic and Atmospheric Administration (NOAA) sebagai sumber data yang boleh dipercayai. Agensi saintifik ini mengemas kini data dalam masa nyata pada pelayannya dalam format TXT.
Pautan untuk mendapatkan data METAR (perhatikan kes):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<ΠΊΠΎΠ΄ Π°ΡΡΠΎΠΏΠΎΡΡΠ° ΠΏΠΎ ICAO>.TXT
Dalam kes saya, lapangan terbang terdekat ialah Vnukovo, kod ICAOnya ialah UUWW. Pergi ke URL yang dijana akan memberikan yang berikut:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Baris pertama ialah masa semasa ramalan dalam Masa Min Greenwich. Baris kedua ialah ringkasan cuaca sebenar. Juruterbang penerbangan awam tidak akan menghadapi masalah memahami maksud baris ini, tetapi kami memerlukan penjelasan:
- [UUWW] β Vnukovo, Moscow (Rusia β RU);
- [101130Z] β hari ke-10 dalam bulan itu, 11:30 pagi GMT;
- [31004MPS] β arah angin 310 darjah, kelajuan 4 m/s;
- [9999] β keterlihatan mendatar 10 km atau lebih;
- [SCT048] β awan bertaburan/tersebar pada 4800 kaki (~1584 m);
- [24 / 13] β suhu 24Β°C, takat embun 13Β°C;
- [S1014] β tekanan (QNH) 1014 hektopascal (750 mm Hg);
- [R01/000070] β pekali lekatan pada lorong 01 β 0,70;
- [NOSIG] - tanpa perubahan ketara.
Mari mula menulis kod program. Mula-mula anda perlu mengimport fungsi meminta ΠΈ pytaf:
from urllib import request
import pytaf
Tentukan pembolehubah dan sediakan fungsi penyahkodan:
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()
Mari kita beralih kepada TAF (kes juga penting).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<ΠΊΠΎΠ΄ Π°ΡΡΠΎΠΏΠΎΡΡΠ° ΠΏΠΎ ICAO>.TXT
Seperti dalam contoh sebelumnya, mari kita lihat ramalan di lapangan terbang 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
Marilah kita memberi perhatian khusus kepada garis TEMPO ΠΈ BECMG. TEMPO bermaksud cuaca sebenar dalam tempoh yang ditetapkan akan berubah secara berkala. BECMG - cuaca akan berubah secara beransur-ansur dalam tempoh masa tertentu.
Iaitu, baris:
TEMPO 1012/1020 -TSRA BKN020CB
Akan bermaksud:
- [1012 / 1020] β antara 12 dan 20 jam (Masa Purata Greenwich);
- [-TSRA] β ribut petir (TS = ribut petir) dengan hujan (RA = hujan) dengan intensiti rendah (tanda tolak);
- [BKN020CB] - awan ketara (BKN = pecah), kumulonimbus (CB = kumulonimbus) pada ketinggian 2000 kaki (610 meter) dari aras laut.
Terdapat banyak istilah untuk fenomena cuaca, dan mengingatinya adalah sukar. Kod untuk permintaan TAF ditulis dengan cara yang sama.
Memuat naik kod ke awan
Untuk tidak membuang masa, mari ambil templat bot telegram dari repositori kami
Oleh kerana dalam kod kita akan mengakses modul pytaf, maka versinya hendaklah ditambah dengan segera keperluan.txt
pytaf~=1.2.1
- Mari kita beralih kepada penyuntingan bot/tele_bot.py. Kami mengalih keluar semua perkara yang tidak perlu dan menambah kod kami.
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)
- Kami membungkus keseluruhan direktori ke dalam arkib ZIP dan pergi ke panel kawalan ke fungsi yang dibuat.
- Tolak Edit dan muat turun arkib dengan kod.
- Isikan laluan relatif dalam fail tele_bot (sambungan .py mungkin tidak dinyatakan) dan fungsi titik akhir (dalam contoh yang diberikan ini ialah utama).
- Dalam seksyen Pembolehubah Persekitaran tulis pembolehubah TOKEN dan berikannya token bot telegram yang dikehendaki.
- Tolak Simpan dan Kembangkan, selepas itu kita pergi ke bahagian pencetus.
- Kami meletakkan suis Permintaan HTTPuntuk membuat permintaan awam.
Kami kini mempunyai URL untuk memanggil fungsi tersebut secara terbuka. Yang tinggal hanyalah
/setwebhook <you bot token> <public URL of your function>
Keputusan
Jika semuanya dilakukan dengan betul, bot anda akan mula berfungsi dengan serta-merta dan memaparkan laporan cuaca penerbangan terkini terus dalam messenger.
Sudah tentu, kod itu boleh diperbaiki, tetapi walaupun dalam keadaan semasa, ia sudah cukup untuk mengetahui cuaca dan ramalan yang paling tepat daripada sumber yang dipercayai.
Anda akan menemui versi penuh kod dalam kami
Sumber: www.habr.com