De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes
D'r binne in protte tsjinsten dy't waarynformaasje leverje, mar hokker moatte jo fertrouwe? Doe't ik gauris begon te fytsen, woe ik de meast krekte ynformaasje hawwe oer de waarsomstannichheden op it plak dêr't ik fyts.

Myn earste gedachte wie om in lyts DIY-waarstasjon te bouwen mei sensoren en dêr gegevens fan te ûntfangen. Mar ik haw net "it tsjil opnij útfûn" en keas waarynformaasje dy't brûkt wurdt yn boargerloftfeart as boarne fan ferifiearre gegevens, nammentlik METAR (METeorological Aerodrome Report) en wurk (TAF - Terminal Aerodrome Forecast). Yn de loftfeart is it libben fan hûnderten minsken ôfhinklik fan it waar, sadat de foarsizzings sa krekt mooglik binne.

Dizze ynformaasje wurdt XNUMX/XNUMX mei stim útstjoerd op elke moderne fleanfjild yn 'e foarm ATIS (Automatyske Terminal Information Service) en VOLMET (út it Frysk. vol - flecht en Wetter - waar). De earste jout ynformaasje oer it eigentlike waar op it fleanfjild, en de twadde jout in prognose foar de kommende 24-30 oeren, net allinich op it útstjoerde fleanfjild, mar ek op oaren.

Foarbyld fan ATIS operaasje op Vnukovo fleanfjild:

In foarbyld fan hoe't VOLMET wurket op Vnukovo Airport

It is ûngemaklik om elke kear in radioscanner of transceiver mei jo te dragen foar it oerienkommende berik, en ik woe in bot meitsje yn Telegram dat jo mei de klik op in knop deselde prognose kinne krije. It is teminsten ûnpraktysk om hjirfoar in aparte tsjinner te tawizen, en ek fersiken nei jo Raspberry thús te stjoeren.

Dêrom besleat ik de tsjinst te brûken as backend Selektearje wolkfunksjes. It oantal oanfragen sil te leech wêze, dus sa'n tsjinst sil frijwol fergees wêze (neffens myn berekkeningen sil it 22 roebel wêze foar 100 oanfragen).

Backend tarieding

Meitsje in funksje

Yn it kontrôlepaniel my.selectel.ru iepenje it útsicht Wolkplatfoarm en meitsje in nij projekt:

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes
Nei it projekt is oanmakke, gean nei de seksje Funksjes:

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes
Push de knop Meitsje in funksje en jou it de winske namme:

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes
Nei it drukken Meitsje in funksje wy sille in foarstelling hawwe fan 'e oanmakke funksje:

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes
Foardat jo begjinne mei it meitsjen fan koade yn Python, moatte jo in bot meitsje yn Telegram. Ik sil net beskriuwe hoe't dit wurdt dien - d'r binne detaillearre ynstruksjes yn ús kennisbasis. It wichtichste ding foar ús is it token fan 'e makke bot.

It tarieden fan de koade

Ik keas de National Oceanic and Atmospheric Administration (NOAA) as in boarne fan betroubere gegevens. Dit wittenskiplike buro fernijt gegevens yn realtime op har server yn TXT-formaat.

Keppeling om METAR-gegevens te krijen (note it gefal):

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

Yn myn gefal is it tichtstby fleanfjild Vnukovo, syn ICAO-koade is UUWW. Gean nei de generearre URL sil it folgjende jaan:

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

De earste rigel is de hjoeddeistige tiid fan 'e prognose yn Greenwich Mean Time. De twadde rigel is in gearfetting fan it werklike waar. Boargerloftfeartpiloten sille gjin probleem hawwe om te begripen wat dizze line betsjut, mar wy hawwe in ferklearring nedich:

  • [UUWW] - Vnukovo, Moskou (Ruslân - RU);
  • [101130Z] - 10e dei fan 'e moanne, 11:30 am GMT;
  • [31004MPS] - wynrjochting 310 graden, snelheid 4 m / s;
  • [9999] - horizontale sichtberens fan 10 km of mear;
  • [SCT048] - fersprate/fersprate wolken op 4800 feet (~1584m);
  • [24 / 13] - temperatuer 24 ° C, dauwpunt 13 ° C;
  • [Q1014] - druk (QNH) 1014 hektopascal (750 mm Hg);
  • [R01/000070] - koëffisjint fan adhesion op baan 01 - 0,70;
  • [NOSIG] - sûnder signifikante feroarings.

