A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva
Sok időjárási információt szolgáltató szerviz közül nehéz megmondani, melyikre érdemes hallgatni. Amikor gyakran elkezdtem biciklizni, pontos időjárási információkra vágytam azokról a helyekről, ahol tekerészek.

Első gondolatom egy DIY időjárási állomás összeszerelése volt érzékelőkkel, hogy az adatok neki érkezzenek. De nem akartam "újra feltalálni a spanyolviaszt", így a megbízható adatok forrásaként a polgári repülésben használt időjárási információt választottam, nevezetesen METAR (METeorológiai Aerodrome Jelentés) és TAF (TAF — Terminális Aerodrome Előrejelzés). A repülésben az időjárás élet és halál kérdése, ezért a előrejelzések a lehető legpontosabbak.

Ezek az információk 24 órás üzemmódban hanggal kerülnek továbbításra minden modern repülőtéren ATIS (Automatikus Terminális Információs Szolgáltatás) és VOLMET (a francia vol — repülés és météo — időjárás). Az első az adott repülőtér aktuális időjárásáról ad információt, míg a második a következő 24-30 órás előrejelzést, nemcsak a továbbító repülőtéren, hanem más repülőtereken is. Az ATIS Vnukovo repülőtér működése például: A VOLMET Vnukovo repülőtér működése például: Kényelmetlen minden alkalommal rádióskannert vagy a megfelelő Frekvencián működő transzivert cipelni, így szerettem volna létrehozni egy Telegram botot, ami egy gombnyomásra lehetővé teszi hasonló előrejelzések megkapását. Nem érdemes külön szervert külön erre felállítani, akárcsak nem praktikus a házi Raspberry-re bonyolítani a lekérdezéseket. Ezért a backendként az

Selectel Cloud Functions

szolgáltatását választottam. A lekérdezések száma elhanyagolható, így ez a szolgáltatás valójában ingyenes lesz (a számításaim szerint 22 rubel 100 000 lekérdezésért).

A backend előkészítése

Funkció létrehozása A vezérlőpultbanmegnyitjuk a nézetet

Cloud Platform

és létrehozunk egy új projektet:

Miután a projekt létrejött, átmegyünk az my.selectel.ru Régi általános menü megnyitásához kattintsunk az gombra.

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva
Adjunk neki egy megfelelő nevet: Funkciók:

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva
A kattintás után Funkció létrehozása meg fog jelenni a létrehozott funkció nézete:

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva
Mielőtt elkezdjük a Python kód létrehozását, szükség lesz egy Telegram bot létrehozására. Nem fogom részletezni, hogyan kell ezt tenni — részletes útmutató található Funkció létrehozása tudásbázisunkban.

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva
A legfontosabb számunkra a létrehozott bot tokenje. Készítjük a kódot.Készítjük a kódot

Kódolt készség

A megbízható adatok forrásaként az Egyesült Államok Óceán- és Légköri Kutatóintézetét (angolul National Oceanic and Atmospheric Administration, NOAA) választottam. Ez a tudományos ügynökség valós időben frissíti az adatait TXT formátumban a szerverén.

A METAR adatok lekéréséhez szükséges link (figyeljen a kis- és nagybetűk használatára):

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

Az én esetemben a legközelebbi repülőtér Vnukovo, ennek ICAO kódja — UUWW. A generált URL-re lépve a következő információ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 érvényességének idejét mutatja GMT szerint. A második sor a tényleges időjárás összefoglalója. A polgári repülés pilótái könnyedén megértik, mit jelent ez a sor, de nekünk szükségünk van a dekódolásra:

  • [UUWW] — Vnukovo, Moszkva város (Oroszország — RU);
  • [101130Z] — a hónap 10. napja, 11 óra és 30 perc GMT szerint;
  • [31004MPS] — a szél iránya 310 fok, sebesség 4 m/s;
  • [9999] — a horizontális látótávolság 10 km és annál nagyobb;
  • [SCT048] — szétszó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 hectopascal (750 mmHg);
  • [R01/000070] — a tapadási együttható az 01-es pályán — 0,70;
  • [NOSIG] — jelentős változás nélkül.

Kezdjük el a programkód megírását. Először importálnunk kell a funkciókat request és pytaf:

from urllib import request
import pytaf

Állítsuk be a változókat és készítsük 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 kis- és nagybetűk itt is fontosak).

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

Mint az előző példában, 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ösen figyeljük meg a sorokat TEMPO és BECMG. A TEMPO azt jelenti, hogy a tényleges időjárás az adott időintervallumban időről időre változni fog. A BECMG — az időjárás fokozatosan megváltozik az adott időintervallumban.

Tehát a sor:

TEMPO 1012/1020 -TSRA BKN020CB

Azt jelenti:

  • [1012/1020] — az időintervallumban 12 és 20 óra között (GMT szerint);
  • [-TSRA] — zivatar (TS = thunderstorm) esővel (RA = rain) kis intenzitással (mínuszjel);
  • [BKN020CB] — jelentős (BKN = törött), gomolyfelhős (CB = cumulonimbus) felhőzet 2000 láb (610 méter) magasan a tengerszint felett.

Sok kifejezés létezik az időjárási jelenségekre, és nehéz megjegyezni őket. A TAF kérés kódját hasonló módon írjuk.

Betöltjük a kódot a felhőbe

Hogy ne pazaroljuk az időt, vegyük az időjárási bot sablonját a tárolónkból cloud-telegram-bot. Ott előre elkészített requirements.txt és setup.py helyes könyvtár struktúrával rendelkezik.

Mivel a kódban hivatkozni fogunk a modulra pytaf, ezért a verzióját azonnal hozzá kell adni requirements.txt

pytaf~=1.2.1

  • Átmegyünk a szerkesztéshez bot/tele_bot.py. Eltávolítjuk az összes felesleges elemet, és hozzáírjuk 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 = "Helló. Ez egy bot az időjárási előrejelzés megszerzésére " 
          "a NOAA szerveréről. A bot beállítva a Vnukovo repülőtérre (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):
    # Információ beszerzése a szervertől.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Formázott válasz küldése.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # Információ beszerzése a szervertől.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Formázott válasz küldése.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Parancs irányító.
    """
    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 környezet belépési pontja.
    """
    print(f'Fogadva: "{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 a "{message.text}"-en')
        route_command(message.text.lower(), message)

  • Csomagoljuk be az egész könyvtárt ZIP-archívumba, majd lépünk a vezérlőpanelre az elkészült funkcióhoz.
  • Kattintunk Szerkeszteni és feltöltjük az archívumot a kóddal.

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva

  • Kitöltjük a fájl relatív útvonalát tele_bot (kiterjesztést .py nem szükséges megadni) és az elérési pont funkciót (az alábbi példában ez) main).
  • A részben Környezeti változók írjuk a változót TOKEN és hozzárendeljük a kívánt telegram-bot tokenjét.
  • Kattintunk Mentés és telepítés, majd lépünk a Triggered.
  • Kapcsoljuk be a HTTP-kérdést, hogy a kérés nyilvános legyen.

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva
Most már van egy URL a nyilvános funkcióhíváshoz. Csak annyit kell tennünk, hogy beállítjuk a webhook-ot. Keresd a botunkat @SelectelServerless_bot a Telegramon, és regisztráld a botodat a következő paranccsal:

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

Eredmény

Ha minden helyesen lett beállítva, a botod azonnal elkezd működni, és az aktuális légiforgalmi időjárási összefoglalót közvetlenül a messengerben mutatja.

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva
Természetesen a kódot tovább lehet fejleszteni, de a jelenlegi állapotában is elegendő ahhoz, hogy a legpontosabb időjárási adatokat és előrejelzéseket kapd egy megbízható forrásból.

A kód teljes verzióját a tároló a GitHubon.

A legpontosabb időjárás-előrejelzés: bot a Telegram számára felhőfunkciókra alapozva

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster