De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties
Er zijn veel diensten die weersinformatie bieden, maar welke moet je vertrouwen? Toen ik veel ging fietsen, wilde ik de meest nauwkeurige informatie hebben over de weersomstandigheden op de plek waar ik fiets.

Mijn eerste gedachte was om een ​​klein doe-het-zelf-weerstation met sensoren te bouwen en daar gegevens van te ontvangen. Maar ik heb niet “het wiel opnieuw uitgevonden” en gekozen voor weersinformatie die in de burgerluchtvaart wordt gebruikt als bron van geverifieerde gegevens, namelijk METAR (METeorologisch luchtvaartterreinrapport) en TAF (TAF - Terminal Aerodrome-voorspelling). In de luchtvaart zijn de levens van honderden mensen afhankelijk van het weer, dus de voorspellingen zijn zo nauwkeurig mogelijk.

Deze informatie wordt XNUMX/XNUMX via stem uitgezonden op elk modern vliegveld in de vorm ATIS (Automatische terminalinformatiedienst) en VOLMET (uit het Frans. vol - vlucht en Weer - weer). De eerste geeft informatie over het actuele weer op het vliegveld, en de tweede geeft een voorspelling voor de komende 24-30 uur, niet alleen op het uitzendvliegveld, maar ook op andere.

Voorbeeld van ATIS-operatie op de luchthaven Vnukovo:

Een voorbeeld van hoe VOLMET werkt op Vnukovo Airport

Het is lastig om elke keer een radioscanner of zendontvanger bij je te hebben voor het overeenkomstige bereik, en ik wilde in Telegram een ​​bot maken waarmee je met één klik op de knop dezelfde voorspelling kunt krijgen. Het is op zijn minst onpraktisch om hiervoor een aparte server toe te wijzen en verzoeken naar je Raspberry thuis te sturen.

Daarom besloot ik de service als backend te gebruiken Selecteer Cloud-functies. Het aantal verzoeken zal verwaarloosbaar zijn, dus een dergelijke dienst zal vrijwel gratis zijn (volgens mijn berekeningen zal dit 22 roebel zijn voor 100 verzoeken).

Voorbereiding van de backend

Een functie creëren

In het Configuratiescherm mijn.selectel.ru open het uitzicht Cloud-platform en maak een nieuw project aan:

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties
Nadat het project is gemaakt, gaat u naar de sectie functies:

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties
Druk op de knop Maak een functie en geef het de gewenste naam:

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties
Na het drukken Maak een functie we zullen een weergave hebben van de gecreëerde functie:

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties
Voordat je code gaat maken in Python, moet je een bot maken in Telegram. Ik zal niet beschrijven hoe dit wordt gedaan - er zijn gedetailleerde instructies in onze kennisbank. Het belangrijkste voor ons is het token van de gemaakte bot.

Het voorbereiden van de code

Ik heb de National Oceanic and Atmospheric Administration (NOAA) gekozen als bron van betrouwbare gegevens. Dit wetenschappelijke bureau werkt gegevens in realtime bij op zijn server in TXT-formaat.

Link om METAR-gegevens te verkrijgen (let op het geval):

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

In mijn geval is de dichtstbijzijnde luchthaven Vnukovo, de ICAO-code is UUWW. Als u naar de gegenereerde URL gaat, wordt het volgende weergegeven:

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

De eerste regel is de huidige tijd van de voorspelling in Greenwich Mean Time. De tweede regel is een samenvatting van het werkelijke weer. Piloten in de burgerluchtvaart zullen er geen probleem mee hebben om te begrijpen wat deze regel betekent, maar we hebben een uitleg nodig:

  • [UUWW] — Vnukovo, Moskou (Rusland — RU);
  • [101130Z] — 10e dag van de maand, 11:30 uur GMT;
  • [31004MPS] — windrichting 310 graden, snelheid 4 m/s;
  • [9999] — horizontaal zicht 10 km of meer;
  • [SCT048] — verspreide/verstrooide wolken op 4800 voet (~1584 m);
  • [24 / 13] — temperatuur 24°C, dauwpunt 13°C;
  • [Q1014] — druk (QNH) 1014 hectopascal (750 mm Hg);
  • [R01/000070] — wrijvingscoëfficiënt op baan 01 — 0,70;
  • [NOSIG] - zonder noemenswaardige veranderingen.

Laten we beginnen met het schrijven van programmacode. Eerst moet u functies importeren te vragen и pytaf:

from urllib import request
import pytaf

Specificeer de variabelen en bereid de decoderingsfunctie voor:

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

Laten we verder gaan met TAF (zaak is ook belangrijk).

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

Laten we, net als in het vorige voorbeeld, kijken naar de voorspelling op de luchthaven van 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

Laten we vooral letten op de lijnen TEMPO и BECMG. TEMPO betekent dat het werkelijke weer gedurende de opgegeven periode periodiek zal veranderen. BECMG - het weer zal binnen een bepaalde tijd geleidelijk veranderen.

Dat wil zeggen, de regel:

TEMPO 1012/1020 -TSRA BKN020CB

Zal bedoelen:

  • [1012 / 1020] — tussen 12 en 20 uur (Greenwich Mean Time);
  • [-TSRA] — onweersbui (TS = onweer) met regen (RA = regen) van lage intensiteit (minteken);
  • [BKN020CB] - significante (BKN = gebroken), cumulonimbus (CB = cumulonimbus) wolken op 2000 voet (610 meter) boven zeeniveau.

Er zijn nogal wat termen voor weersverschijnselen, en het onthouden ervan is moeilijk. De code voor het TAF-verzoek is op een vergelijkbare manier geschreven.

Code uploaden naar de cloud

Om geen tijd te verspillen, nemen we een telegram-botsjabloon uit onze repository cloud-telegram-bot. Er is een pre-voorbereid requirements.txt и setup.py met de juiste mapstructuur.

Omdat we in de code toegang krijgen tot de module pytaf, dan moet de versie ervan onmiddellijk worden toegevoegd requirements.txt

pytaf~=1.2.1

  • Laten we verder gaan met bewerken bot/tele_bot.py. We verwijderen alle onnodige dingen en voegen onze code toe.

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)

  • We verpakken de hele map in een ZIP-archief en gaan naar het configuratiescherm naar de gemaakte functie.
  • Klik Редактировать en download het archief met de code.

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties

  • Vul het relatieve pad in het bestand in tele_bot (verlenging py mag niet worden gespecificeerd) en een eindpuntfunctie (in het gegeven voorbeeld is dit hoofd-).
  • In paragraaf Omgevingsvariabelen schrijf een variabele TOKEN en wijs het het token van de gewenste telegrambot toe.
  • Klik Opslaan en uitbreiden, waarna we naar de sectie gaan Triggers.
  • Wij hebben de schakelaar gezet HTTP-verzoekom het verzoek openbaar te maken.

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties
We hebben nu een URL voor het publiekelijk aanroepen van de functie. Het enige dat overblijft is webhook configureren. Vind onze bot @SelectelServerless_bot in Telegram en registreer uw bot met het commando:

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

Resultaat

Als alles correct is gedaan, zal uw bot onmiddellijk aan de slag gaan en het laatste luchtvaartweerrapport rechtstreeks in de messenger weergeven.

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties
Natuurlijk kan de code worden verbeterd, maar zelfs in de huidige staat is het voldoende om het meest nauwkeurige weer en de voorspelling van een vertrouwde bron te achterhalen.

De volledige versie van de code vindt u in onze opslagplaatsen op GitHub.

De meest nauwkeurige weersvoorspelling: een bot voor Telegram op cloudfuncties

Bron: www.habr.com

Voeg een reactie