Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap
Maraming serbisyo na nagbibigay ng impormasyon sa panahon, ngunit alin ang dapat mong pagkatiwalaan? Noong nagsimula akong magbisikleta nang madalas, gusto kong magkaroon ng pinakatumpak na impormasyon tungkol sa mga kondisyon ng panahon sa lugar kung saan ako sumasakay.

Ang una kong naisip ay bumuo ng isang maliit na istasyon ng panahon ng DIY na may mga sensor at tumanggap ng data mula dito. Ngunit hindi ko "muling likhain ang gulong" at pinili ang impormasyon ng panahon na ginagamit sa civil aviation bilang pinagmumulan ng na-verify na data, lalo na METAR (METeorological Aerodrome Report) at TAF (TAF - Pagtataya ng Terminal Aerodrome). Sa aviation, ang buhay ng daan-daang tao ay nakasalalay sa lagay ng panahon, kaya ang mga hula ay tumpak hangga't maaari.

Ang impormasyong ito ay nai-broadcast XNUMX/XNUMX sa pamamagitan ng boses sa bawat modernong paliparan sa form ATIS (Awtomatikong Terminal Information Service) at VOLMET (mula sa French. vol - paglipad at météo - panahon). Ang una ay nagbibigay ng impormasyon tungkol sa aktwal na lagay ng panahon sa paliparan, at ang pangalawa ay nagbibigay ng forecast para sa susunod na 24-30 oras, hindi lamang sa broadcast airfield, kundi pati na rin sa iba.

Halimbawa ng operasyon ng ATIS sa Vnukovo Airport:

Isang halimbawa kung paano gumagana ang VOLMET sa Vnukovo Airport

Hindi maginhawang magdala ng radio scanner o transceiver sa bawat oras para sa kaukulang hanay, at gusto kong lumikha ng bot sa Telegram na, sa pag-click ng isang pindutan, ay nagbibigay-daan sa iyo upang makuha ang parehong hula. Hindi bababa sa hindi praktikal na maglaan ng isang hiwalay na server para dito, pati na rin ang pagpapadala ng mga kahilingan sa iyong tahanan Raspberry.

Samakatuwid, nagpasya akong gamitin ang serbisyo bilang backend Selectel Cloud Features. Ang bilang ng mga kahilingan ay magiging bale-wala, kaya ang naturang serbisyo ay halos libre (ayon sa aking mga kalkulasyon, ito ay magiging 22 rubles para sa 100 mga kahilingan).

Paghahanda sa backend

Paglikha ng isang Function

Sa Control Panel my.selectel.ru buksan ang view Cloud platform at lumikha ng isang bagong proyekto:

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap
Pagkatapos malikha ang proyekto, pumunta sa seksyon Pag-andar:

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap
Itulak ang pindutan Lumikha ng isang function at bigyan ito ng gustong pangalan:

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap
Pagkatapos ng pagpindot Lumikha ng isang function magkakaroon tayo ng representasyon ng nilikhang function:

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap
Bago ka magsimulang gumawa ng code sa Python, kakailanganin mong lumikha ng bot sa Telegram. Hindi ko ilalarawan kung paano ito ginagawa - may mga detalyadong tagubilin sa aming base ng kaalaman. Ang pangunahing bagay para sa amin ay ang token ng nilikhang bot.

Paghahanda ng code

Pinili ko ang National Oceanic and Atmospheric Administration (NOAA) bilang pinagmumulan ng maaasahang data. Ang siyentipikong ahensyang ito ay nag-a-update ng data nang real time sa server nito sa TXT na format.

Link para makakuha ng METAR data (tandaan ang kaso):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT

Sa aking kaso, ang pinakamalapit na paliparan ay Vnukovo, ang ICAO code nito ay UUWW. Ang pagpunta sa nabuong URL ay magbibigay ng sumusunod:

2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG

Ang unang linya ay ang kasalukuyang oras ng forecast sa Greenwich Mean Time. Ang pangalawang linya ay isang buod ng aktwal na panahon. Ang mga piloto ng civil aviation ay walang problema sa pag-unawa sa ibig sabihin ng linyang ito, ngunit kailangan namin ng paliwanag:

  • [UUWW] — Vnukovo, Moscow (Russia — RU);
  • [101130Z] — Ika-10 araw ng buwan, 11:30 am GMT;
  • [31004MPS] — direksyon ng hangin 310 degrees, bilis 4 m/s;
  • [9999] — pahalang na visibility 10 km o higit pa;
  • [SCT048] — kalat-kalat/kalat na ulap sa 4800 talampakan (~1584m);
  • [24 / 13] — temperatura 24°C, punto ng hamog 13°C;
  • [Q1014] — presyon (QNH) 1014 hectopascals (750 mm Hg);
  • [R01/000070] - koepisyent ng pagdirikit sa lane 01 - 0,70;
  • [NOSIG] - walang makabuluhang pagbabago.

Simulan natin ang pagsusulat ng program code. Una kailangan mong mag-import ng mga function humiling и pytaf:

from urllib import request
import pytaf

Tukuyin ang mga variable at ihanda ang decoding function:

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()

Let's move on to TAF (case is also important).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT

Tulad ng sa nakaraang halimbawa, tingnan natin ang forecast sa paliparan ng 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

Bigyang-pansin natin lalo na ang mga linya TEMPO и BECMG. Ang ibig sabihin ng TEMPO ay pana-panahong magbabago ang aktwal na panahon sa tinukoy na panahon. BECMG - unti-unting magbabago ang panahon sa loob ng tinukoy na yugto ng panahon.

Iyon ay, ang linya:

TEMPO 1012/1020 -TSRA BKN020CB

Ang ibig sabihin ay:

  • [1012 / 1020] — sa pagitan ng 12 at 20 oras (Greenwich Mean Time);
  • [-TSRA] — thunderstorm (TS = thunderstorm) na may ulan (RA = rain) na mababa ang intensity (minus sign);
  • [BKN020CB] - makabuluhang (BKN = sira), cumulonimbus (CB = cumulonimbus) mga ulap sa 2000 talampakan (610 metro) sa ibabaw ng dagat.

Napakaraming termino para sa mga phenomena ng panahon, at mahirap alalahanin ang mga ito. Ang code para sa kahilingan ng TAF ay nakasulat sa katulad na paraan.

Pag-upload ng code sa cloud

Upang hindi mag-aksaya ng oras, kumuha tayo ng template ng telegram bot mula sa aming repository cloud-telegram-bot. May pre-prepared mga kinakailangan.txt и setup.py na may tamang istraktura ng direktoryo.

Dahil sa code ay maa-access natin ang module pytaf, pagkatapos ay dapat na agad na idagdag ang bersyon nito sa mga kinakailangan.txt

pytaf~=1.2.1

  • Tara na sa pag-edit bot/tele_bot.py. Tinatanggal namin ang lahat ng hindi kinakailangang bagay at idinagdag ang aming code.

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)

  • Inilalagay namin ang buong direktoryo sa isang ZIP archive at pumunta sa control panel sa nilikha na function.
  • Push I-edit ang at i-download ang archive na may code.

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap

  • Punan ang kamag-anak na landas sa file tele_bot (extension .py maaaring hindi tinukoy) at isang endpoint function (sa halimbawang ibinigay na ito ay pangunahin).
  • Sa seksyon Mga variable ng kapaligiran sumulat ng variable Token at italaga dito ang token ng gustong telegram bot.
  • Push I-save at Palawakin, pagkatapos ay pumunta kami sa seksyon Nagpapalit.
  • Inilagay namin ang switch Kahilingan sa HTTPupang isapubliko ang kahilingan.

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap
Mayroon na kaming URL para sa pampublikong pagtawag sa function. Ang natitira na lang i-configure ang webhook. Hanapin ang aming bot @SelectelServerless_bot sa Telegram at irehistro ang iyong bot gamit ang utos:

/setwebhook <you bot token> <public URL of your function>

Resulta

Kung nagawa nang tama ang lahat, agad na magsisimulang gumana ang iyong bot at direktang ipapakita sa messenger ang pinakabagong ulat ng panahon ng aviation.

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap
Siyempre, ang code ay maaaring mapabuti, ngunit kahit na sa kasalukuyang estado nito ay sapat na upang malaman ang pinakatumpak na panahon at pagtataya mula sa isang pinagkakatiwalaang pinagmulan.

Makikita mo ang buong bersyon ng code sa aming mga repositoryo sa GitHub.

Ang pinakatumpak na taya ng panahon: bot para sa Telegram sa mga pag-andar ng ulap

Pinagmulan: www.habr.com

Magdagdag ng komento