A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz
Nagyon sok szolgáltatás nyújt időjárási információkat, de melyikben érdemes megbízni? Amikor elkezdtem gyakran kerékpározni, szerettem volna a lehető legpontosabb információkat kapni az időjárási viszonyokról azon a helyen, ahol lovagolok.

Az első gondolatom az volt, hogy építek egy kis barkácsoló meteorológiai állomást érzékelőkkel, és adatokat fogadok belőle. De nem „találtam fel újra a kereket”, hanem a polgári repülésben használt időjárási információkat választottam az ellenőrzött adatok forrásául, nevezetesen METAR (METeorological Aerodrome Report) és TAF (TAF – Terminal Aerodrome Forecast). A repülésben több száz ember élete függ az időjárástól, így az előrejelzések a lehető legpontosabbak.

Ezt az információt a nap XNUMX órájában sugározzák hangon minden modern repülőtéren a formában ATIS (Automatikus terminálinformációs szolgáltatás) és VOLMET (francia nyelvből. vol - repülés és Meteo - időjárás). Az első a repülőtér aktuális időjárásáról ad tájékoztatást, a második pedig előrejelzést ad a következő 24-30 órára, nem csak a sugárzott repülőtéren, hanem másokon is.

Példa az ATIS működésére a Vnukovo repülőtéren:

Példa a VOLMET működésére a Vnukovo repülőtéren

Kényelmetlen minden alkalommal magával vinni egy rádiós szkennert vagy adó-vevőt a megfelelő tartományhoz, és egy olyan botot akartam létrehozni a Telegramban, amely egyetlen gombnyomással lehetővé teszi ugyanazt az előrejelzést. Ehhez legalábbis nem praktikus külön szervert rendelni, valamint kéréseket küldeni az otthoni Raspberry-re.

Ezért úgy döntöttem, hogy háttérként használom a szolgáltatást Válassza ki a felhőszolgáltatásokat. A kérések száma elenyésző lesz, így gyakorlatilag ingyenes lesz egy ilyen szolgáltatás (számításaim szerint 22 rubel lesz 100 000 kérés esetén).

Backend előkészítés

Hozzon létre egy függvényt

A vezérlőpulton my.selectel.ru nyissa meg a nézetet felhő platform és hozzon létre egy új projektet:

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz
A projekt létrehozása után lépjen a szakaszra függvények:

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz
Nyomja meg a gombot Hozzon létre egy függvényt és adja meg a kívánt nevet:

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz
Megnyomás után Hozzon létre egy függvényt megkapjuk a létrehozott függvény reprezentációját:

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz
Mielőtt elkezdené a kód létrehozását a Pythonban, létre kell hoznia egy botot a Telegramban. Nem írom le, hogy ez hogyan történik - részletes utasítások vannak tudásbázisunkban. Számunkra a legfontosabb a létrehozott bot tokenje.

A kód előkészítése

Megbízható adatok forrásául a National Oceanic and Atmospheric Administration (NOAA) nevű szervezetet választottam. Ez a tudományos ügynökség valós időben frissíti az adatokat a szerverén TXT formátumban.

Link a METAR adatok lekéréséhez (figyelje meg az esetet):

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

Esetemben a legközelebbi repülőtér a Vnukovo, az ICAO kódja UUWW. A generált URL-re lépve a következőt kapjuk:

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

Az első sor az előrejelzés aktuális időpontja greenwichi idő szerint. A második sor az aktuális időjárás összefoglalása. A polgári repülés pilótáinak nem okoz gondot megérteni, mit jelent ez a sor, de magyarázatra van szükségünk:

  • [UUWW] – Vnukovo, Moszkva (Oroszország – RU);
  • [101130Z] — a hónap 10. napja, 11:30 GMT;
  • [31004MPS] — szélirány 310 fok, sebesség 4 m/s;
  • [9999] — vízszintes látótávolság legalább 10 km;
  • [SCT048] — szórványos/szórt felhők 4800 láb (~1584m) magasságban;
  • [24 / 13] — hőmérséklet 24°C, harmatpont 13°C;
  • [Q1014] — nyomás (QNH) 1014 hektopascal (750 Hgmm);
  • [R01/000070] — tapadási együttható a 01-es sávon — 0,70;
  • [NINCS JELENTŐS VÁLTOZÁS] - lényeges változtatások nélkül.

