Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner
Det er mange tjenester som gir værinformasjon, men hvilken bør du stole på? Da jeg begynte å sykle ofte, ønsket jeg å ha den mest nøyaktige informasjonen om værforholdene på stedet jeg sykler.

Min første tanke var å bygge en liten DIY værstasjon med sensorer og motta data fra den. Men jeg "oppfant ikke hjulet på nytt" og valgte værinformasjon som brukes i sivil luftfart som en kilde til verifiserte data, nemlig METAR (METeorological Aerodrome Report) og TAF (TAF - Terminal Aerodrome Forecast). I luftfart er livet til hundrevis av mennesker avhengig av været, så prognosene er så nøyaktige som mulig.

Denne informasjonen sendes XNUMX/XNUMX med stemmen på alle moderne flyplasser i skjemaet ATIS (Automatisk terminalinformasjonstjeneste) og VOLMET (fra fransk. vol - fly og météo - vær). Den første gir informasjon om det faktiske været på flyplassen, og den andre gir en prognose for de neste 24-30 timene, ikke bare på kringkastingsflyplassen, men også på andre.

Eksempel på ATIS-operasjon på Vnukovo flyplass:

Et eksempel på hvordan VOLMET fungerer på Vnukovo flyplass

Det er upraktisk å ha med deg en radioskanner eller sender/mottaker hver gang for tilsvarende rekkevidde, og jeg ønsket å lage en bot i Telegram som ved å trykke på en knapp lar deg få den samme prognosen. Det er i det minste upraktisk å tildele en egen server for dette, samt sende forespørsler til ditt hjem Raspberry.

Derfor bestemte jeg meg for å bruke tjenesten som en backend Velg skyfunksjoner. Antallet forespørsler vil være ubetydelig, så en slik tjeneste vil være praktisk talt gratis (ifølge mine beregninger vil det være 22 rubler for 100 000 forespørsler).

Forberedelse av backend

Lag en funksjon

I kontrollpanelet my.selectel.ru åpne utsikten Skyplattform og lag et nytt prosjekt:

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner
Etter at prosjektet er opprettet, gå til delen funksjoner:

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner
Trykk på knappen Lag en funksjon og gi den ønsket navn:

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner
Etter å ha trykket Lag en funksjon vi vil ha en representasjon av den opprettede funksjonen:

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner
Før du begynner å lage kode i Python, må du lage en bot i Telegram. Jeg vil ikke beskrive hvordan dette gjøres - det er detaljerte instruksjoner i vår kunnskapsbase. Det viktigste for oss er tokenet til den opprettede boten.

Forbereder koden

Jeg valgte National Oceanic and Atmospheric Administration (NOAA) som en kilde til pålitelige data. Dette vitenskapelige byrået oppdaterer data i sanntid på serveren sin i TXT-format.

Link for å få METAR-data (merk saken):

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

I mitt tilfelle er den nærmeste flyplassen Vnukovo, dens ICAO-kode er UUWW. Å gå til den genererte URL-en vil gi følgende:

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

Den første linjen er gjeldende tidspunkt for varselet i Greenwich Mean Time. Den andre linjen er en oppsummering av det faktiske været. Sivile luftfartspiloter vil ikke ha noe problem med å forstå hva denne linjen betyr, men vi trenger en forklaring:

  • [UUWW] — Vnukovo, Moskva (Russland — RU);
  • [101130Z] — 10. dag i måneden, 11:30 GMT;
  • [31004MPS] — vindretning 310 grader, hastighet 4 m/s;
  • [9999] — horisontal sikt 10 km eller mer;
  • [SCT048] — spredte/spredte skyer på 4800 fot (~1584 m);
  • [24 / 13] — temperatur 24°C, duggpunkt 13°C;
  • [Q1014] — trykk (QNH) 1014 hektopascal (750 mm Hg);
  • [R01/000070] — vedheftskoeffisient på bane 01 — 0,70;
  • [NOSIG] - uten vesentlige endringer.

La oss begynne å skrive programkode. Først må du importere funksjoner anmode и pytaf:

from urllib import request
import pytaf

Spesifiser variablene og klargjør dekodingsfunksjonen:

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

La oss gå videre til TAF (case er også viktig).

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

Som i forrige eksempel, la oss se på prognosen på Vnukovo flyplass:

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

La oss være spesielt oppmerksomme på linjene TEMPO и BECMG. TEMPO betyr at det faktiske været i den angitte perioden vil endre seg med jevne mellomrom. BECMG - været vil gradvis endre seg innen en spesifisert tidsperiode.

Det vil si linjen:

TEMPO 1012/1020 -TSRA BKN020CB

Vil bety:

  • [1012 / 1020] — mellom 12 og 20 timer (Greenwich Mean Time);
  • [-TSRA] — tordenvær (TS = tordenvær) med regn (RA = regn) av lav intensitet (minustegn);
  • [BKN020CB] - betydelige (BKN = ødelagt), cumulonimbus (CB = cumulonimbus) skyer på 2000 fot (610 meter) over havet.

Det er ganske mange begreper for værfenomener, og det er vanskelig å huske dem. Koden for TAF-forespørselen er skrevet på lignende måte.

Laster opp kode til skyen

For ikke å kaste bort tid, la oss ta en telegrambotmal fra vårt depot sky-telegram-bot. Det er en forhåndsforberedt krav.txt и setup.py med riktig katalogstruktur.

Siden i koden vil vi få tilgang til modulen pytaf, bør versjonen umiddelbart legges til krav.txt

pytaf~=1.2.1

  • La oss gå videre til redigering bot/tele_bot.py. Vi fjerner alle unødvendige ting og legger til koden vår.

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)

  • Vi pakker hele katalogen inn i et ZIP-arkiv og går til kontrollpanelet til den opprettede funksjonen.
  • Klikk her Rediger og last ned arkivet med koden.

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner

  • Fyll inn den relative banen i filen tele_bot (Utvidelse .py kan ikke spesifiseres) og en endepunktsfunksjon (i eksemplet gitt er dette main).
  • I avsnitt Miljøvariabler skrive en variabel Token og tilordne den tokenet til ønsket telegrambot.
  • Klikk her Lagre og utvide, hvoretter vi går til seksjonen Triggers.
  • Vi setter bryteren HTTP-forespørselå gjøre forespørselen offentlig.

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner
Vi har nå en URL for offentlig å kalle funksjonen. Alt som er igjen er konfigurere webhook. Finn vår bot @SelectelServerless_bot i Telegram og registrer boten din med kommandoen:

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

Resultat

Hvis alt er gjort riktig, vil boten din umiddelbart begynne å fungere og vise den siste flyværmeldingen direkte i messengeren.

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner
Selvfølgelig kan koden forbedres, men selv i sin nåværende tilstand er det nok å finne ut det mest nøyaktige været og prognosen fra en pålitelig kilde.

Du finner den fullstendige versjonen av koden i vår repositories på GitHub.

Den mest nøyaktige værmeldingen: bot for Telegram på skyfunksjoner

Kilde: www.habr.com

Legg til en kommentar