Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka
Mnogo je servisa koji pružaju informacije o vremenu, ali kojem od njih vjerovati? Kada sam počeo često voziti bicikl, želio sam imati što točniju informaciju o vremenskim uvjetima u mjestu gdje vozim.

Moja prva pomisao bila je napraviti malu DIY meteorološku stanicu sa senzorima i primati podatke s nje. No, nisam “izmišljao kotač” i kao izvor provjerenih podataka odabrao informacije o vremenu koje se koriste u civilnom zrakoplovstvu, tj. METAR (METeorological Aerodrome Report) i posao (TAF - Terminal Aerodrome Forecast). U zrakoplovstvu životi stotina ljudi ovise o vremenu, pa su prognoze što točnije.

Ove informacije se emitiraju XNUMX/XNUMX putem glasa na svakom modernom aerodromu u obrascu ATIS (Automatska informacijska služba terminala) i VOLMET (s francuskog. vol - let i Meteo - vrijeme). Prvi pruža informacije o stvarnom vremenu na aerodromu, a drugi daje prognozu za sljedećih 24-30 sati, ne samo na aerodromu za emitiranje, već i na ostalima.

Primjer rada ATIS-a u zračnoj luci Vnukovo:

Primjer kako VOLMET radi u zračnoj luci Vnukovo

Nezgodno je svaki put sa sobom nositi radio skener ili primopredajnik za odgovarajući raspon, a ja sam želio napraviti bota u Telegramu koji vam na klik gumba omogućuje da dobijete istu prognozu. U najmanju ruku je nepraktično dodijeliti poseban server za to, kao i slanje zahtjeva na kućnu malinu.

Stoga sam odlučio koristiti uslugu kao backend Selectel značajke oblaka. Broj zahtjeva bit će zanemariv, pa će takva usluga biti gotovo besplatna (prema mojim izračunima, to će biti 22 rublja za 100 zahtjeva).

Priprema backenda

Napravite funkciju

U upravljačkoj ploči moj.selectel.ru otvori pogled Cloud platforma i izradite novi projekt:

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka
Nakon što je projekt izrađen, idite na odjeljak Funkcije:

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka
Pritisni gumb Stvorite funkciju i dajte mu željeno ime:

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka
Nakon pritiskanja Stvorite funkciju imat ćemo prikaz stvorene funkcije:

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka
Prije nego počnete stvarati kod u Pythonu, morat ćete izraditi bota u Telegramu. Neću opisivati ​​kako se to radi - postoje detaljne upute u našoj bazi znanja. Glavna stvar za nas je token kreiranog bota.

Priprema koda

Odabrao sam Nacionalnu upravu za oceane i atmosferu (NOAA) kao izvor pouzdanih podataka. Ova znanstvena agencija ažurira podatke u stvarnom vremenu na svom poslužitelju u TXT formatu.

Link za dobivanje METAR podataka (obratite pozornost na mala i mala slova):

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

U mom slučaju, najbliži aerodrom je Vnukovo, njegov ICAO kod je UUWW. Odlaskom na generirani URL dobit ćete sljedeće:

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

Prvi red je trenutno vrijeme prognoze u srednjem vremenu po Greenwichu. Drugi red je sažetak stvarnog vremena. Piloti civilnog zrakoplovstva neće imati problema razumjeti što ova linija znači, ali trebamo objašnjenje:

  • [UUWW] — Vnukovo, Moskva (Rusija — RU);
  • [101130Z] — 10. dan u mjesecu, 11:30 GMT;
  • [31004MPS] — smjer vjetra 310 stupnjeva, brzina 4 m/s;
  • [9999] — horizontalna vidljivost 10 km ili više;
  • [SCT048] — raštrkani/raspršeni oblaci na 4800 stopa (~1584m);
  • [24 / 13] — temperatura 24°C, rosište 13°C;
  • [Q1014] — tlak (QNH) 1014 hektopaskala (750 mm Hg);
  • [R01/000070] — koeficijent prianjanja na stazi 01 — 0,70;
  • [NOSIG] - bez bitnih promjena.

Počnimo pisati programski kod. Prvo morate uvesti funkcije zatražiti и pitaf:

from urllib import request
import pytaf

Navedite varijable i pripremite funkciju dekodiranja:

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

Prijeđimo na TAF (mala i mala slova su također bitna).

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

Kao i u prethodnom primjeru, pogledajmo prognozu u zračnoj luci 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

Obratimo posebnu pozornost na linije TEMPO и BECMG. TEMPO znači da će se stvarno vrijeme tijekom navedenog razdoblja povremeno mijenjati. BECMG - vrijeme će se postupno mijenjati u određenom vremenskom razdoblju.

Odnosno redak:

TEMPO 1012/1020 -TSRA BKN020CB

značit će:

  • [1012 / 1020] — između 12 i 20 sati (srednje vrijeme po Greenwichu);
  • [-TSRA] — grmljavinsko nevrijeme (TS = thunderstorm) s kišom (RA = rain) slabog intenziteta (predznak minus);
  • [BKN020CB] - značajni (BKN = isprekidani), kumulonimbusi (CB = kumulonimbusi) oblaci na 2000 stopa (610 metara) iznad razine mora.

Pojmova za vremenske pojave ima dosta i teško ih je zapamtiti. Kod za TAF zahtjev napisan je na sličan način.

Prijenos koda u oblak

Kako ne bismo gubili vrijeme, uzmimo predložak telegram bota iz našeg repozitorija oblak-telegram-bot. Postoji unaprijed pripremljena zahtjevi.txt и setup.py s ispravnom strukturom imenika.

Budući da ćemo u kodu pristupati modulu pitaf, tada njegovu verziju treba odmah dodati zahtjevi.txt

pytaf~=1.2.1

  • Prijeđimo na uređivanje bot/tele_bot.py. Uklanjamo sve nepotrebne stvari i dodajemo naš kod.

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)

  • Spakiramo cijeli imenik u ZIP arhivu i idemo na upravljačku ploču do stvorene funkcije.
  • Gurnuti Uređivanje i preuzmite arhivu s kodom.

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka

  • Ispunite relativni put u datoteci tele_bot (proširenje .py možda nije navedeno) i funkcija krajnje točke (u danom primjeru to je glavni).
  • U odjeljku Varijable okoline napisati varijablu TOKEN i dodijelite mu token željenog telegram bota.
  • Gurnuti Spremi i proširi, nakon čega idemo na odjeljak okidači.
  • Stavili smo prekidač HTTP zahtjevda se zahtjev javno objavi.

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka
Sada imamo URL za javno pozivanje funkcije. Sve što je ostalo je konfigurirajte webhook. Pronađite našeg bota @SelectelServerless_bot u Telegramu i registrirajte svog bota naredbom:

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

Rezultirati

Ako je sve učinjeno ispravno, vaš će bot odmah početi s radom i prikazati najnovije zrakoplovno vremensko izvješće izravno u messengeru.

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka
Naravno, šifra se može poboljšati, ali čak iu trenutnom stanju dovoljna je da saznate najtočniju vremensku prognozu iz provjerenog izvora.

Punu verziju koda pronaći ćete u našem spremišta na GitHubu.

Najtočnija vremenska prognoza: bot za Telegram na funkcijama oblaka

Izvor: www.habr.com

Dodajte komentar