Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud
Există o mulțime de servicii care oferă informații despre vreme, dar în care ar trebui să ai încredere? Când am început să merg frecvent pe bicicletă, am vrut să am cele mai precise informații despre condițiile meteo din locul în care merg.

Primul meu gând a fost să construiesc o mică stație meteo DIY cu senzori și să primesc date de la ea. Dar nu am „reinventat roata” și am ales informațiile meteo care sunt folosite în aviația civilă ca sursă de date verificate, și anume METAR (Raportul Aerodromului MEteorologic) și TAF (TAF - Terminal Aerodrom Forecast). În aviație, viața a sute de oameni depinde de vreme, așa că prognozele sunt cât se poate de precise.

Aceste informații sunt difuzate XNUMX/XNUMX prin voce la fiecare aerodrom modern în formular ATIS (Serviciul de informare automată a terminalelor) și VOLMET (din franceză. vol - zbor și meteo - vremea). Primul oferă informații despre vremea reală la aerodrom, iar al doilea oferă o prognoză pentru următoarele 24-30 de ore, nu doar la aerodromul difuzat, ci și la altele.

Exemplu de operare ATIS pe aeroportul Vnukovo:

Un exemplu despre modul în care VOLMET funcționează la Aeroportul Vnukovo

Este incomod să purtați cu dvs. un scanner radio sau un transceiver de fiecare dată pentru intervalul corespunzător și am vrut să creez un bot în Telegram care, printr-un clic pe un buton, vă permite să obțineți aceeași prognoză. Este cel puțin impracticabil să aloci un server separat pentru aceasta, precum și să trimiți cereri către Raspberry acasă.

Prin urmare, am decis să folosesc serviciul ca backend Funcții Selectel Cloud. Numărul de cereri va fi neglijabil, așa că un astfel de serviciu va fi practic gratuit (conform calculelor mele, va fi de 22 de ruble pentru 100 de cereri).

Pregătirea backend

Creați o funcție

În panoul de control my.selectel.ru deschide vederea Platformă cloud și creați un nou proiect:

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud
După ce proiectul este creat, accesați secțiunea Funcții:

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud
Apăsați butonul Creați o funcție si da-i numele dorit:

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud
După apăsare Creați o funcție vom avea o reprezentare a funcției create:

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud
Înainte de a începe să creați cod în Python, va trebui să creați un bot în Telegram. Nu voi descrie cum se face acest lucru - există instrucțiuni detaliate în baza noastră de cunoștințe. Principalul lucru pentru noi este simbolul botului creat.

Pregătirea codului

Am ales National Oceanic and Atmospheric Administration (NOAA) ca sursă de date fiabile. Această agenție științifică actualizează datele în timp real pe serverul său în format TXT.

Link pentru a obține date METAR (rețineți cazul):

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

În cazul meu, cel mai apropiat aeroport este Vnukovo, codul său ICAO este UUWW. Mergând la adresa URL generată va da următoarele:

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

Prima linie este ora actuală a prognozei în Greenwich Mean Time. A doua linie este un rezumat al vremii reale. Piloții de aviație civilă nu vor avea nicio problemă să înțeleagă ce înseamnă această linie, dar avem nevoie de o explicație:

  • [UUWW] — Vnukovo, Moscova (Rusia — RU);
  • [101130Z] — a 10-a zi a lunii, ora 11:30 GMT;
  • [31004MPS] — direcția vântului 310 grade, viteza 4 m/s;
  • [9999] — vizibilitate orizontală de 10 km sau mai mult;
  • [SCT048] — nori împrăștiați/împrăștiați la 4800 picioare (~1584 m);
  • [24 / 13] — temperatura 24°C, punctul de rouă 13°C;
  • [Î1014] — presiune (QNH) 1014 hectopascali (750 mm Hg);
  • [R01/000070] — coeficient de aderență pe banda 01 — 0,70;
  • [NOSIG] - fără modificări semnificative.

Să începem să scriem codul programului. Mai întâi trebuie să importați funcții solicita и pytaf:

from urllib import request
import pytaf

Specificați variabilele și pregătiți funcția de decodare:

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

Să trecem la TAF (cazul este de asemenea important).

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

Ca și în exemplul anterior, să ne uităm la prognoza de la aeroportul 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

Să acordăm o atenție deosebită liniilor TEMPO и BECMG. TEMPO înseamnă că vremea reală în perioada specificată se va schimba periodic. BECMG - vremea se va schimba treptat într-o anumită perioadă de timp.

Adică linia:

TEMPO 1012/1020 -TSRA BKN020CB

Va însemna:

  • [1012 / 1020] — între 12 și 20 de ore (Greenwich Mean Time);
  • [-TSRA] — furtună (TS = furtună) cu ploaie (RA = ploaie) de intensitate redusă (semnul minus);
  • [BKN020CB] - nori semnificativi (BKN = spart), cumulonimbus (CB = cumulonimbus) la 2000 de picioare (610 metri) deasupra nivelului mării.

Există destul de mulți termeni pentru fenomenele meteorologice și este dificil să-i amintim. Codul pentru cererea TAF este scris într-un mod similar.

Încărcarea codului în cloud

Pentru a nu pierde timpul, să luăm un șablon de bot telegram din depozitul nostru nor-telegramă-bot. Există un pre-pregătit cerințe.txt и setup.py cu structura corectă de directoare.

Deoarece în cod vom accesa modulul pytaf, atunci versiunea sa ar trebui adăugată imediat la cerințe.txt

pytaf~=1.2.1

  • Să trecem la editare bot/tele_bot.py. Îndepărtăm toate lucrurile inutile și adăugăm codul nostru.

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)

  • Împachetăm întregul director într-o arhivă ZIP și mergem la panoul de control la funcția creată.
  • presa Pentru a edita și descărcați arhiva cu codul.

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud

  • Completați calea relativă în fișier tele_bot (extensie PY nu poate fi specificat) și o funcție de punct final (în exemplul dat, aceasta este principal).
  • În secțiunea variabile de mediu scrie o variabilă JETON și atribuiți-i simbolul botului telegramă dorit.
  • presa Salvați și extindeți, dupa care trecem la sectiune declanșatoare.
  • Punem comutatorul Solicitare HTTPsă facă publică cererea.

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud
Acum avem o adresă URL pentru apelarea publică a funcției. Tot ce a mai rămas este configurați webhook. Găsiți botul nostru @SelectelServerless_bot în Telegram și înregistrați-vă botul cu comanda:

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

Rezultat

Dacă totul este făcut corect, botul tău va începe imediat să lucreze și va afișa cel mai recent raport meteorologic de aviație direct în messenger.

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud
Desigur, codul poate fi îmbunătățit, dar chiar și în starea sa actuală este suficient pentru a afla cea mai precisă vreme și prognoză dintr-o sursă de încredere.

Veți găsi versiunea completă a codului în pagina noastră depozite pe GitHub.

Cea mai precisă prognoză meteo: bot pentru Telegram pe funcțiile cloud

Sursa: www.habr.com

Adauga un comentariu