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

Nejpřesnější předpověď počasí: robot pro Telegram na cloudových funkcích
Existuje mnoho služeb, které poskytují informace o počasí, ale které z nich byste měli věřit? 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 místě, kde jezdím.

Moje první myšlenka byla postavit malou DIY meteostanici se senzory a přijímat z ní data. Ale „nevynalézal jsem kolo“ a jako zdroj ověřených dat jsem zvolil informace o počasí, které se používají v civilním letectví, a to METAR (Meteorologická zpráva o letišti) a TAF (TAF - Terminal Aerodrome Forecast). V letectví závisí na počasí život stovek lidí, takže předpovědi jsou co nejpřesnější.

Tyto informace jsou vysílány XNUMX/XNUMX hlasem na každém moderním letišti ve formuláři ATIS (Automatická informační služba terminálu) a VOLMET (z francouzštiny vol - let a Météo - počasí). První poskytuje informace o aktuálním počasí na letišti a druhý poskytuje předpověď na dalších 24-30 hodin nejen na vysílaném letišti, ale i na dalších.

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

Příklad, jak funguje VOLMET na letišti Vnukovo

Je nepohodlné nosit s sebou rádiový skener nebo transceiver pokaždé pro odpovídající rozsah a chtěl jsem vytvořit robota v Telegramu, který vám kliknutím na tlačítko umožní získat stejnou předpověď. Je přinejmenším nepraktické k tomu přidělovat samostatný server, stejně jako zasílání požadavků na domácí Raspberry.

Proto jsem se rozhodl službu využít jako backend Vyberte funkce cloudu. Počet žádostí bude zanedbatelný, takže taková služba bude prakticky zdarma (podle mých výpočtů to bude 22 rublů za 100 000 žádostí).

Příprava backendu

Vytvoření funkce

V ovládacím panelu my.selectel.ru otevřete pohled Cloudová platforma a vytvořte nový projekt:

Nejpřesnější předpověď počasí: robot pro Telegram na cloudových funkcích
Po vytvoření projektu přejděte do sekce funkce:

Nejpřesnější předpověď počasí: robot pro Telegram na cloudových funkcích
Stiskněte tlačítko Vytvořte funkci a dejte mu požadovaný název:

Nejpřesnější předpověď počasí: robot pro Telegram na cloudových funkcích
Po stisknutí Vytvořte funkci budeme mít reprezentaci vytvořené funkce:

Nejpřesnější předpověď počasí: robot pro Telegram na cloudových funkcích
Než začnete vytvářet kód v Pythonu, budete muset vytvořit robota v Telegramu. Nebudu popisovat, jak se to dělá - existují podrobné pokyny v naší znalostní bázi. Hlavní je pro nás token vytvořeného bota.

Příprava kódu

Jako zdroj spolehlivých dat jsem zvolil Národní úřad pro oceán a atmosféru (NOAA). Tato vědecká agentura aktualizuje data v reálném čase na svém serveru ve formátu TXT.

Odkaz pro získání dat METAR (všimněte si případu):

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

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

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

První řádek je aktuální čas předpovědi v Greenwichském středním čase. Druhý řádek je souhrn aktuálního počasí. Piloti civilního letectví nebudou mít problém pochopit, co tento řádek znamená, ale potřebujeme vysvětlení:

  • [UUWW] — Vnukovo, Moskva (Rusko – RU);
  • [101130Z] — 10. den v měsíci, 11:30 GMT;
  • [31004MPS] — směr větru 310 stupňů, rychlost 4 m/s;
  • [9999] — vodorovná viditelnost 10 km nebo více;
  • [SCT048] — rozptýlené/rozptýlené mraky ve výšce 4800 stop (~1584 m);
  • [24 / 13] — teplota 24°C, rosný bod 13°C;
  • [Q1014] — tlak (QNH) 1014 hektopascalů (750 mm Hg);
  • [R01/000070] — koeficient adheze na dráze 01 — 0,70;
  • [NOSIG] - bez výrazných změn.

Začněme psát programový kód. Nejprve musíte importovat funkce požádat и pytaf:

from urllib import request
import pytaf

Zadejte proměnné a připravte dekódovací funkci:

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 (důležité je i pouzdro).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.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

Pozor si dejte především na čáry TEMPO и BECMG. TEMPO znamená, že se aktuální počasí během zadaného období bude periodicky měnit. BECMG - počasí se bude postupně měnit ve stanoveném časovém období.

Tedy řádek:

TEMPO 1012/1020 -TSRA BKN020CB

Bude znamenat:

  • [1012 / 1020] — mezi 12 a 20 hodinami (greenwichský čas);
  • [-TSRA] — bouřka (TS = bouřka) s deštěm (RA = déšť) nízké intenzity (znaménko mínus);
  • [BKN020CB] - významné (BKN = rozbité), kupovité (CB = cumulonimbus) mraky ve výšce 2000 stop (610 metrů) nad mořem.

Termínů pro jevy počasí je poměrně hodně a zapamatovat si je je těžké. Kód pro požadavek TAF je napsán podobným způsobem.

Nahrávání kódu do cloudu

Abychom neztráceli čas, vezmeme si šablonu telegramového bota z našeho úložiště cloud-telegram-bot. K dispozici je předem připravená požadavky.txt и setup.py se správnou adresářovou strukturou.

Protože v kódu budeme přistupovat k modulu pytaf, pak by měla být jeho verze okamžitě přidána do požadavky.txt

pytaf~=1.2.1

  • Pojďme k úpravám bot/tele_bot.py. Odstraňujeme všechny nepotřebné věci a přidává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ář zabalíme do ZIP archivu a přejdeme na ovládací panel k vytvořené funkci.
  • Klikněte zde Edit a stáhněte si archiv s kódem.

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

  • Vyplňte relativní cestu v souboru tele_bot (rozšíření .py nemusí být specifikováno) a funkce koncového bodu (v uvedeném příkladu to je hlavní).
  • V sekci Proměnné prostředí napsat proměnnou ŽETON a přiřaďte mu token požadovaného telegramového robota.
  • Klikněte zde Uložit a rozbalit, načež přejdeme do oddílu Spouští.
  • Dali jsme vypínač HTTP požadavekaby byl požadavek veřejný.

Nejpřesnější předpověď počasí: robot pro Telegram na cloudových funkcích
Nyní máme URL pro veřejné volání funkce. Zbývá už jen nakonfigurovat webhook. Najděte našeho robota @SelectelServerless_bot v Telegramu a zaregistrujte svého robota pomocí příkazu:

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

Výsledek

Pokud je vše provedeno správně, váš bot začne okamžitě pracovat a zobrazí nejnovější zprávu o leteckém počasí přímo v messengeru.

Nejpřesnější předpověď počasí: robot pro Telegram na cloudových funkcích
Kód lze samozřejmě vylepšit, ale i v aktuálním stavu stačí zjistit co nejpřesnější počasí a předpověď z důvěryhodného zdroje.

Plnou verzi kódu najdete v našem úložiště na GitHubu.

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

Zdroj: www.habr.com

Přidat komentář