Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan
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 Pilih Fitur Awan. Jumlah pamundut bakal diabaikan, ku kituna layanan sapertos bakal ampir gratis (nurutkeun itungan kuring, éta bakal 22 rubles pikeun 100 requests).

Persiapan backend

Jieun fungsi

Dina panel kontrol my.selectel.ru muka pintonan Platform awan sareng ngadamel proyék énggal:

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan
Saatos proyék didamel, angkat ka bagian éta fungsi:

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan
Nyorong tombol Jieun fungsi sareng masihan nami anu dipikahoyong:

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan
Sanggeus mencet Jieun fungsi urang bakal gaduh perwakilan tina fungsi anu diciptakeun:

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan
Sateuacan anjeun ngamimitian nyieun kode dina Python, anjeun kedah ngadamel bot dina Telegram. Kuring moal ngajelaskeun kumaha ieu dilakukeun - aya petunjuk anu lengkep dina dasar pangaweruh urang. Hal utama pikeun urang nyaéta token tina bot anu diciptakeun.

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 awan-telegram-bot. Aya tos disiapkeun sarat.txt и setup.py kalawan struktur diréktori bener.

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.

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan

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

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan
Urang ayeuna gaduh URL pikeun nelepon sacara umum fungsina. Nu nyésa téh ngonpigurasikeun webhook. Manggihan bot urang @SelectelServerless_bot dina Telegram sareng ngadaptar bot anjeun nganggo paréntah:

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

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan
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 repositories on GitHub.

Ramalan cuaca anu paling akurat: bot pikeun Telegram dina fungsi awan

sumber: www.habr.com

Tambahkeun komentar