Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách
Existuje veľa služieb, ktoré poskytujú informácie o počasí, ale ktorej z nich by ste mali dôverovať? Keď som začal často bicyklovať, chcel som mať čo najpresnejšie informácie o poveternostných podmienkach v mieste, kde jazdím.

Moja prvá myšlienka bola zostaviť malú DIY meteostanicu so senzormi a prijímať z nej dáta. Ale „nevynašiel som koleso“ a ako zdroj overených údajov som si vybral informácie o počasí, ktoré sa používajú v civilnom letectve, a to METAR (Meteorologická správa z letiska) a TAF (TAF - Terminal Airport Forecast). V letectve závisia od počasia životy stoviek ľudí, takže predpovede sú čo najpresnejšie.

Tieto informácie sú vysielané XNUMX/XNUMX hlasom na každom modernom letisku vo forme ATIS (Automatická informačná služba terminálu) a VOLMET (z francúzštiny. vol - let a Meteo - počasie). Prvý poskytuje informácie o aktuálnom počasí na letisku a druhý poskytuje predpoveď na najbližších 24-30 hodín nielen na vysielacom letisku, ale aj na iných.

Príklad prevádzky ATIS na letisku Vnukovo:

Príklad fungovania VOLMET na letisku Vnukovo

Je nepohodlné nosiť so sebou rádiový skener alebo transceiver zakaždým pre príslušný rozsah a chcel som vytvoriť robota v telegrame, ktorý vám po kliknutí na tlačidlo umožní získať rovnakú predpoveď. Je prinajmenšom nepraktické vyčleniť na to samostatný server, ako aj posielať požiadavky na váš domáci Raspberry.

Preto som sa rozhodol využiť službu ako backend Vyberte funkcie cloudu. Počet žiadostí bude zanedbateľný, takže takáto služba bude prakticky bezplatná (podľa mojich výpočtov to bude 22 rubľov za 100 000 žiadostí).

Príprava backendu

Vytvorte funkciu

V ovládacom paneli my.selectel.ru otvorte pohľad Cloudová platforma a vytvorte nový projekt:

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách
Po vytvorení projektu prejdite do sekcie Funkcia:

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách
Stlačte tlačidlo Vytvorte funkciu a dajte mu požadovaný názov:

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách
Po stlačení Vytvorte funkciu budeme mať reprezentáciu vytvorenej funkcie:

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách
Predtým, ako začnete vytvárať kód v Pythone, budete musieť vytvoriť robota v telegrame. Nebudem popisovať, ako sa to robí - existujú podrobné pokyny v našej znalostnej báze. Hlavná vec je pre nás token vytvoreného bota.

Príprava kódu

Ako zdroj spoľahlivých údajov som si vybral Národný úrad pre oceán a atmosféru (NOAA). Táto vedecká agentúra aktualizuje údaje v reálnom čase na svojom serveri vo formáte TXT.

Odkaz na získanie údajov METAR (všimnite si prípad):

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

V mojom prípade je najbližšie letisko Vnukovo, jeho ICAO kód je UUWW. Prechod na vygenerovanú adresu URL poskytne nasledovné:

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

Prvý riadok je aktuálny čas predpovede v Greenwichskom strednom čase. Druhý riadok je sumárom aktuálneho počasia. Piloti civilného letectva nebudú mať problém pochopiť, čo tento riadok znamená, ale potrebujeme vysvetlenie:

  • [UUWW] — Vnukovo, Moskva (Rusko – RU);
  • [101130Z] — 10. deň v mesiaci, 11:30 GMT;
  • [31004MPS] — smer vetra 310 stupňov, rýchlosť 4 m/s;
  • [9999] — horizontálna viditeľnosť 10 km alebo viac;
  • [SCT048] — rozptýlené/rozptýlené oblaky vo výške 4800 stôp (~1584 m);
  • [24 / 13] — teplota 24°C, rosný bod 13°C;
  • [Q1014] — tlak (QNH) 1014 hektopascalov (750 mm Hg);
  • [R01/000070] — koeficient adhézie na pruhu 01 – 0,70;
  • [NOSIG] - bez výrazných zmien.

Začnime písať programový kód. Najprv musíte importovať funkcie požiadať и pytaf:

from urllib import request
import pytaf

Zadajte premenné a pripravte dekódovaciu funkciu:

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

Prejdime k TAF (veľké písmená sú tiež dôležité).

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

Ako v predchádzajúcom príklade, pozrime sa na predpoveď na letisku 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

Venujme pozornosť najmä čiaram TEMPO и BECMG. TEMPO znamená, že skutočné počasie počas určeného obdobia sa bude pravidelne meniť. BECMG - počasie sa bude postupne meniť v určenom časovom období.

Teda riadok:

TEMPO 1012/1020 -TSRA BKN020CB

Bude znamenať:

  • [1012 / 1020] — medzi 12 a 20 hodinami (Greenwichský čas);
  • [-TSRA] — búrka (TS = búrka) s dažďom (RA = dážď) nízkej intenzity (znamienko mínus);
  • [BKN020CB] - výrazné (BKN = rozbité), kupovité (CB = cumulonimbus) oblaky vo výške 2000 stôp (610 metrov) nad morom.

Výrazov pre poveternostné javy je pomerne veľa a zapamätať si ich je náročné. Kód pre požiadavku TAF je napísaný podobným spôsobom.

Nahrávanie kódu do cloudu

Aby sme nestrácali čas, vezmime si šablónu telegramového bota z nášho úložiska cloud-telegram-bot. K dispozícii je vopred pripravený request.txt и setup.py so správnou adresárovou štruktúrou.

Keďže v kóde budeme pristupovať k modulu pytaf, potom by sa jeho verzia mala okamžite pridať do request.txt

pytaf~=1.2.1

  • Prejdime k úprave bot/tele_bot.py. Odstránime všetky nepotrebné veci a pridáme náš kód.

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)

  • Celý adresár zabalíme do ZIP archívu a prejdeme na ovládací panel k vytvorenej funkcii.
  • lis Edit a stiahnite si archív s kódom.

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách

  • Vyplňte relatívnu cestu v súbore tele_bot (predĺženie .py nemusí byť špecifikované) a funkcia koncového bodu (v uvedenom príklade to je hlavné).
  • V sekcii Premenné prostredia napíšte premennú TOKEN a priraďte mu token požadovaného telegramového robota.
  • lis Uložiť a rozbaliť, po ktorej prejdeme do sekcie spúšťače.
  • Dali sme vypínač HTTP požiadavkazverejniť žiadosť.

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách
Teraz máme URL na verejné volanie funkcie. Ostalo už len nakonfigurovať webhook. Nájdite nášho robota @SelectelServerless_bot v telegrame a zaregistrujte svoj robot pomocou príkazu:

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

Výsledok

Ak je všetko vykonané správne, váš bot začne okamžite pracovať a zobrazí najnovšiu správu o leteckom počasí priamo v messengeri.

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách
Kód sa samozrejme dá vylepšiť, no aj v aktuálnom stave stačí zistiť čo najpresnejšie počasie a predpoveď z dôveryhodného zdroja.

Úplnú verziu kódu nájdete v našom úložiská na GitHub.

Najpresnejšia predpoveď počasia: robot pre telegram na cloudových funkciách

Zdroj: hab.com

Pridať komentár