Kezdjük el írni a programkódot. Először is importálnia kell a függvényeket kérni и pytaf:

from urllib import request
import pytaf

Adja meg a változókat és készítse elő a dekódoló függvényt:

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

Térjünk át a TAF-ra (a kisbetű is fontos).

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

Az előző példához hasonlóan nézzük meg a Vnukovo repülőtér előrejelzését:

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

Különös figyelmet fordítsunk a vonalakra TEMPO и BECMG. A TEMPO azt jelenti, hogy az aktuális időjárás a megadott időszakban időszakosan változik. BECMG - az időjárás fokozatosan megváltozik egy meghatározott időn belül.

Vagyis a sor:

TEMPO 1012/1020 -TSRA BKN020CB

Jelentése:

  • [1012 / 1020] — 12 és 20 óra között (greenwichi idő szerint);
  • [-TSRA] — zivatar (TS = zivatar) alacsony intenzitású esővel (RA = eső) (mínusz jel);
  • [BKN020CB] - jelentős (BKN = törött), gomolyfelhők (CB = cumulonimbus) 2000 láb (610 méter) tengerszint feletti magasságban.

Elég sok kifejezés létezik az időjárási jelenségekre, és nehéz megjegyezni őket. A TAF kérés kódja hasonló módon van megírva.

Kód feltöltése a felhőbe

Hogy ne vesztegessük az időt, vegyünk egy telegram bot sablont a tárhelyünkből felhő-távirat-bot. Van egy előre elkészített követelmények.txt и setup.py a megfelelő könyvtárszerkezettel.

Mivel a kódban hozzáférünk a modulhoz pytaf, akkor annak verzióját azonnal hozzá kell adni követelmények.txt

pytaf~=1.2.1

  • Térjünk át a szerkesztésre bot/tele_bot.py. Eltávolítunk minden felesleges dolgot, és hozzáadjuk a kódunkat.

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)

  • A teljes könyvtárat becsomagoljuk egy ZIP archívumba, és a vezérlőpultra lépünk a létrehozott funkcióhoz.
  • sajtó szerkesztés és töltse le az archívumot a kóddal.

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz

  • Töltse ki a relatív elérési utat a fájlban tele_bot (kiterjesztés .py nem adható meg) és egy végpontfüggvény (a megadott példában ez fő-).
  • Szakaszban Környezeti változók írj változót JELKÉPES és rendelje hozzá a kívánt táviratbot tokenjét.
  • sajtó Mentés és bővítés, utána megyünk a szakaszra kiváltó.
  • Feltesszük a kapcsolót HTTP kéréshogy a kérést nyilvánosságra hozzák.

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz
Most már van egy URL-címünk a függvény nyilvános meghívásához. Már csak az van hátra konfigurálja a webhookot. Keresse meg a botunkat @SelectelServerless_bot a Telegramban, és regisztrálja a botját a következő paranccsal:

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

Eredmény

Ha minden helyesen történik, a robot azonnal elkezd dolgozni, és közvetlenül a messengerben jeleníti meg a legfrissebb légi időjárás-jelentést.

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz
A kódon persze lehet javítani, de a jelenlegi állapotában is elég megbízható forrásból megtudni a legpontosabb időjárást és előrejelzést.

A kód teljes verzióját megtalálja nálunk adattárak a GitHubon.

A legpontosabb időjárás-előrejelzés: bot a Telegram on cloud funkciókhoz

Forrás: will.com

Hozzászólás