Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner
Det finns mÄnga tjÀnster som tillhandahÄller vÀderinformation, men vilken av dem ska man lita pÄ? NÀr jag började cykla ofta ville jag ha den mest exakta informationen om vÀderförhÄllandena dÀr jag cyklar.

Den första tanken var att bygga en liten DIY vĂ€derstation med sensorer och hĂ€mta data frĂ„n den. Men jag ville inte "uppfinna hjulet" och valde som kĂ€lla för verifierad data vĂ€derinformation som anvĂ€nds inom civil luftfart, nĂ€mligen METAR (METeorological Aerodrome Report) och TAF (TAF — Terminal Aerodrome Forecast). Inom luftfarten beror hundratals mĂ€nniskors liv pĂ„ vĂ€dret, sĂ„ prognoserna Ă€r sĂ„ exakta som möjligt.

Den hĂ€r informationen sĂ€nds dygnet runt i tal pĂ„ varje modern flygplats i form av ATIS (Automatic Terminal Information Service) och VOLMET (frĂ„n franskans vol — flyg och mĂ©tĂ©o — vĂ€der). Den första ger information om den aktuella vĂ€dret pĂ„ flygplatsen, medan den andra ger prognoser för de nĂ€rmaste 24-30 timmarna, inte bara för flygplatsen dĂ€r sĂ€ndningen görs, utan ocksĂ„ för andra.

Exempel pÄ ATIS frÄn Vnukovo-flygplatsen:

Exempel pÄ VOLMET frÄn Vnukovo-flygplatsen

Att konstant bÀra med sig en radioscanner eller transceiver pÄ rÀtt frekvens Àr besvÀrligt, sÄ jag ville skapa en bot i Telegram som med ett knapptryck ger samma prognos. Att avsÀtta en separat server för detta Àr minst sagt oklokt, liksom att skicka begÀrningar till en hemmaanordnad Raspberry.

DÀrför beslutade jag att anvÀnda tjÀnsten Cloud Functions Selectel. Antalet förfrÄgningar kommer att vara försumbar, sÄ en sÄdan tjÀnst blir nÀstan gratis (enligt mina berÀkningar kommer det att kosta 22 rubel för 100 000 förfrÄgningar).

Förberedelse av backend

Skapa en funktion

I kontrollpanelen my.selectel.ru öppnar vi vyn Molnplattform och skapar ett nytt projekt:

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner
NÀr projektet Àr skapat gÄr vi till avsnittet Funktioner:

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner
Vi trycker pÄ knappen Skapa funktion och ger den ett lÀmpligt namn:

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner
Efter att ha tryckt pÄ Skapa funktion fÄr vi upp vyn för den skapade funktionen:

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner
Innan vi börjar skapa koden i Python, behöver vi skapa en bot i Telegram. Jag kommer inte att beskriva hur det görs – det finns en detaljerad instruktion i vĂ„r kunskapsbas. Det viktigaste för oss Ă€r token för den skapade boten.

Vi förbereder koden

Som kÀlla för pÄlitliga data har jag valt den amerikanska national oceaniska och atmosfÀriska förvaltningen (NOAA). Detta vetenskapliga byrÄ uppdaterar i realtid data pÄ sin server i TXT-format.

LÀnk för att hÀmta METAR-data (observera storleken):

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

I mitt fall Àr den nÀrmaste flygplatsen Vnukovo, dess ICAO-kod Àr UUWW. Att gÄ till den genererade URL:en kommer att ge följande:

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

Den första raden Àr tiden för prognosens aktualitet enligt Greenwich. Den andra raden Àr en sammanfattning av det faktiska vÀdret. Civilflygplanspiloter kommer utan problem att förstÄ vad denna rad innebÀr, men vi behöver en förklaring:

  • [UUWW] — Vnukovo, stad Moskva (Ryssland — RU);
  • [101130Z] — den 10:e dagen i mĂ„naden, klockan 11:30 enligt Greenwich;
  • [31004MPS] — vindriktningen Ă€r 310 grader, hastigheten Ă€r 4 m/s;
  • [9999] — horisontell sikt 10 km eller mer;
  • [SCT048] — spridda moln pĂ„ en höjd av 4800 fot (~1584 m);
  • [24/13] — temperatur 24°C, daggpunkt 13°C;
  • [Q1014] — tryck (QNH) 1014 hektopascal (750 mmHg);
  • [R01/000070] — greppkoefficient pĂ„ bana 01 — 0,70;
  • [NOSIG] — utan betydande förĂ€ndringar.

