Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku
Obstaja veliko storitev, ki zagotavljajo vremenske informacije, a kateri od njih zaupati? Ko sem začel pogosto kolesariti, sem želel imeti čim natančnejše informacije o vremenskih razmerah v kraju, kjer kolesarim.

Moja prva misel je bila zgraditi majhno vremensko postajo DIY s senzorji in prejemati podatke iz nje. Nisem pa "na novo izumil kolesa" in sem za vir preverjenih podatkov izbral podatke o vremenu, ki se uporabljajo v civilnem letalstvu, tj. METAR (METeorological Aerodrome Report) in TAF (TAF - Terminal Aerodrome Forecast). V letalstvu so življenja na stotine ljudi odvisna od vremena, zato so napovedi kar se da točne.

Te informacije se glasovno oddajajo XNUMX/XNUMX na vsakem sodobnem letališču v obrazcu ATIS (Automatic Terminal Information Service) in VOLMET (iz francoščine. vol - let in Météo - vreme). Prvi zagotavlja informacije o dejanskem vremenu na letališču, drugi pa napoved za naslednjih 24-30 ur, ne samo na oddajnem letališču, ampak tudi na drugih.

Primer delovanja ATIS na letališču Vnukovo:

Primer delovanja VOLMET na letališču Vnukovo

Neprijetno je vedno nositi s seboj radijski skener ali oddajnik-sprejemnik za ustrezno območje in želel sem ustvariti bota v Telegramu, ki vam s klikom na gumb omogoča, da dobite enako napoved. Vsaj nepraktično je dodeliti ločen strežnik za to, kot tudi pošiljanje zahtev vaši domači Raspberry.

Zato sem se odločil, da storitev uporabim kot zaledje Selectel Cloud Features. Število zahtev bo zanemarljivo, zato bo takšna storitev skoraj brezplačna (po mojih izračunih bo 22 rubljev za 100 zahtev).

Priprava zaledja

Ustvarjanje funkcije

Na nadzorni plošči my.selectel.ru odprite pogled Oblačna platforma in ustvarite nov projekt:

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku
Ko je projekt ustvarjen, pojdite na razdelek Funkcije:

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku
Potisnite gumb Ustvarite funkcijo in mu dajte želeno ime:

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku
Po kliku Ustvarite funkcijo imeli bomo predstavitev ustvarjene funkcije:

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku
Preden začnete ustvarjati kodo v Pythonu, boste morali ustvariti bota v Telegramu. Ne bom opisoval, kako se to naredi - obstajajo podrobna navodila v naši bazi znanja. Glavna stvar za nas je žeton ustvarjenega bota.

Priprava kode

Kot vir zanesljivih podatkov sem izbral Nacionalno upravo za oceane in atmosfero (NOAA). Ta znanstvena agencija posodablja podatke v realnem času na svojem strežniku v formatu TXT.

Povezava za pridobitev podatkov METAR (upoštevajte velike in male črke):

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

V mojem primeru je najbližje letališče Vnukovo, njegova oznaka ICAO je UUWW. Ob prehodu na ustvarjeni URL boste dobili naslednje:

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

Prva vrstica je trenutni čas napovedi v srednjem času po Greenwichu. Druga vrstica je povzetek dejanskega vremena. Piloti civilnega letalstva bodo brez težav razumeli, kaj ta vrstica pomeni, vendar potrebujemo razlago:

  • [UUWW] — Vnukovo, Moskva (Rusija — RU);
  • [101130Z] — 10. dan v mesecu, 11 GMT;
  • [31004MPS] — smer vetra 310 stopinj, hitrost 4 m/s;
  • [9999] — vodoravna vidljivost 10 km ali več;
  • [SCT048] — razpršeni/razpršeni oblaki na 4800 čevljih (~1584 m);
  • [24 / 13] — temperatura 24°C, rosišče 13°C;
  • [Q1014] — tlak (QNH) 1014 hektopaskalov (750 mm Hg);
  • [R01/000070] — koeficient oprijema na stezi 01 — 0,70;
  • [NOSIG] - brez bistvenih sprememb.

Začnimo pisati programsko kodo. Najprej morate uvoziti funkcije zahteva и pytaf:

from urllib import request
import pytaf

Določite spremenljivke in pripravite funkcijo 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()

Pojdimo na TAF (pomembna je tudi velika velikost).

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

Tako kot v prejšnjem primeru si poglejmo napoved na letališču 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

Posebej bodimo pozorni na linije TEMPO и BECMG. TEMPO pomeni, da se bo dejansko vreme v določenem obdobju periodično spreminjalo. BECMG - vreme se bo v določenem časovnem obdobju postopoma spreminjalo.

To je vrstica:

TEMPO 1012/1020 -TSRA BKN020CB

Bo pomenilo:

  • [1012 / 1020] — med 12. in 20. uro (srednji čas po Greenwichu);
  • [-TSRA] — nevihta (TS = nevihta) z dežjem (RA = dež) nizke intenzivnosti (predznak minus);
  • [BKN020CB] - znatni (BKN = pretrgani), kumulonimbusi (CB = kumulonimbusi) oblaki na 2000 čevljev (610 metrov) nad morsko gladino.

Izrazov za vremenske pojave je kar nekaj in težko si jih je zapomniti. Koda za zahtevo TAF je zapisana na podoben način.

Nalaganje kode v oblak

Da ne izgubljamo časa, vzemimo predlogo telegram bot iz našega skladišča oblak-telegram-bot. Obstaja vnaprej pripravljena zahteve.txt и setup.py s pravilno strukturo imenika.

Ker bomo v kodi dostopali do modula pytaf, potem je treba njegovo različico takoj dodati zahteve.txt

pytaf~=1.2.1

  • Preidimo na urejanje bot/tele_bot.py. Odstranimo vse nepotrebne stvari in dodamo svojo kodo.

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)

  • Celoten imenik zapakiramo v ZIP arhiv in gremo na nadzorno ploščo do ustvarjene funkcije.
  • Potisnite Urejanje in prenesite arhiv s kodo.

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku

  • Izpolnite relativno pot v datoteki tele_bot (razširitev .py morda ni navedena) in funkcijo končne točke (v danem primeru je to Glavni).
  • V oddelku Spremenljivke okolja napišite spremenljivko ŽETON in mu dodelite žeton želenega telegram bota.
  • Potisnite Shrani in razširi, po katerem gremo na odsek Sprožilci.
  • Postavili smo stikalo HTTP zahtevada zahtevo javno objavi.

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku
Zdaj imamo URL za javno klicanje funkcije. Vse kar je ostalo je konfigurirajte webhook. Poiščite našega bota @SelectelServerless_bot v Telegramu in registrirajte svojega bota z ukazom:

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

Rezultat

Če je vse opravljeno pravilno, bo vaš bot takoj začel delovati in prikazal najnovejše letalsko vremensko poročilo neposredno v messengerju.

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku
Kodo je seveda mogoče izboljšati, vendar je tudi v trenutnem stanju dovolj, da iz zaupanja vrednega vira izveste najbolj natančno vreme in napoved.

Celotno različico kode boste našli v našem repozitorije na GitHubu.

Najbolj natančna vremenska napoved: bot za Telegram na funkcijah v oblaku

Vir: www.habr.com

Dodaj komentar