
Il existe de nombreux services fournissant des informations météorologiques, mais lequel croire? Quand j'ai beaucoup commencé à faire du vélo, je voulais avoir les informations les plus précises sur les conditions météorologiques dans la région où je roule.
La première pensée a été de construire une petite station météo de bricolage avec des capteurs et d'en recevoir des données. Mais je n'ai pas réinventé la roue et j'ai choisi les informations météorologiques utilisées dans l'aviation civile, à savoir METAR (METeorological Aerodrome Report) et TAF (TAF - Terminal Aerodrome Forecast) comme source de données vérifiées . Dans l'aviation, la vie de centaines de personnes dépend de la météo, les prévisions sont donc aussi précises que possible.
Ces informations sont diffusées 24 heures sur 24 par la voix dans tous les aéroports modernes sous la forme d' ATIS (Automatic Terminal Information Service) et de VOLMET (du français vol - vol et météo - météo). Le premier fournit des informations sur la météo réelle à l'aéroport, et le second - une prévision pour les prochaines 24 à 30 heures, non seulement à l'aéroport de diffusion, mais aussi sur d'autres.
Un exemple d'ATIS à l'aéroport de Vnukovo:
Exemple de VOLMET à l'aéroport de Vnukovo
Il n'est pas pratique d'emporter un scanner radio ou un émetteur-récepteur avec moi à chaque fois à la plage correspondante, et je voulais créer un bot dans Telegram, qui, en appuyant sur un bouton, me permet d'obtenir les mêmes prévisions. Allouer un serveur séparé pour cela est au moins peu pratique, ainsi que conduire des requêtes vers le Raspberry domestique.
Par conséquent, j'ai décidé d'utiliser le service Selectel Cloud Functions comme backend . Le nombre de demandes sera négligeable, donc ce service coûtera pratiquement gratuit (selon mes calculs, ce sera 22 roubles pour 100 000 demandes).
Préparation du backend
Création de fonction
Dans le panneau de configuration my.selectel.ru, ouvrez la vue Cloud Platform et créez un nouveau projet:

Une fois le projet créé, accédez à la section Fonctions :

Cliquez sur le bouton Créer une fonction et donnez-lui le nom souhaité:

Après avoir cliqué sur Créer une fonction , nous aurons une vue de la fonction créée:

Avant de commencer à créer du code Python, vous devez créer un bot dans Telegram. Je ne décrirai pas comment cela est fait - des instructions détaillées sont disponibles dans notre base de connaissances . L'essentiel pour nous est le jeton du bot créé.
Cuisson du code
J'ai choisi la National Oceanic and Atmospheric Administration (NOAA) comme source de données fiables. Cette agence scientifique met à jour les données de son serveur en temps réel au format TXT.
Lien pour obtenir les données METAR (notez le cas):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/< ICAO>.TXT
Dans mon cas, l'aéroport le plus proche est Vnukovo, son code OACI est UUWW . Aller à l'URL générée donnera ce qui suit:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
La première ligne indique l'heure à laquelle la prévision est mise à jour par heure de Greenwich. La deuxième ligne est un résumé de la météo réelle. Les pilotes de l'aviation civile comprendront facilement ce que signifie cette ligne, mais nous avons besoin d'un décryptage:
- [UUWW] - Vnukovo, Moscou (Russie - RU);
- [101130Z] - 10e jour du mois, 11h30 GMT;
- [31004MPS] - direction du vent 310 degrés, vitesse 4 m / s;
- [9999] - visibilité horizontale de 10 km ou plus;
- [SCT048] - nuages épars / dispersés à une altitude de 4 800 pieds (~ 1584 m);
- [24/13] - température 24 ° C, point de rosée 13 ° C;
- [Q1014] - pression (QNH) 1014 hectopascals (750 mm Hg);
- [R01 / 000070] - coefficient d'adhérence sur la voie 01 - 0,70;
- [NOSIG] - aucun changement significatif.
Commençons à écrire le code du programme. Tout d'abord, vous devez importer la requête et les fonctions pytaf :
from urllib import request
import pytaf
Spécifiez les variables et préparez la fonction de décodage:
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()
Passons à TAF (le registre est également important).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/< ICAO>.TXT
Comme dans l'exemple précédent, voyons les prévisions à l'aéroport de 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
Portez une attention particulière aux lignes TEMPO et BECMG . TEMPO signifie que le temps réel pendant la période spécifiée changera périodiquement. BECMG - le temps changera progressivement pendant la période de temps spécifiée.
Autrement dit, la ligne:
TEMPO 1012/1020 -TSRA BKN020CB
Signifiera:
- [1012/1020] - entre 12h00 et 20h00 (GMT);
- [-TSRA] - orage (TS = orage) avec pluie (RA = pluie) de faible intensité (signe moins);
- [BKN020CB] Couverture nuageuse importante (BKN = brisé) de cumulonimbus (CB = cumulonimbus) à 2 000 pieds (610 mètres) au-dessus du niveau de la mer.
Il y a beaucoup de termes qui désignent des phénomènes météorologiques, et il est difficile de s'en souvenir. Le code d'une requête TAF est écrit de la même manière.
Télécharger le code dans le cloud
Afin de ne pas perdre de temps, prenons un modèle de bot de télégramme de notre référentiel cloud-telegram-bot . Il existe un requirements.txt et setup.py pré-préparés avec la structure de répertoires correcte.
Puisque dans le code nous ferons référence au module pytaf , sa version doit être immédiatement ajoutée à requirements.txt
pytaf~=1.2.1
- Passons à l'édition du bot / tele_bot.py . Nous supprimons tout ce qui est inutile et ajoutons notre 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 = ". " \
" 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)
- Emballez le répertoire entier dans une archive ZIP et accédez au panneau de configuration à la fonction créée.
- .

- tele_bot ( .py ) - ( main).
- TOKEN -.
- , .
- HTTP-, .

Nous avons maintenant une URL pour un appel de fonction publique. Il ne reste plus qu'à configurer le webhook . Trouvez notre bot @SelectelServerless_bot dans Telegram et enregistrez votre bot avec la commande:
/setwebhook <you bot token> <public URL of your function>
Résultat
Si tout est fait correctement, votre bot commencera immédiatement à fonctionner et affichera le rapport météo aéronautique actuel directement dans le messager.

Bien sûr, le code peut être modifié, mais même dans son état actuel, il suffit de connaître la météo et les prévisions les plus précises à partir d'une source fiable.
Vous pouvez trouver la version complète du code dans notre référentiel sur GitHub .