Litte wy begjinne mei it skriuwen fan programmakoade. Earst moatte jo funksjes ymportearje fersyk и pytaf:

from urllib import request
import pytaf

Spesifisearje de fariabelen en tariede de dekodearjen funksje:

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

Lit ús gean nei TAF (saak is ek wichtich).

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

Lykas yn it foarige foarbyld, litte wy sjen nei de prognose op Vnukovo fleanfjild:

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

Lit ús foaral omtinken jaan oan de rigels TIID и BECMG. TEMPO betsjut dat it werklike waar yn 'e opjûne perioade periodyk feroaret. BECMG - it waar sil stadichoan feroarje binnen in bepaalde perioade.

Dat is, de line:

TEMPO 1012/1020 -TSRA BKN020CB

Sil betsjutte:

  • [1012 / 1020] - tusken 12 en 20 oeren (Greenwich Mean Time);
  • [-TSRA] - tongerbui (TS = tonger) mei rein (RA = rein) fan lege yntensiteit (minteken);
  • [BKN020CB] - signifikante (BKN = brutsen), cumulonimbus (CB = cumulonimbus) wolken op 2000 feet (610 meter) boppe seenivo.

D'r binne nochal in soad termen foar waarferskynsels, en it is dreech om se te ûnthâlden. De koade foar it TAF-fersyk is op in fergelykbere manier skreaun.

Koade opladen nei de wolk

Om gjin tiid te fergrieme, litte wy in telegram bot-sjabloan nimme fan ús repository wolk-telegram-bot. Der is in pre-tariede easken.txt и setup.py mei de juste mapstruktuer.

Sûnt yn 'e koade sille wy tagong krije ta de module pytaf, dan moat syn ferzje fuortendaliks tafoege wurde easken.txt

pytaf~=1.2.1

  • Litte wy oergean nei it bewurkjen bot/tele_bot.py. Wy ferwiderje alle ûnnedige dingen en foegje ús koade ta.

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)

  • Wy pakke de heule map yn in ZIP-argyf en gean nei it kontrôlepaniel nei de oanmakke funksje.
  • Push Bewurkje en download it argyf mei de koade.

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes

  • Folje it relative paad yn 'e triem tele_bot (útbou .py kin net oantsjutte wurde) en in einpuntfunksje (yn it jûn foarbyld is dit main).
  • section Miljeu Fariabelen skriuw in fariabele TOKEN en jou it it token fan 'e winske telegrambot ta.
  • Push Bewarje en útwreidzje, wêrnei't wy nei de seksje gean triggers.
  • Wy sette de switch HTTP fersykom it fersyk iepenbier te meitsjen.

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes
Wy hawwe no in URL foar it iepenbier oproppen fan de funksje. Alles wat oerbliuwt is webhook ynstelle. Fyn ús bot @SelectelServerless_bot yn Telegram en registrearje jo bot mei it kommando:

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

resultaat

As alles goed is dien, sil jo bot fuortendaliks begjinne te wurkjen en it lêste loftfeartwaarberjocht direkt yn 'e boadskip werjaan.

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes
Fansels kin de koade ferbettere wurde, mar sels yn 'e hjoeddeistige steat is it genôch om it meast krekte waar en prognose te finen fan in fertroude boarne.

Jo fine de folsleine ferzje fan de koade yn ús repositories op GitHub.

De meast krekte waarberjocht: in bot foar Telegram op wolkfunksjes

Boarne: www.habr.com

Add a comment