Den mest exakta väderprognosen: bot för Telegram på molnfunktioner

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner
Det finns många tjänster som ger väderinformation, men vilken ska du lita på? När jag började cykla ofta ville jag ha den mest korrekta informationen om väderförhållandena på den plats där jag cyklar.

Min första tanke var att bygga en liten DIY väderstation med sensorer och ta emot data från den. Men jag "uppfann inte hjulet på nytt" och valde väderinformation som används inom civil luftfart som en källa för verifierad data, nämligen METARs (METeorological Aerodrome Report) och TAF (TAF - Terminal Aerodrome Forecast). Inom flyget är livet för hundratals människor beroende av vädret, så prognoserna är så exakta som möjligt.

Denna information sänds XNUMX/XNUMX med röst på varje modernt flygfält i formen ATIS (Automatisk terminalinformationstjänst) och VOLMET (från franska. vol - flyg och météo - väder). Den första ger information om det faktiska vädret på flygfältet, och den andra ger en prognos för de kommande 24-30 timmarna, inte bara på sändningsflygfältet, utan även på andra.

Exempel på ATIS-drift på Vnukovo flygplats:

Ett exempel på hur VOLMET fungerar på Vnukovo flygplats

Det är obekvämt att bära med sig en radioskanner eller transceiver varje gång för motsvarande räckvidd, och jag ville skapa en bot i Telegram som med ett knapptryck låter dig få samma prognos. Det är åtminstone opraktiskt att tilldela en separat server för detta, samt att skicka förfrågningar till ditt hem Raspberry.

Därför bestämde jag mig för att använda tjänsten som en backend Välj molnfunktioner. Antalet förfrågningar kommer att vara försumbart, så en sådan tjänst kommer att vara praktiskt taget gratis (enligt mina beräkningar kommer det att vara 22 rubel för 100 000 förfrågningar).

Backend förberedelse

Skapa en funktion

I Kontrollpanelen my.selectel.ru öppna vyn Molnplattform och skapa ett nytt projekt:

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner
Efter att projektet har skapats, gå till avsnittet funktioner:

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner
Vi trycker på knappen Skapa en funktion och ge det önskat namn:

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner
Efter tryckning Skapa en funktion vi kommer att ha en representation av den skapade funktionen:

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner
Innan du börjar skapa kod i Python måste du skapa en bot i Telegram. Jag kommer inte att beskriva hur detta görs - det finns detaljerade instruktioner i vår kunskapsbas. Det viktigaste för oss är token för den skapade boten.

Förbereder koden

Jag valde National Oceanic and Atmospheric Administration (NOAA) som en källa till tillförlitlig data. Denna vetenskapliga byrå uppdaterar data i realtid på sin server i TXT-format.

Länk för att få METAR-data (observera fallet):

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

I mitt fall är den närmaste flygplatsen Vnukovo, dess ICAO-kod är UUWW. Om du går till den genererade webbadressen får du följande:

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

Den första raden är den aktuella tiden för prognosen i Greenwich Mean Time. Den andra raden är en sammanfattning av det faktiska vädret. Civilflygpiloter kommer inte att ha några problem att förstå vad denna linje betyder, men vi behöver en förklaring:

  • [UUWW] — Vnukovo, Moskva (Ryssland – RU);
  • [101130Z] — 10:e dagen i månaden, 11:30 GMT;
  • [31004MPS] — vindriktning 310 grader, hastighet 4 m/s;
  • [9999] — horisontell sikt 10 km eller mer.
  • [SCT048] — Spridda/spridda moln på 4800 fot (~1584 m);
  • [24 / 13] — temperatur 24°C, daggpunkt 13°C;
  • [Q1014] — tryck (QNH) 1014 hektopascal (750 mm Hg);
  • [R01/000070] — vidhäftningskoefficient på bana 01 — 0,70;
  • [NOSIG] - utan betydande förändringar.

Låt oss börja skriva programkod. Först måste du importera funktioner begära и pytaf:

from urllib import request
import pytaf

Specificera variablerna och förbered avkodningsfunktionen:

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

Låt oss gå vidare till TAF (fallet är också viktigt).

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

Som i föregående exempel, låt oss titta på prognosen på Vnukovo flygplats:

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

Låt oss särskilt uppmärksamma linjerna TEMPO и BECMG. TEMPO innebär att det faktiska vädret under den angivna perioden kommer att ändras med jämna mellanrum. BECMG - vädret kommer gradvis att förändras inom en viss tidsperiod.

Det vill säga raden:

TEMPO 1012/1020 -TSRA BKN020CB

Kommer att betyda:

  • [1012 / 1020] — mellan 12 och 20 timmar (Greenwich Mean Time).
  • [-TSRA] — åskväder (TS = åskväder) med regn (RA = regn) av låg intensitet (minustecken).
  • [BKN020CB] - betydande (BKN = bruten), cumulonimbus (CB = cumulonimbus) moln på 2000 fot (610 meter) över havet.

Det finns ganska många termer för väderfenomen, och det är svårt att komma ihåg dem. Koden för TAF-begäran är skriven på liknande sätt.

Laddar upp kod till molnet

För att inte slösa tid, låt oss ta en telegrambotmall från vårt förråd moln-telegram-bot. Det finns en förberedd requirements.txt и setup.py med rätt katalogstruktur.

Sedan i koden kommer vi att komma åt modulen pytaf, bör dess version omedelbart läggas till requirements.txt

pytaf~=1.2.1

  • Låt oss gå vidare till redigering bot/tele_bot.py. Vi tar bort alla onödiga saker och lägger till vår kod.

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 packar hela katalogen i ett ZIP-arkiv och går till kontrollpanelen till den skapade funktionen.
  • Klick Redigera och ladda ner arkivet med koden.

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner

  • Fyll i den relativa sökvägen i filen tele_bot (förlängning .py kanske inte anges) och en slutpunktsfunktion (i exemplet är detta huvudsakliga).
  • I avsnitt Miljövariabler skriv en variabel TECKEN och tilldela den token för den önskade telegramboten.
  • Klick Spara och expandera, varefter vi går till avsnittet triggers.
  • Vi sätter strömbrytaren HTTP-förfråganför att göra begäran offentlig.

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner
Vi har nu en URL för att offentligt anropa funktionen. Allt som är kvar är konfigurera webhook. Hitta vår bot @SelectelServerless_bot i Telegram och registrera din bot med kommandot:

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

Resultat

Om allt görs korrekt kommer din bot omedelbart att börja arbeta och visa den senaste flygväderrapporten direkt i messengern.

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner
Naturligtvis kan koden förbättras, men även i sitt nuvarande tillstånd räcker det för att ta reda på det mest exakta vädret och prognosen från en pålitlig källa.

Du hittar den fullständiga versionen av koden i vår repositories på GitHub.

Den mest exakta väderprognosen: bot för Telegram på molnfunktioner

Källa: will.com

Lägg en kommentar