Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud
Ada banyak sekali layanan yang menyediakan informasi cuaca, tapi mana yang harus Anda percayai? Ketika saya mulai sering bersepeda, saya ingin mendapatkan informasi paling akurat tentang kondisi cuaca di tempat saya bersepeda.

Pikiran pertama saya adalah membangun stasiun cuaca kecil DIY dengan sensor dan menerima data darinya. Namun saya tidak “menemukan kembali roda” dan memilih informasi cuaca yang digunakan dalam penerbangan sipil sebagai sumber data terverifikasi, yaitu METAR (Laporan Bandar Udara METeorologi) dan TAF (TAF - Prakiraan Terminal Aerodrome). Dalam penerbangan, kehidupan ratusan orang bergantung pada cuaca, sehingga prakiraan cuaca dibuat seakurat mungkin.

Informasi ini disiarkan XNUMX/XNUMX melalui suara di setiap lapangan terbang modern dalam bentuk ATIS (Layanan Informasi Terminal Otomatis) dan VOLMET (dari bahasa Perancis. vol - penerbangan dan MÉTÉO - cuaca). Yang pertama memberikan informasi tentang cuaca aktual di lapangan terbang, dan yang kedua memberikan prakiraan cuaca untuk 24-30 jam ke depan, tidak hanya di lapangan terbang siaran, tetapi juga di lapangan terbang lainnya.

Contoh pengoperasian ATIS di bandara Vnukovo:

Contoh cara kerja VOLMET di Bandara Vnukovo

Tidak nyaman untuk membawa pemindai radio atau transceiver setiap saat untuk rentang yang sesuai, dan saya ingin membuat bot di Telegram yang, dengan mengklik tombol, memungkinkan Anda mendapatkan perkiraan yang sama. Setidaknya tidak praktis untuk mengalokasikan server terpisah untuk ini, serta mengirimkan permintaan ke Raspberry rumah Anda.

Oleh karena itu, saya memutuskan untuk menggunakan layanan ini sebagai backend Fitur Selectel Cloud. Jumlah permintaan dapat diabaikan, sehingga layanan seperti itu hampir gratis (menurut perhitungan saya, biayanya adalah 22 rubel untuk 100 permintaan).

Persiapan bagian belakang

Membuat Fungsi

Di panel kontrol saya.selectel.ru membuka tampilan Platform awan dan buat proyek baru:

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud
Setelah proyek dibuat, buka bagian tersebut Fungsi:

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud
Tekan tombolnya Buat fungsi dan beri nama yang diinginkan:

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud
Setelah menekan Buat fungsi kita akan memiliki representasi dari fungsi yang dibuat:

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud
Sebelum Anda mulai membuat kode dengan Python, Anda perlu membuat bot di Telegram. Saya tidak akan menjelaskan bagaimana hal ini dilakukan - ada instruksi terperinci dalam basis pengetahuan kita. Hal utama bagi kami adalah token bot yang dibuat.

Mempersiapkan kode

Saya memilih National Oceanic and Atmospheric Administration (NOAA) sebagai sumber data yang dapat dipercaya. Badan ilmiah ini memperbarui data secara real time di servernya 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. Membuka 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 perkiraan saat ini dalam Greenwich Mean Time. Baris kedua adalah ringkasan cuaca sebenarnya. Pilot penerbangan sipil tidak akan kesulitan memahami arti garis ini, namun kami memerlukan penjelasan:

  • [UUWW] — Vnukovo, Moskow (Rusia — RU);
  • [101130Z] — tanggal 10 setiap bulannya, 11:30 GMT;
  • [31004 MPS] — arah angin 310 derajat, kecepatan 4 m/s;
  • [9999] — visibilitas horizontal 10 km atau lebih;
  • [SCT048] — awan tersebar/tersebar pada 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] - tanpa perubahan signifikan.

Mari kita mulai menulis kode program. Pertama, Anda perlu mengimpor fungsi permintaan и petasan:

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 beralih ke TAF (kasus 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

Mari kita memberi perhatian khusus pada garis-garisnya TEMPO и BECMG. TEMPO artinya cuaca sebenarnya pada periode tertentu akan berubah secara berkala. BECMG - cuaca akan berubah secara bertahap dalam jangka waktu tertentu.

Artinya, baris:

TEMPO 1012/1020 -TSRA BKN020CB

Artinya:

  • [1012 / 1020] — antara 12 dan 20 jam (Greenwich Mean Time);
  • [-TSRA] — badai petir (TS = badai petir) disertai hujan (RA = hujan) dengan intensitas rendah (tanda minus);
  • [BKN020CB] - awan cumulonimbus (CB = cumulonimbus) yang signifikan (BKN = pecah) pada ketinggian 2000 kaki (610 meter) di atas permukaan laut.

Ada cukup banyak istilah untuk fenomena cuaca, dan sulit untuk mengingatnya. Kode untuk permintaan TAF ditulis dengan cara yang sama.

Mengunggah kode ke cloud

Agar tidak membuang waktu, mari kita ambil template bot telegram dari repositori kita cloud-telegram-bot. Ada yang sudah disiapkan sebelumnya requirement.txt и setup.py dengan struktur direktori yang benar.

Karena di dalam kode kita akan mengakses modul petasan, maka versinya harus segera ditambahkan requirement.txt

pytaf~=1.2.1

  • Mari beralih ke pengeditan bot/tele_bot.py. Kami menghapus semua hal 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)

  • Kami mengemas seluruh direktori ke dalam arsip ZIP dan pergi ke panel kontrol ke fungsi yang dibuat.
  • Klik disini Mengedit dan unduh arsip dengan kodenya.

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud

  • Isi jalur relatif dalam file tele_bot (perpanjangan .py mungkin tidak ditentukan) dan fungsi titik akhir (dalam contoh yang diberikan, ini adalah utama).
  • Pada bagian Variabel Lingkungan menulis variabel TOKEN dan berikan token bot telegram yang diinginkan.
  • Klik disini Simpan dan Perluas, setelah itu kita pergi ke bagian tersebut Pemicu.
  • Kami mematikan saklarnya permintaan HTTPuntuk mempublikasikan permintaan tersebut.

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud
Kami sekarang memiliki URL untuk memanggil fungsi tersebut secara publik. Yang tersisa hanyalah konfigurasikan 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 terbaru langsung di messenger.

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud
Tentu saja, kodenya dapat ditingkatkan, tetapi bahkan dalam kondisi saat ini, cukup mengetahui cuaca dan prakiraan cuaca paling akurat dari sumber tepercaya.

Anda akan menemukan versi lengkap kodenya di kami repositori di GitHub.

Prakiraan cuaca paling akurat: bot untuk Telegram pada fungsi cloud

Sumber: www.habr.com

Tambah komentar