Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas
Yra daug paslaugų, teikiančių informaciją apie orus, tačiau kuria iš jų turėtumėte pasitikėti? Kai pradėjau dažnai važinėti dviračiu, norėjau turėti kuo tikslesnę informaciją apie oro sąlygas toje vietoje, kur važiuoju.

Pirma mintis buvo pastatyti nedidelę „pasidaryk pats“ orų stotį su jutikliais ir gauti iš jos duomenis. Bet aš „neišradau dviračio iš naujo“ ir kaip patikrintų duomenų šaltinį pasirinkau informaciją apie orą, kuri naudojama civilinėje aviacijoje, t. METARAS (METeorologinio aerodromo ataskaita) ir TAF (TAF – Terminal Aerodrome Forecast). Aviacijoje šimtų žmonių gyvenimas priklauso nuo oro sąlygų, todėl prognozės yra kuo tikslesnės.

Ši informacija yra transliuojama balsu 24 valandas per parą, 7 dienas per savaitę kiekviename šiuolaikiniame aerodrome ATIS (Automatinė terminalo informacijos tarnyba) ir VOLMET (iš prancūzų kalbos. t - skrydis ir Météo - oras). Pirmajame pateikiama informacija apie faktinius orus aerodrome, o antrajame – artimiausios 24-30 valandų prognozės ne tik transliuojamajame aerodrome, bet ir kituose.

ATIS operacijos Vnukovo oro uoste pavyzdys:

Pavyzdys, kaip VOLMET veikia Vnukovo oro uoste

Nepatogu kiekvieną kartą su savimi nešiotis radijo skaitytuvą ar siųstuvą-imtuvą atitinkamam diapazonui, todėl norėjau sukurti „Telegram“ robotą, kuris vienu mygtuko paspaudimu leistų gauti tą pačią prognozę. Bent jau nepraktiška tam skirti atskirą serverį, taip pat siųsti užklausas į savo namų Raspberry.

Todėl nusprendžiau naudoti paslaugą kaip užpakalinę programą Pasirinkite debesies funkcijas. Užklausų skaičius bus nereikšmingas, todėl tokia paslauga bus praktiškai nemokama (mano skaičiavimais, 22 rubliai už 100 000 užklausų).

Backend paruošimas

Funkcijos kūrimas

Valdymo skydelyje my.selectel.ru atverti vaizdą Debesų platforma ir sukurti naują projektą:

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas
Sukūrę projektą eikite į skyrių Funkcijos:

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas
Paspauskite mygtuką Sukurkite funkciją ir suteikite norimą pavadinimą:

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas
Paspaudus Sukurkite funkciją turėsime sukurtos funkcijos vaizdą:

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas
Prieš pradėdami kurti kodą „Python“, turėsite sukurti robotą „Telegram“. Neapibūdinsiu, kaip tai daroma - yra išsamios instrukcijos mūsų žinių bazėje. Mums svarbiausia yra sukurto boto žetonas.

Kodo paruošimas

Kaip patikimų duomenų šaltinį pasirinkau Nacionalinę vandenynų ir atmosferos administraciją (NOAA). Ši mokslinė agentūra atnaujina duomenis realiuoju laiku savo serveryje TXT formatu.

Nuoroda į METAR duomenis (atkreipkite dėmesį į atvejį):

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

Mano atveju artimiausias oro uostas yra Vnukovo, jo ICAO kodas yra UUWW. Nuėjus į sugeneruotą URL bus pateikta ši informacija:

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

Pirmoje eilutėje yra dabartinis prognozės laikas Grinvičo laiku. Antroji eilutė yra tikrojo oro santrauka. Civilinės aviacijos pilotams nebus sunku suprasti, ką ši eilutė reiškia, tačiau mums reikia paaiškinimo:

  • [UUWW] — Vnukovo, Maskvos (Rusija — RU);
  • [101130Z] — 10 mėnesio diena, 11:30 GMT;
  • [31004MPS] — vėjo kryptis 310 laipsnių, greitis 4 m/s;
  • [9999] — horizontalus matomumas 10 km ar daugiau;
  • [SCT048] — 4800 pėdų (~1584 m) aukštyje išsibarstę / išsibarstę debesys;
  • [24 / 13] — temperatūra 24°C, rasos taškas 13°C;
  • [Q1014] — slėgis (QNH) 1014 hektopaskalių (750 mm Hg);
  • [R01/000070] — sukibimo koeficientas 01 juostoje — 0,70;
  • [NOSIG] – be reikšmingų pokyčių.

Pradėkime rašyti programos kodą. Pirmiausia turite importuoti funkcijas prašyti и pytaf:

from urllib import request
import pytaf

Nurodykite kintamuosius ir paruoškite dekodavimo funkciją:

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

Pereikime prie TAF (atvejis taip pat svarbus).

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

Kaip ir ankstesniame pavyzdyje, pažiūrėkime į Vnukovo oro uosto prognozę:

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

Ypač atkreipkime dėmesį į linijas LAIKAS и BECMG. TEMPO reiškia, kad faktiniai orai nurodytu laikotarpiu periodiškai keisis. BECMG – orai palaipsniui keisis per tam tikrą laikotarpį.

Tai yra, eilutė:

TEMPO 1012/1020 -TSRA BKN020CB

Reiškia:

  • [1012 / 1020] — nuo 12 iki 20 valandų (Grinvičo laikas);
  • [-TSRA] — perkūnija (TS = perkūnija) su mažo intensyvumo lietumi (RA = lietus) (minuso ženklas);
  • [BKN020CB] - reikšmingi (BKN = sulaužyti), kamuoliniai (CB = kamuoliniai) debesys 2000 pėdų (610 metrų) virš jūros lygio.

Oro reiškiniams yra gana daug terminų, kuriuos sunku prisiminti. TAF užklausos kodas parašytas panašiai.

Kodo įkėlimas į debesį

Kad negaištume laiko, paimkime iš savo saugyklos telegramos roboto šabloną debesis-telegrama-bot. Yra iš anksto paruoštas reikalavimai.txt и setup.py su teisinga katalogo struktūra.

Kadangi kode mes pasieksime modulį pytaf, tada jo versija turėtų būti nedelsiant įtraukta reikalavimai.txt

pytaf~=1.2.1

  • Pereikime prie redagavimo bot/tele_bot.py. Pašaliname visus nereikalingus dalykus ir pridedame savo 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 = "Привет. Это бот для получения авиационного прогноза погоды " 
          "с серверов 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)

  • Supakuojame visą katalogą į ZIP archyvą ir einame į valdymo skydelį prie sukurtos funkcijos.
  • Spauskite čia Redaguoti ir atsisiųskite archyvą su kodu.

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas

  • Įveskite santykinį kelią faile tele_bot (pratęsimas .py gali būti nenurodyta) ir pabaigos taško funkcija (pateiktame pavyzdyje tai yra pagrindinis).
  • Skyriuje aplinkos įvairovė parašyti kintamąjį TOKENAS ir priskirkite jam norimo telegramų roboto žetoną.
  • Spauskite čia Išsaugoti ir išplėsti, po kurio einame į skyrių Trigeriai.
  • Įdedame jungiklį HTTP užklausakad prašymas būtų viešas.

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas
Dabar turime URL, skirtą viešai iškviesti funkciją. Liko tik konfigūruoti „Webhook“.. Raskite mūsų botą @SelectelServerless_bot „Telegram“ ir užregistruokite savo robotą naudodami komandą:

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

Rezultatas

Jei viskas bus padaryta teisingai, jūsų robotas nedelsdamas pradės veikti ir tiesiogiai messengeryje parodys naujausią aviacijos orų ataskaitą.

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas
Žinoma, kodą galima patobulinti, tačiau net ir dabartinėje būsenoje pakanka sužinoti tiksliausią orą ir prognozę iš patikimo šaltinio.

Visą kodo versiją rasite mūsų svetainėje „GitHub“ saugyklos.

Tiksliausia orų prognozė: „Telegram on cloud“ funkcijų robotas

Šaltinis: www.habr.com

Добавить комментарий