
Ada banyak layanan yang menyediakan informasi cuaca, tapi mana yang harus dipercaya? Ketika saya mulai banyak bersepeda, saya ingin mendapatkan informasi paling akurat tentang kondisi cuaca di daerah tempat saya bersepeda.
Pikiran pertama adalah membangun stasiun cuaca DIY kecil dengan sensor dan menerima data darinya. Namun saya tidak menemukan kembali roda dan memilih informasi cuaca yang digunakan dalam penerbangan sipil, yaitu METAR (METeorological Aerodrome Report) dan TAF (TAF - Terminal Aerodrome Forecast) sebagai sumber data terverifikasi . Dalam penerbangan, nyawa ratusan orang bergantung pada cuaca, jadi prakiraan cuaca seakurat mungkin.
Informasi ini disiarkan sepanjang waktu dengan suara di setiap bandara modern dalam bentuk ATIS (Layanan Informasi Terminal Otomatis) dan VOLMET (dari penerbangan vol - Prancis dan mÊtÊo - cuaca). Yang pertama memberikan informasi tentang cuaca aktual di bandara, dan yang kedua memberikan prakiraan cuaca untuk 24-30 jam ke depan, tidak hanya di bandara penyiaran, tetapi juga di tempat lain.
Contoh ATIS di bandara Vnukovo:
Contoh VOLMET di bandara Vnukovo
Tidak nyaman untuk membawa pemindai radio atau transceiver dengan saya ke kisaran yang sesuai setiap saat, dan saya ingin membuat bot di Telegram, yang, dengan menekan sebuah tombol, memungkinkan saya mendapatkan perkiraan yang sama. Mengalokasikan server terpisah untuk ini setidaknya tidak praktis, serta mengarahkan permintaan ke Raspberry rumah.
Oleh karena itu, saya memutuskan untuk menggunakan layanan Cloud Functions Selectel sebagai backend . Jumlah permintaan akan diabaikan, jadi layanan ini hampir gratis (menurut perhitungan saya, itu akan menjadi 22 rubel per 100.000 permintaan).
Persiapan backend
Pembuatan fungsi
Di panel kontrol my.selectel.ru, buka tampilan Cloud Platform dan buat proyek baru:

Setelah proyek dibuat, buka bagian Fungsi :

Klik tombol Buat fungsi dan berikan nama yang diinginkan:

Setelah mengklik Buat fungsi , kita akan melihat fungsi yang dibuat:

Sebelum Anda mulai membuat kode Python, Anda perlu membuat bot di Telegram. Saya tidak akan menjelaskan bagaimana ini dilakukan - instruksi rinci tersedia di basis pengetahuan kami . Hal utama bagi kami adalah token bot yang dibuat.
Memasak kode
Saya telah memilih National Oceanic and Atmospheric Administration (NOAA) sebagai sumber data yang andal. Badan ilmiah ini memperbarui data di servernya secara real time dalam format TXT.
Tautan untuk mendapatkan data METAR (perhatikan kasusnya):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/< ICAO>.TXT
Dalam kasus saya, bandara terdekat adalah Vnukovo, kode ICAO-nya adalah UUWW . Pergi ke URL yang dihasilkan akan memberikan yang berikut:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Baris pertama adalah waktu saat prakiraan dalam Greenwich Mean Time Baris kedua adalah ringkasan cuaca sebenarnya. Pilot penerbangan sipil akan dengan mudah memahami apa arti garis ini, tetapi kami membutuhkan dekripsi:
- [UUWW] - Vnukovo, Moskow (Rusia - RU);
- [101130Z] - tanggal 10 setiap bulan, 11:30 GMT;
- [31004MPS] - arah angin 310 derajat, kecepatan 4 m / s;
- [9999] - jarak pandang horizontal 10 km atau lebih;
- [SCT048] - awan yang tersebar / tersebar di ketinggian 4800 kaki (~ 1584m);
- [24/13] - suhu 24 ° C, Titik embun 13 ° C;
- [Q1014] - tekanan (QNH) 1014 hektopascal (750 mm Hg);
- [R01 / 000070] - koefisien adhesi pada jalur 01 - 0,70;
- [NOSIG] - tidak ada perubahan signifikan.
Mari mulai menulis kode program. Pertama, Anda perlu mengimpor fungsi request dan pytaf :
from urllib import request
import pytaf
Tentukan variabel dan siapkan 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()
Mari kita lanjutkan ke TAF (mendaftar juga penting).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/< ICAO>.TXT
Seperti pada contoh sebelumnya, mari kita lihat ramalan cuaca 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
Perhatikan garis TEMPO dan BECMG . TEMPO artinya cuaca sebenarnya selama periode yang ditentukan akan berubah secara berkala. BECMG - cuaca akan berubah secara bertahap selama jangka waktu tertentu.
Artinya, baris:
TEMPO 1012/1020 -TSRA BKN020CB
Akan berarti:
- [1012/1020] - antara 12.00 dan 20.00 (GMT);
- [-TSRA] - badai petir (TS = badai petir) dengan hujan (RA = hujan) dengan intensitas rendah (tanda minus);
- [BKN020CB] Awan kumulonimbus (CB = cumulonimbus) signifikan (BKN = putus) pada ketinggian 2000 kaki (610 meter) di atas permukaan laut.
Ada banyak istilah yang mengartikan fenomena cuaca, dan sulit untuk diingat. Kode untuk permintaan TAF ditulis dengan cara yang sama.
Mengupload kode ke cloud
Agar tidak membuang waktu, mari ambil template bot telegram dari repositori cloud-telegram-bot kita . Ada requirement.txt dan setup.py yang telah disiapkan sebelumnya dengan struktur direktori yang benar.
Karena di dalam kode kita akan merujuk ke modul pytaf , versinya harus segera ditambahkan ke requirement.txt
pytaf~=1.2.1
- Mari kita pergi ke mengedit bot / tele_bot.py . Kami menghapus semua yang tidak perlu dan menambahkan kode 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)
- Kemas seluruh direktori ke dalam arsip ZIP dan buka panel kontrol ke fungsi yang dibuat.
- .

- tele_bot ( .py ) - ( main).
- TOKEN -.
- , .
- HTTP-, .

Kami sekarang memiliki URL untuk panggilan fungsi publik. Tetap hanya untuk mengkonfigurasi webhook . Temukan bot kami @SelectelServerless_bot di Telegram dan daftarkan bot Anda dengan perintah:
/setwebhook <you bot token> <public URL of your function>
Hasil
Jika semuanya dilakukan dengan benar, bot Anda akan segera mulai bekerja dan menampilkan laporan cuaca penerbangan saat ini langsung di messenger.

Tentu saja, kodenya dapat dimodifikasi, tetapi bahkan dalam kondisi saat ini, cukup untuk mengetahui cuaca dan ramalan paling akurat dari sumber tepercaya.
Anda dapat menemukan versi lengkap kode di repositori kami di GitHub .