Vi gÄr till kodningen. Först mÄste vi importera funktionerna request och pytaf:

from urllib import request
import pytaf

Ange variabler 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Ä till TAF (registreringen Àr ocksÄ viktig).

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

Som i det föregÄende exemplet, lÄt oss titta pÄ prognosen för flygplatsen Vnukovo:

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

Vi ska speciellt notera raderna TEMPO och BECMG. TEMPO betyder att det faktiska vĂ€dret kommer att förĂ€ndras periodiskt under den angivna tidsperioden. BECMG — vĂ€dret kommer gradvis att förĂ€ndras under den angivna tidsperioden.

Det vill sÀga raden:

TEMPO 1012/1020 -TSRA BKN020CB

Kommer att innebÀra:

  • [1012/1020] — under tidsperioden frĂ„n 12 till 20 timmar (enligt Greenwich);
  • [-TSRA] — Ă„ska (TS = thunderstorm) med regn (RA = rain) av liten intensitet (minus-tecken);
  • [BKN020CB] — betydande (BKN = bruten), cumulusregn (CB = cumulonimbus) molntĂ€cke pĂ„ 2000 fot (610 meter) över havet.

Det finns mÄnga termer som beskriver vÀderfenomen, och det kan vara svÄrt att komma ihÄg dem. TAF-förfrÄgningskoden skrivs pÄ ett liknande sÀtt.

Vi laddar upp koden till molnet

För att inte slösa tid tar vi en mall för en Telegram-bot frÄn vÄrt repository cloud-telegram-bot. DÀr finns en fÀrdigstÀlld requirements.txt och setup.py med en korrekt katalogstruktur.

Eftersom vi kommer att referera till modulen i koden pytaf, bör vi genast lÀgga till dess version i requirements.txt

pytaf~=1.2.1

  • LĂ„t oss gĂ„ vidare till redigering av bot/tele_bot.py. Vi tar bort allt onödigt och skriver till vĂ„rt 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 = "Hej. Detta Àr en bot för att fÄ flygvÀderprognoser " 
          "frÄn NOAA:s servrar. Botten Àr instÀlld pÄ flygplatsen Vnukovo (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):
    # HÀmta information frÄn servern.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Skicka formaterat svar.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # HÀmta information frÄn servern.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Skicka formaterat svar.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Kommandorouter.
    """
    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):
    """
    IngÄngspunkt för serverlös miljö.
    """
    print(f'Mottagen: "{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 pÄ "{message.text}"')
        route_command(message.text.lower(), message)

  • Vi packar hela katalogen i en ZIP-veck och gĂ„r till kontrollpanelen för den skapade funktionen.
  • Klicka pĂ„ Redigera och laddar upp arkivet med koden.

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner

  • Fyll i den relativa sökvĂ€gen till filen tele_bot (tillĂ€gget .py kan uteslutas) och endpoint-funktion (i det angivna exemplet Ă€r detta main).
  • I avsnittet Miljövariabler vi skriver variabeln TOKEN och tilldelar den token för den önskade Telegram-boten.
  • Klicka pĂ„ Spara och distribuera, varefter vi gĂ„r till avsnittet Triggers.
  • StĂ€ll omkopplaren HTTP-förfrĂ„gan, för att göra förfrĂ„gan offentlig.

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner
Vi har fÄtt en URL för offentlig anrop av funktionen. Kvar Àr bara att stÀlla in webhooken. 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 har gjorts korrekt kommer din bot att börja fungera omedelbart och visa aktuell sammanfattning av flygvÀdret direkt i meddelandetjÀnsten.

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner
SjÀlvklart kan koden vidareutvecklas, men Àven i sitt nuvarande tillstÄnd Àr den tillrÀcklig för att ta reda pÄ det mest exakta vÀdret och prognosen frÄn en pÄlitlig kÀlla.

Den fullstÀndiga versionen av koden hittar du i vÄr förrÄdet pÄ GitHub.

Den mest exakta vÀderprognosen: en bot för Telegram pÄ molnfunktioner

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster