
Există multe servicii care oferă informații despre vreme, dar cui îi putem acorda încredere? Când am început să merg mai des cu bicicleta, mi-am dorit să am cele mai precise informații despre condițiile meteo din locul în care pedalez.
Prima idee a fost să construiesc o mică stație meteo DIY cu senzori și să obțin date de pe aceasta. Dar nu am vrut să "inventeze bicicleta" și am ales să folosesc informațiile meteo verificate care sunt utilizate în aviația civilă, respectiv METAR (Raportul Meteorologic pentru Aerodrom) și TAF (TAF — Prognoza pentru Aerodrom). În aviație, vremea afectează viețile a sute de oameni, astfel că prognozele sunt cât mai precise.
Această informație este transmisă 24/7 prin voce la fiecare aerodrom modern sub forma ATIS (Serviciul de Informații Terminale Automate) și VOLMET (de la franceză, vol — zbor și météo — vreme). Primul oferă informații despre vremea actuală la aerodrom, iar al doilea oferă prognoza pentru următoarele 24-30 de ore, nu doar pentru aerodromul de transmitere, ci și pentru altele.
Exemplu de funcționare a ATIS-ului aeroportului Vnukovo:
Exemplu de funcționare a VOLMET-ului aeroportului Vnukovo
Este incomod să car mereu cu mine un scanner radio sau un transceiver pe banda corespunzătoare, așa că am dorit să creez un bot în Telegram care, printr-o apăsare de buton, să ofere aceleași prognoze. Este mai mult decât neproductiv să dedic un server special pentru asta, la fel cum ar fi neviabil să trimit cereri pe Raspberry de acasă.
Prin urmare, am decis să folosesc serviciul . Numărul de cereri va fi infim, așa că acest serviciu va fi practic gratuit (în estimările mele, va costa 22 de ruble pentru 100.000 de cereri).
Pregătirea backend-ului
Crearea funcției
În panoul de control deschidem vizualizarea Platforma Cloud și creăm un proiect nou:

După ce proiectul a fost creat, mergem la secțiunea Functions:

Apăsăm butonul Creează funcția și îi dăm un nume corespunzător:

După apăsarea Creează funcția ne va apărea vizualizarea funcției create:

Înainte de a începe să scriu codul în Python, va trebui să creez un bot în Telegram. Nu voi detalia cum se face acest lucru — există un ghid detaliat . Tot ce contează pentru noi este token-ul botului creat.
Pregătim codul
Ca sursă de date de încredere, am ales Administrația Națională pentru Oceane și Atmosferă din SUA (în engleză, National Oceanic and Atmospheric Administration, NOAA). Această agenție științifică actualizează datele în timp real pe serverul său în format TXT.
Linkul pentru obținerea datelor METAR (vă rugăm să observați majusculele):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTÎn cazul meu, cel mai apropiat aeroport este Vnukovo, iar codul său conform ICAO este UUWW. Accesând URL-ul generat, veți obține următoarele:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Prima linie indică momentul de actualizare a prognozei în timp universal coordonat. A doua linie este un rezumat al vremii actuale. Piloții aviației civile vor înțelege cu ușurință ce înseamnă această linie, dar avem nevoie de o explicație:
- [UUWW] — Vnukovo, orașul Moscova (Rusia — RU);
- [101130Z] — a zecea zi a lunii, la 11 ore și 30 de minute în UTC;
- [31004MPS] — direcția vântului 310 grade, viteza 4 m/s;
- [9999] — vizibilitate orizontală de 10 km sau mai mult;
- [SCT048] — nori dispersați la o altitudine de 4800 de picioare (~1584m);
- [24/13] — temperatura 24°C, punctul de rouă 13°C;
- [Q1014] — presiunea (QNH) 1014 hectopascali (750 mmHg);
- [R01/000070] — coeficientul de aderență pe pista 01 este 0,70;
- [NOSIG] — fără schimbări semnificative.
Începem să scriem codul. La început, va trebui să importăm funcțiile ) cu datele. Iată linia pe care o puteți insera pur și simplu în câmpul de adresă al browser-ului și apoi să actualizați pagina (asta trebuie făcut o singură dată): și pytaf:
from urllib import request
import pytafDefinim variabilele și pregătim funcția de decodificare:
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 (majusculele sunt, de asemenea, importante).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTCa în exemplul anterior, să vedem prognoza pentru 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
În special, să acordăm atenție liniilor TEMPO și BECMG. TEMPO înseamnă că vremea reală în intervalul specificat va varia periodic. BECMG — vremea se va schimba treptat în intervalul specificat.
Așadar, linia:
TEMPO 1012/1020 -TSRA BKN020CBVa însemna:
- [1012/1020] — în intervalul de la 12 la 20 ore (în UTC);
- [-TSRA] — furtună cu descărcări electrice (TS = thunderstorm) cu ploaie (RA = rain) de intensitate mică (semnul minus);
- [BKN020CB] — significant (BKN = broken), cumulonimbus (CB) cloud cover at an altitude of 2000 feet (610 meters) above sea level.
There are many terms that mean weather phenomena, and it is challenging to remember them. The code for TAF requests is written in a similar way.
We upload the code to the cloud
To save time, let's take a template of a Telegram bot from our repository . It has a pre-prepared requirements.txt și setup.py with the correct directory structure.
Since we will refer to the module in the code, pytafits version should be added to requirements.txt
pytaf~=1.2.1- Let's move on to editing bot/tele_bot.py. We remove everything unnecessary and add our code.
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 = "Hello. This is a bot for receiving aviation weather forecasts "
"from NOAA servers. The bot is set up for Vnukovo Airport (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 package the entire directory into a ZIP archive and go to the control panel to the created function.
- Facem clic pe Edit and upload the archive with the code.

- Fill in the relative path for the file tele_bot (the extension .py can be omitted) and the endpoint function (in this example, it's main).
- În secțiune Environment variables we write the variable TOKEN and assign it the token of the appropriate Telegram bot.
- Facem clic pe Save and deploy, after which we go to the section Triggers.
- We turn on the toggle HTTP request, to make the request public.

Am creat un URL pentru apelul public de funcție. Rămâne doar . Găsiți botul nostru în Telegram și înregistrați-vă botul cu comanda:
/setwebhook <you bot token> <public URL of your function>Rezultatul
Dacă totul a fost realizat corect, botul dumneavoastră va începe imediat să funcționeze și să afișeze un rezumat actualizat al vremii aviatice direct în mesajele de chat.

Desigur, codul poate fi îmbunătățit, dar chiar și în forma sa actuală, este suficient pentru a obține cele mai precise informații despre vreme și prognoză dintr-o sursă verificată.
Versiunea completă a codului o puteți găsi în .
Sursa: habr.com
