Tarkin sääennuste: bot Telegram on pilvitoiminnoille

Tarkin sääennuste: bot Telegram on pilvitoiminnoille
Säätietoja tarjoavat monet palvelut, mutta kumpaan kannattaa luottaa? Kun aloin pyöräilemään usein, halusin saada mahdollisimman tarkat tiedot ajopaikan sääolosuhteista.

Ensimmäinen ajatukseni oli rakentaa pieni tee-se-itse sääasema antureineen ja vastaanottaa siitä dataa. Mutta en "keksinyt pyörää uudelleen" ja valitsin varmennetun tiedon lähteeksi säätiedon, jota käytetään siviili-ilmailussa. METAR (Meteorological Aerodrome Report) ja TAF (TAF - Terminal Aerodrome Forecast). Ilmailussa satojen ihmisten elämä riippuu säästä, joten ennusteet ovat mahdollisimman tarkkoja.

Nämä tiedot lähetetään XNUMX/XNUMX äänellä jokaisella modernilla lentokentällä muodossa ATIS (Automaattinen terminaalitietopalvelu) ja VOLMET (ranskasta. vol - lento ja météo - sää). Ensimmäinen antaa tietoa todellisesta säästä lentokentällä ja toinen antaa ennusteen seuraavalle 24-30 tunnille, ei vain lähetyskentällä, vaan myös muilla.

Esimerkki ATIS:n toiminnasta Vnukovon lentokentällä:

Esimerkki siitä, kuinka VOLMET toimii Vnukovon lentokentällä

Radioskanneria tai lähetin-vastaanotinta on hankala kuljettaa mukana joka kerta vastaavalle alueelle, ja halusin luoda Telegramiin botin, jonka avulla saat saman ennusteen napin painalluksella. Tätä varten on ainakin epäkäytännöllistä varata erillistä palvelinta, samoin kuin pyyntöjen lähettäminen kotiisi Raspberrylle.

Siksi päätin käyttää palvelua taustaohjelmana Valitse pilviominaisuudet. Pyyntöjen määrä on mitätön, joten tällainen palvelu on käytännössä ilmainen (laskelmieni mukaan se on 22 ruplaa 100 000 pyyntöä kohden).

Taustaohjelman valmistelu

Toiminnon luominen

Ohjauspaneelissa my.selectel.ru avaa näkymä Pilvi alusta ja luo uusi projekti:

Tarkin sääennuste: bot Telegram on pilvitoiminnoille
Kun projekti on luotu, siirry osioon Tehtävät:

Tarkin sääennuste: bot Telegram on pilvitoiminnoille
Paina painiketta Luo funktio ja anna sille haluttu nimi:

Tarkin sääennuste: bot Telegram on pilvitoiminnoille
Painamisen jälkeen Luo funktio meillä on esitys luodusta funktiosta:

Tarkin sääennuste: bot Telegram on pilvitoiminnoille
Ennen kuin aloitat koodin luomisen Pythonissa, sinun on luotava botti Telegramissa. En kuvaile, kuinka tämä tehdään - siellä on yksityiskohtaiset ohjeet tietopohjassamme. Meille tärkeintä on luodun botin tunnus.

Koodin valmistelu

Valitsin National Oceanic and Atmospheric Administrationin (NOAA) luotettavan tiedon lähteeksi. Tämä tieteellinen virasto päivittää tiedot reaaliajassa palvelimellaan TXT-muodossa.

Linkki METAR-tietojen saamiseksi (huomaa tapaus):

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

Minun tapauksessani lähin lentokenttä on Vnukovo, sen ICAO-koodi on UUWW. Luotuun URL-osoitteeseen siirtyminen antaa seuraavan:

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

