Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan
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 Pilih Ciri Awan. Bilangan permintaan akan diabaikan, jadi perkhidmatan sedemikian akan menjadi hampir percuma (mengikut pengiraan saya, ia akan menjadi 22 rubel untuk 100 permintaan).

Penyediaan bahagian belakang

Buat fungsi

Dalam panel kawalan my.selectel.ru buka pandangan Platform awan dan buat projek baharu:

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan
Selepas projek dibuat, pergi ke bahagian Fungsi:

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan
Tolak butang Buat fungsi dan berikan nama yang dikehendaki:

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan
Selepas menekan Buat fungsi kami akan mempunyai perwakilan fungsi yang dibuat:

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan
Sebelum anda mula membuat kod dalam Python, anda perlu membuat bot dalam Telegram. Saya tidak akan menerangkan cara ini dilakukan - terdapat arahan terperinci dalam pangkalan pengetahuan kami. Perkara utama bagi kami ialah token bot yang dicipta.

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 awan-telegram-bot. Ada yang telah disediakan terlebih dahulu keperluan.txt ΠΈ persediaan.py dengan struktur direktori yang betul.

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.

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan

  • 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.

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan
Kami kini mempunyai URL untuk memanggil fungsi tersebut secara terbuka. Yang tinggal hanyalah mengkonfigurasi webhook. Cari bot kami @SelectelServerless_bot dalam Telegram dan daftarkan bot anda dengan arahan:

/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.

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan
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 repositori di GitHub.

Ramalan cuaca paling tepat: bot untuk Telegram pada fungsi awan

Sumber: www.habr.com

Tambah komen