Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích
Existuje spousta služeb, které poskytují informace o počasí, ale které z nich považovat za důvěryhodné? Když jsem začal často jezdit na kole, chtěl jsem mít co nejpřesnější informace o povětrnostních podmínkách v oblasti, kde jezdím.

První myšlenkou bylo postavit si malou DIY meteorologickou stanici se senzory a získávat data z ní. Ale nechtěl jsem „vynalézat kolo“ a jako zdroj ověřených dat jsem zvolil informace o počasí používané v civilním letectví, konkrétně METAR (METeorological Aerodrome Report) a TAF (TAF — Terminal Aerodrome Forecast). V letectví závisí na počasí životy stovek lidí, takže předpovědi jsou maximálně přesné.

Tyto informace jsou ve zpracování k dispozici 24/7 a přenášejí se hlasem na každém moderním letišti jako ATIS (Automatic Terminal Information Service) a VOLMET (z francouzského vol — let a météo — počasí). První poskytuje informace o aktuálním počasí na letišti a druhý — předpověď na následujících 24-30 hodin, a to nejen na letišti, kde se přenáší, ale i na jiných.

Příklad funkce ATIS na letišti Vnukovo:

Příklad funkce VOLMET na letišti Vnukovo

Nosit neustále rádio nebo transceiver na odpovídající frekvenci je nepohodlné, a tak jsem chtěl vytvořit bota na Telegramu, který po stisknutí tlačítka umožní získat stejnou předpověď. Vyčleňovat na to samostatný server je nejméně neefektivní, stejně jako posílat požadavky na domácí Raspberry.

Proto jako backend jsem se rozhodl použít službu Cloudové funkce Selectel. Počet požadavků bude zanedbatelný, takže taková služba vyjde prakticky na nulu (podle mých odhadů 22 korun za 100 000 požadavků).

Příprava backendu

Vytvoření funkce

V řídicím panelu my.selectel.ru otevřeme pohled Cloudová platforma a vytvoříme nový projekt:

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích
Jakmile je projekt vytvořen, přejdeme do sekce Funkce:

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích
Stiskneme tlačítko Vytvořit funkci a dáme jí potřebný název:

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích
Po stisknutí Vytvořit funkci se nám zobrazí pohled na vytvořenou funkci:

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích
Předtím, než začneme vytvářet kód v Pythonu, bude třeba vytvořit bota na Telegramu. Popisovat, jak to udělat, nebudu — podrobný návod je v naší znalostní bázi. Hlavní pro nás je token vytvořeného bota.

Připravujeme kód

Jako zdroj spolehlivých dat jsem zvolil Národní úřad pro oceán a atmosféru USA (angl. National Oceanic and Atmospheric Administration, NOAA). Tento vědecký úřad aktualizuje data na svém serveru v reálném čase ve formátu TXT.

Odkaz pro získání dat METAR (vezměte na vědomí velikost písmen):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXT

V mém případě je nejbližším letištěm Vnukovo, jeho kód podle ICAO je UUWW. Přechod na vytvořenou URL vrátí následující:

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

První řádek je čas aktuálnosti předpovědi podle Greenwichského času. Druhý řádek poskytuje shrnutí aktuálního počasí. Piloti obchodní letecké dopravy snadno pochopí, co tato řádka znamená, ale potřebujeme její rozklad:

  • [UUWW] — Vnukovo, město Moskva (Rusko — RU);
  • [101130Z] — 10. den měsíce, 11 hodin 30 minut podle Greenwichského času;
  • [31004MPS] — směr větru 310 stupňů, rychlost 4 m/s;
  • [9999] — horizontální viditelnost 10 km a více;
  • [SCT048] — rozptýlené oblaky v výšce 4800 stop (~1584m);
  • [24/13] — teplota 24°C, rosný bod 13°C;
  • [Q1014] — tlak (QNH) 1014 hektopascalů (750 mmHg);
  • [R01/000070] — koeficient adheze na dráze 01 — 0,70;
  • [NOSIG] — bez významných změn.

Přejděme k psaní programového kódu. Nejprve potřebujeme importovat funkce request a pytaf:

from urllib import request
import pytaf

Definujeme proměnné a připravíme funkci pro dekódování:

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

Přejděme k TAF (velikost písmen je také důležitá).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXT

Stejně jako v předchozím příkladu se podívejme na předpověď na letišti 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

Zvláštní pozornost věnujme řádkům TEMPO a BECMG. TEMPO znamená, že skutečné počasí se v uvedeném období bude periodicky měnit. BECMG — počasí se postupně změní v uvedeném časovém intervalu.

To znamená, že řádek:

TEMPO 1012/1020 -TSRA BKN020CB

Bude znamenat:

  • [1012/1020] — v období od 12 do 20 hodin (podle Greenwichského času);
  • [-TSRA] — bouřka (TS = thunderstorm) s deštěm (RA = rain) nízké intenzity (znak minus);
  • [BKN020CB] — značná (BKN = broken), kupolovitá dešťová (CB = cumulonimbus) oblačnost ve výšce 2000 stop (610 metrů) nad mořem.

Existuje mnoho termínů, které označují meteorologické jevy, a je obtížné si je zapamatovat. Kód pro dotaz na TAF se vytváří obdobným způsobem.

Nahráváme kód do cloudu

Abychom neztráceli čas, vezmeme si šablonu telegramového bota z našeho repozitáře cloud-telegram-bot. Je tam předpřipravený requirements.txt a setup.py s korektní strukturou adresářů.

Protože se v kódu budeme odkazovat na modul pytaf, je nutné jeho verzi ihned přidat do requirements.txt

pytaf~=1.2.1

  • Přecházíme k úpravě bot/tele_bot.py. Odstraníme vše zbytečné a dopíšeme 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 = "Ahoj. Tento bot slouží k obdržení letecké předpovědi počasí " 
          "ze serverů NOAA. Bot je nastaven na letiště Vnukovo (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):
    # Získejte informace ze serveru.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Odešlete formátovanou odpověď.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # Získejte informace ze serveru.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Odešlete formátovanou odpověď.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Router příkazů.
    """
    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):
    """
    Vstupní bod serverless prostředí.
    """
    print(f'Bylo přijato: "{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 na "{message.text}"')
        route_command(message.text.lower(), message)

  • Zabalíme celý adresář do ZIP archivu a přejdeme do ovládacího panelu k vytvořené funkci.
  • Klikneme Upravit a nahrajeme archiv s kódem.

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích

  • Vyplňte relativní cestu k souboru tele_bot (přípona .py není nutné uvádět) a endpoint funkce (v uvedeném příkladu je to main).
  • V sekci Proměnné prostředí napíšeme proměnnou TOKEN a přiřadíme jí token potřeba telegramového bota.
  • Klikneme Uložit a nasadit, po čemž přejdeme do sekce Spouštěče.
  • Přepněte přepínač HTTP-žádost, aby se žádost stala veřejnou.

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích
Máme URL pro veřejné volání funkce. Je jen potřeba nastavit webhook. Najděte našeho bota @SelectelServerless_bot na Telegramu a zaregistrujte svého bota příkazem:

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

Výsledek

Pokud je vše provedeno správně, váš bot začne okamžitě fungovat a zobrazovat aktuální přehled leteckého počasí přímo v Messengeru.

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích
Samozřejmě, kód lze upravit, ale i v současném stavu je dostatečný na to, abyste získali nejpřesnější počasí a předpověď z ověřeného zdroje.

Celou verzi kódu naleznete v našem repozitáři na GitHubu.

Nejpřesnější předpověď počasí: bot pro Telegram na cloudových funkcích

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster