Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.
Der findes mange tjenester, der leverer vejrinformation, men hvilken skal man stole pÄ? Da jeg begyndte at cykle ofte, Þnskede jeg at have den mest prÊcise information om vejrforholdene, der hvor jeg cykler.

Den fĂžrste tanke var at samle en lille DIY vejrmĂ„ler med sensorer og hente data fra den. Men jeg ville ikke 'opfinde cyklen' pĂ„ ny og valgte som kilde til pĂ„lidelige data den vejrinformation, der anvendes i civil luftfart, nemlig METAR (METeorological Aerodrome Report) og TAF (TAF — Terminal Aerodrome Forecast). I luftfart afhĂŠnger livet af mange mennesker af vejret, sĂ„ prognoserne er sĂ„ prĂŠcise som muligt.

Denne information transmitteres dĂžgnet rundt med stemme pĂ„ hver moderne lufthavn i form af ATIS (Automatic Terminal Information Service) og VOLMET (fra fransk, vol — flyvning og mĂ©tĂ©o — vejr). Den fĂžrste giver oplysninger om det aktuelle vejr pĂ„ lufthavnen, mens den anden giver en prognose for de nĂŠste 24-30 timer, ikke kun for lufthavnen, hvor transmissionen finder sted, men ogsĂ„ for andre.

Eksempel pÄ ATIS fra Vnukovo lufthavnen:

Eksempel pÄ VOLMET fra Vnukovo lufthavnen

At skulle slÊbe en radioscanner eller transceiver pÄ de relevante frekvenser hver gang er besvÊrligt, og jeg Þnskede at skabe en bot i Telegram, som ved et tryk pÄ en knap giver en lignende prognose. At dedikere en server til dette er i det mindste ikke hensigtsmÊssigt, ligesom at sende forespÞrgsler til en hjemme-Raspberry.

Derfor besluttede jeg at bruge tjenesten Cloud Functions fra Selectel. Antallet af forespÞrgsler vil vÊre uhyre lille, sÄ en sÄdan tjeneste vil faktisk vÊre gratis (ifÞlge mine beregninger vil det koste 22 rubler for 100.000 forespÞrgsler).

Forberedelse af backend

Oprettelse af funktion

I kontrolpanelet my.selectel.ru Äbner vi visningen Cloud Platform og opretter et nyt projekt:

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.
NÄr projektet er oprettet, gÄr vi til sektionen Functions:

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.
Vi trykker pÄ knappen Opret funktion og giver den det Þnskede navn:

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.
Efter at have trykket pÄ Opret funktion vil vi fÄ vist den oprettede funktion:

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.
FĂžr vi gĂ„r i gang med at skrive koden i Python, skal vi oprette en bot i Telegram. Jeg vil ikke gĂ„ ind i detaljerne om, hvordan det gĂžres – der er en detaljeret vejledning i vores vidensbase. Det vigtigste for os er tokenet for den oprettede bot.

Vi forbereder koden

Som kilde til pÄlidelige data har jeg valgt den Nationale Oceaniske og AtmosfÊriske Administration i USA (National Oceanic and Atmospheric Administration, NOAA). Dette videnskabelige agentur opdaterer lÞbende data pÄ sin server i TXT-format.

Link til at hente METAR-data (vÊr opmÊrksom pÄ store/smÄ bogstaver):

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

I mit tilfÊlde er den nÊrmeste lufthavn Vnukovo, dens ICAO-kode er UUWW. At gÄ til den genererede URL vil returnere fÞlgende:

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

Den fÞrste linje angiver tidspunktet for prognosens aktualitet i Greenwich. Den anden linje er en opdatering om det aktuelle vejr. Piloter i civil luftfart vil uden problemer forstÄ, hvad denne linje betyder, men vi har brug for en forklaring:

  • [UUWW] — Vnukovo, byen Moskva (Rusland — RU);
  • [101130Z] — 10. dag i mĂ„neden, kl. 11:30 Greenwich-tid;
  • [31004MPS] — vindretning 310 grader, hastighed 4 m/s;
  • [9999] — horisontal sigtbarhed 10 km eller mere;
  • [SCT048] — spredte/fordelte skyer i 4800 fod (~1584 m);
  • [24/13] — temperatur 24°C, dugpunkt 13°C;
  • [Q1014] — tryk (QNH) 1014 hPa (750 mmHg);
  • [R01/000070] — friktion pĂ„ bane 01 — 0,70;
  • [NOSIG] — uden vĂŠsentlige ĂŠndringer.

Lad os begynde at skrive programmeringskoden. FĂžrst skal vi importere funktionerne request og pytaf:

from urllib import request
import pytaf

Angiv variablerne og forbered dekoderfunktionen:

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

Lad os gÄ videre til TAF (store bogstaver er ogsÄ vigtige).

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

Som i det forrige eksempel ser vi pÄ prognosen i Vnukovo-lufthavnen:

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 vil isér légge mérke til linjerne TEMPO og BECMG. TEMPO betyder, at det aktuelle vejr i den angivne periode vil éndre sig periodisk. BECMG — vejret vil gradvist éndre sig i den angivne tidsperiode.

Det vil sige, at linjen:

TEMPO 1012/1020 -TSRA BKN020CB

vil betyde:

  • [1012/1020] — i perioden fra 12 til 20 timer (i Greenwich-tid);
  • [-TSRA] — tordenvejr (TS = thunderstorm) med nedbĂžr (RA = rain) af lav intensitet (minus-tegn);
  • [BKN020CB] — betydelig (BKN = broken), kumulonimbus (CB = cumulonimbus) skydĂŠkke i 2000 fod (610 meter) over havets overflade.

Der er mange termer, der betyder vejrfÊnomener, og det er svÊrt at huske dem. Koden til at anmode om TAF skrives pÄ samme mÄde.

Vi uploader koden til skyen

For at spare tid, lad os tage en skabelon til telegram-bot fra vores repository cloud-telegram-bot. Der findes en forberedt requirements.txt og setup.py med korrekt struktur af mapper.

Da vi vil referere til modulet i koden, skal vi straks tilfĂžje dets version i pytafpytaf~=1.2.1 requirements.txt

Vi gÄr videre til redigering af

  • bot/tele_bot.py . Vi fjerner alt unĂždvendigt og tilfĂžjer vores kode.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. dette er en bot til at modtage luftfartsvejrprognoser " "fra NOAA-servere. Bot'en er indstillet til lufthavnen 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): # Hent information fra serveren. code = request.urlopen(URL_METAR).read().decode('utf-8') # Send formateret svar. bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard) def get_taf(message): # Hent information fra serveren. code = request.urlopen(URL_TAF).read().decode('utf-8') # Send formateret svar. bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard) def route_command(command, message): """ Kommando-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): """ Indgangspunkt for serverlĂžs miljĂž. """ print(f'Modtaget: "{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 pakker hele mappen i en ZIP-arkiv og gÄr til kontrolpanelet for den oprettede funktion.

  • Rediger
  • Klik pĂ„ og uploader arkivet med koden. Udfyld den relative sti til filen

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.

  • tele_bot (filtypenavn .py kan udelades) og endpoint-funktionen (i det givne eksempel er dette MiljĂžvariabler main).
  • I sektionen skriver vi variablen TOKEN og tildeler den tokenet til den relevante telegram-bot. Gem og implementer
  • Klik pĂ„ , hvorefter vi gĂ„r til afsnittetUdlĂžsere SĂŠtter vi kontaktknappen.
  • HTTP-anmodning , for at gĂžre anmodningen offentlig., for at gĂžre anmodningen offentlig.

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.
Vi har fÄet en URL til offentligt kald af funktionen. Det er kun tilbage at konfigurere webhooken. Find vores bot @SelectelServerless_bot pÄ Telegram og registrer din bot med kommandoen:

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

Resultat

Hvis alt er gjort korrekt, vil din bot straks begynde at arbejde og vise den aktuelle oversigt over luftfartsvejr direkte i messenger.

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.
SelvfÞlgelig kan koden forbedres, men selv i dens nuvÊrende tilstand er den tilstrÊkkelig til at fÄ den mest nÞjagtige vejrudsigt og prognose fra en pÄlidelig kilde.

Du finder den fulde version af koden i vores repository pÄ GitHub.

Den mest nÞjagtige vejrmelding: bot til Telegram baseret pÄ cloud-funktioner.

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster