Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies
Daar is baie dienste wat weerinligting verskaf, maar watter een moet jy vertrou? Toe ek gereeld begin fietsry het, wou ek die mees akkurate inligting hê oor die weerstoestande in die plek waar ek ry.

My eerste gedagte was om 'n klein selfdoenweerstasie met sensors te bou en data daarvan te ontvang. Maar ek het nie "die wiel herontdek" en weerinligting gekies wat in burgerlugvaart gebruik word as 'n bron van geverifieerde data, nl. METAAR (METeorologiese vliegveldverslag) en TAF (TAF - Terminal Aerodrome Forecast). In lugvaart is die lewens van honderde mense afhanklik van die weer, so voorspellings is so akkuraat as moontlik.

Hierdie inligting word 24/7 per stem by elke moderne vliegveld in die vorm uitgesaai ATIS (Outomatiese terminale inligtingsdiens) en VOLMET (uit Frans. vol - vlug en meteo - weer). Die eerste verskaf inligting oor die werklike weer by die vliegveld, en die tweede verskaf 'n voorspelling vir die volgende 24-30 uur, nie net by die uitsaaivliegveld nie, maar ook by ander.

Voorbeeld van ATIS-operasie by Vnukovo-lughawe:

'n Voorbeeld van hoe VOLMET by die Vnukovo-lughawe werk

Dit is ongerieflik om elke keer 'n radioskandeerder of -ontvanger vir die ooreenstemmende reeks by jou te dra, en ek wou 'n bot in Telegram skep wat jou met die klik van 'n knoppie toelaat om dieselfde voorspelling te kry. Dit is ten minste onprakties om 'n aparte bediener hiervoor toe te wys, asook om versoeke na jou huis Framboos te stuur.

Daarom het ek besluit om die diens as 'n backend te gebruik Kies wolkkenmerke. Die aantal versoeke sal weglaatbaar wees, so 'n diens sal feitlik gratis wees (volgens my berekeninge sal dit 22 roebels vir 100 000 versoeke wees).

Backend voorbereiding

Die skep van 'n funksie

In die beheerpaneel my.selectel.ru maak die uitsig oop Wolk platform en skep 'n nuwe projek:

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies
Nadat die projek geskep is, gaan na die afdeling Funksies:

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies
Druk die knoppie Skep 'n funksie en gee dit die gewenste naam:

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies
Na druk Skep 'n funksie ons sal 'n voorstelling hê van die geskepde funksie:

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies
Voordat jy begin om kode in Python te skep, sal jy 'n bot in Telegram moet skep. Ek sal nie beskryf hoe dit gedoen word nie - daar is gedetailleerde instruksies in ons kennisbasis. Die belangrikste ding vir ons is die teken van die geskepte bot.

Berei die kode voor

Ek het die Nasionale Oseaniese en Atmosferiese Administrasie (NOAA) as 'n bron van betroubare data gekies. Hierdie wetenskaplike agentskap werk data intyds op sy bediener op in TXT-formaat.

Skakel om METAR-data te kry (let op die geval):

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

In my geval is die naaste lughawe Vnukovo, sy ICAO-kode is UUWW. Gaan na die gegenereerde URL sal die volgende gee:

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

Die eerste reël is die huidige tyd van die voorspelling in Greenwich Mean Time. Die tweede reël is 'n opsomming van die werklike weer. Burgerlugvaartvlieëniers sal geen probleem hê om te verstaan ​​wat hierdie lyn beteken nie, maar ons het 'n verduideliking nodig:

  • [UUWW] — Vnukovo, Moskou (Rusland — RU);
  • [101130Z] — 10de dag van die maand, 11:30 GMT;
  • [31004MPS] — windrigting 310 grade, spoed 4 m/s;
  • [9999] — horisontale sigbaarheid 10 km of meer;
  • [SCT048] — verspreide/verspreide wolke op 4800 voet (~1584m);
  • [24 / 13] — temperatuur 24°C, doupunt 13°C;
  • [V1014] - druk (QNH) 1014 hektopascal (750 mm Hg);
  • [R01/000070] — adhesiekoëffisiënt op baan 01 — 0,70;
  • [NOSIG] - sonder noemenswaardige veranderinge.

Kom ons begin programkode skryf. Eerstens moet jy funksies invoer vra и pytaf:

from urllib import request
import pytaf

Spesifiseer die veranderlikes en berei die dekoderingsfunksie 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()

Kom ons gaan aan na TAF (geval is ook belangrik).

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

Soos in die vorige voorbeeld, kom ons kyk na die voorspelling by die Vnukovo-lughawe:

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

Kom ons let veral op die lyne TEMPO и BECMG. TEMPO beteken dat die werklike weer gedurende die gespesifiseerde tydperk periodiek sal verander. BECMG - die weer sal geleidelik verander binne 'n bepaalde tydperk.

Dit wil sê die lyn:

TEMPO 1012/1020 -TSRA BKN020CB

Sal beteken:

  • [1012 / 1020] — tussen 12 en 20 uur (Greenwich Mean Time);
  • [-TSRA] — donderstorm (TS = donderstorm) met reën (RA = reën) van lae intensiteit (minusteken);
  • [BKN020CB] - beduidende (BKN = gebreek), cumulonimbus (CB = cumulonimbus) wolke op 2000 voet (610 meter) bo seespieël.

Daar is nogal baie terme vir weerverskynsels, en dit is moeilik om dit te onthou. Die kode vir die TAF-versoek word op 'n soortgelyke manier geskryf.

Laai kode op na die wolk

Om nie tyd te mors nie, kom ons neem 'n telegram-botsjabloon uit ons bewaarplek wolk-telegram-bot. Daar is 'n vooraf voorbereide vereistes.txt и setup.py met die korrekte gidsstruktuur.

Sedert in die kode sal ons toegang tot die module pytaf, dan moet die weergawe daarvan onmiddellik bygevoeg word vereistes.txt

pytaf~=1.2.1

  • Kom ons gaan oor na redigering bot/tele_bot.py. Ons verwyder alle onnodige goed en voeg ons kode by.

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)

  • Ons pak die hele gids in 'n zip-argief en gaan na die beheerpaneel na die geskepde funksie.
  • druk Редактировать en laai die argief met die kode af.

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies

  • Vul die relatiewe pad in die lêer in tele_bot (uitbreiding .py mag nie gespesifiseer word nie) en 'n eindpuntfunksie (in die voorbeeld is dit hoof).
  • In artikel Omgewings veranderlikes skryf 'n veranderlike TOKEN en ken dit die teken van die verlangde telegrambot toe.
  • druk Stoor en brei uit, waarna ons na die afdeling gaan snellers.
  • Ons sit die skakelaar HTTP-versoekom die versoek openbaar te maak.

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies
Ons het nou 'n URL om die funksie in die openbaar te roep. Al wat oorbly is konfigureer webhook. Vind ons bot @SelectelServerless_bot in Telegram en registreer jou bot met die opdrag:

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

Gevolg

As alles reg gedoen word, sal jou bot dadelik begin werk en die jongste lugvaartweerverslag direk in die boodskapper vertoon.

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies
Natuurlik kan die kode verbeter word, maar selfs in sy huidige toestand is dit genoeg om die mees akkurate weer en voorspelling van 'n betroubare bron uit te vind.

Jy sal die volledige weergawe van die kode in ons vind bewaarplekke op GitHub.

Die mees akkurate weervoorspelling: 'n bot vir Telegram op wolkfunksies

Bron: will.com

Voeg 'n opmerking