Ensimmäinen rivi on ennusteen nykyinen aika Greenwichin aikaa. Toinen rivi on yhteenveto todellisesta säästä. Siviili-ilmailun lentäjillä ei ole ongelmia ymmärtää, mitä tämä rivi tarkoittaa, mutta tarvitsemme selityksen:

  • [UUWW] — Vnukovo, Moskova (Venäjä — RU);
  • [101130Z] — kuukauden 10. päivä, klo 11 GMT;
  • [31004MPS] — tuulen suunta 310 astetta, nopeus 4 m/s;
  • [9999] — vaakasuuntainen näkyvyys 10 km tai enemmän;
  • [SCT048] — hajapilviä/hajapilviä korkeudessa 4800 jalkaa (~1584m);
  • [24 / 13] — lämpötila 24°C, kastepiste 13°C;
  • [Q1014] — paine (QNH) 1014 hectopascals (750 mm Hg);
  • [R01/000070] — adheesiokerroin kaistalla 01 — 0,70;
  • [NOSIG] - ilman merkittäviä muutoksia.

Aloitetaan ohjelmakoodin kirjoittaminen. Ensin sinun on tuotava funktiot pyyntö и pytaf:

from urllib import request
import pytaf

Määritä muuttujat ja valmistele dekoodaustoiminto:

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

Siirrytään TAF:iin (tapaus on myös tärkeä).

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

Kuten edellisessä esimerkissä, katsotaan Vnukovon lentokentän ennustetta:

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

Kiinnittäkäämme erityisesti huomiota linjoihin TEMPO и BECMG. TEMPO tarkoittaa, että todellinen sää tietyn ajanjakson aikana muuttuu ajoittain. BECMG - sää muuttuu asteittain tietyn ajan kuluessa.

Eli rivi:

TEMPO 1012/1020 -TSRA BKN020CB

Tarkoittaa:

  • [1012 / 1020] — 12–20 tuntia (Greenwichin aika);
  • [-TSRA] — ukkosmyrsky (TS = ukkosmyrsky), jonka voimakkuus on heikko (miinusmerkki);
  • [BKN020CB] - Merkittäviä (BKN = rikki), cumulonimbus (CB = cumulonimbus) pilviä 2000 jalkaa (610 metriä) merenpinnan yläpuolella.

Sääilmiöille on olemassa melko paljon termejä, ja niiden muistaminen on vaikeaa. TAF-pyynnön koodi kirjoitetaan samalla tavalla.

Koodi ladataan pilveen

Jotta ei hukattaisi aikaa, otetaan sähkebottimalli arkistostamme pilvi-sähkö-botti. Siellä on valmiiksi valmistettu requirements.txt и setup.py oikealla hakemistorakenteella.

Koska koodissa pääsemme moduuliin pytaf, sen versio tulee lisätä välittömästi requirements.txt

pytaf~=1.2.1

  • Jatketaan editointiin bot/tele_bot.py. Poistamme kaikki tarpeettomat asiat ja lisäämme koodimme.

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)

  • Pakkaamme koko hakemiston ZIP-arkistoon ja siirrymme ohjauspaneeliin luotuun toimintoon.
  • lehdistö Muokata ja lataa arkisto koodilla.

Tarkin sääennuste: bot Telegram on pilvitoiminnoille

  • Täytä suhteellinen polku tiedostoon tele_bot (laajennus .py ei voida määrittää) ja päätepistefunktio (annetussa esimerkissä tämä on tärkein).
  • Luokasta ympäristömuuttujat kirjoittaa muuttuja TAKEN ja anna sille halutun sähkebotin tunnus.
  • lehdistö Tallenna ja laajenna, jonka jälkeen siirrymme osioon laukaisee.
  • Laitamme kytkimen HTTP-pyyntöpyynnön julkistamiseksi.

Tarkin sääennuste: bot Telegram on pilvitoiminnoille
Meillä on nyt URL-osoite funktion julkista kutsumista varten. Jäljelle jää vain määritä webhook. Etsi bottimme @SelectelServerless_bot Telegramissa ja rekisteröi bottisi komennolla:

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

Tulos

Jos kaikki on tehty oikein, bottisi alkaa toimia välittömästi ja näyttää viimeisimmän lentosäätiedotuksen suoraan messengerissä.

Tarkin sääennuste: bot Telegram on pilvitoiminnoille
Tietysti koodia voi parantaa, mutta nykyisessäkin tilassaan riittää, että saa selville tarkimman sään ja ennusteen luotettavasta lähteestä.

Löydät koodin täyden version sivuiltamme arkistot GitHubissa.

Tarkin sääennuste: bot Telegram on pilvitoiminnoille

Lähde: will.com

Lisää kommentti