Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud
Il existe de nombreux services qui fournissent des informations météorologiques, mais auquel faut-il faire confiance ? Quand j'ai commencé à faire du vélo fréquemment, je voulais avoir les informations les plus précises sur les conditions météorologiques de l'endroit où je roule.

Ma première idée a été de construire une petite station météo DIY avec des capteurs et d'en recevoir des données. Mais je n'ai pas « réinventé la roue » et j'ai choisi comme source de données vérifiées les informations météorologiques utilisées dans l'aviation civile, à savoir METAR (Rapport météorologique d'aérodrome) et TAF (TAF – Prévisions d’Aérodrome Terminal). 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 vocalement XNUMXh/XNUMX et XNUMXj/XNUMX sur chaque aérodrome moderne sous la forme ATIS (Service d'information sur les terminaux automatiques) et VOLMET (du français. vol - le vol et prévisions météorologiques - météo). Le premier fournit des informations sur la météo réelle sur l'aérodrome et le second fournit des prévisions pour les prochaines 24 à 30 heures, non seulement sur l'aérodrome diffusé, mais également sur d'autres.

Exemple de fonctionnement d'ATIS à l'aéroport de Vnukovo :

Un exemple du fonctionnement de VOLMET à l'aéroport de Vnukovo

Il n'est pas pratique d'emporter avec soi à chaque fois un scanner radio ou un émetteur-récepteur pour la portée correspondante, et je voulais créer un robot dans Telegram qui, d'un simple clic, vous permette d'obtenir la même prévision. Il est pour le moins peu pratique d'allouer un serveur séparé pour cela, ainsi que d'envoyer des requêtes à votre Raspberry domestique.

Par conséquent, j'ai décidé d'utiliser le service comme backend Fonctionnalités Selectel Cloud. Le nombre de demandes sera négligeable, un tel service sera donc pratiquement gratuit (selon mes calculs, ce sera 22 roubles pour 100 000 demandes).

Préparation du back-end

Créer une fonction

Dans le panneau de contrôle mon.selectel.ru ouvrir la vue Plateforme cloud et créez un nouveau projet :

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud
Une fois le projet créé, rendez-vous dans la section fonctions:

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud
Appuyez sur le bouton Créer une fonction et donnez-lui le nom souhaité :

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud
Après avoir appuyé Créer une fonction nous aurons une représentation de la fonction créée :

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud
Avant de commencer à créer du code en Python, vous devrez créer un bot dans Telegram. Je ne décrirai pas comment cela se fait - il y a des instructions détaillées dans notre base de connaissances. L'essentiel pour nous est le jeton du bot créé.

Préparation 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 en temps réel sur son serveur 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 actuelle de la prévision en heure moyenne de Greenwich. La deuxième ligne est un résumé de la météo réelle. Les pilotes de l’aviation civile n’auront aucun problème à comprendre ce que signifie cette ligne, mais nous avons besoin d’une explication :

  • [UUWW] — Vnukovo, Moscou (Russie — RU) ;
  • [101130Z] — 10ème jour du mois, 11h30 GMT ;
  • [31004MPS] — direction du vent 310 degrés, vitesse 4 m/s ;
  • — visibilité horizontale de 10 km ou plus ;
  • [SCT048] — nuages ​​épars/éparpillés à 4800 1584 pieds (~ XNUMX XNUMX m) ;
  • [24 / 13] — température 24°C, point de rosée 13°C ;
  • [T1014] — pression (QNH) 1014 hectopascals (750 mm Hg) ;
  • [R01/000070] — coefficient d'adhérence sur la voie 01 — 0,70 ;
  • [NOSIG] - sans changements significatifs.

Commençons par écrire le code du programme. Vous devez d’abord importer des fonctions nécessaire и 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 au TAF (le cas est également important).

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

Comme dans l'exemple précédent, regardons 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

Faisons particulièrement attention aux lignes TEMPS и BECMG. TEMPO signifie que la météo réelle pendant la période spécifiée changera périodiquement. BECMG - le temps changera progressivement au cours d'une période de temps spécifiée.

C'est à dire la ligne :

TEMPO 1012/1020 -TSRA BKN020CB

Signifiera:

  • [1012 / 1020] — entre 12 et 20 heures (Greenwich Mean Time) ;
  • [-TSRA] — orage (TS = orage) avec pluie (RA = pluie) de faible intensité (signe moins) ;
  • [BKN020CB] - nuages ​​significatifs (BKN = brisés), cumulonimbus (CB = cumulonimbus) à 2000 pieds (610 mètres) au-dessus du niveau de la mer.

Il existe de nombreux termes pour désigner les phénomènes météorologiques et il est difficile de s'en souvenir. Le code de la requête TAF est écrit de manière similaire.

Télécharger du code dans le cloud

Afin de ne pas perdre de temps, prenons un modèle de bot télégramme de notre référentiel cloud-telegram-bot. Il y a un pré-préparé conditions.txt и configuration.py avec la structure de répertoires correcte.

Puisque dans le code nous accéderons au module pytaf, alors sa version doit être immédiatement ajoutée à conditions.txt

pytaf~=1.2.1

  • Passons à l'édition bot/tele_bot.py. Nous supprimons toutes les choses inutiles 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)

  • Nous emballons l'intégralité du répertoire dans une archive ZIP et accédons au panneau de configuration à la fonction créée.
  • Cliquez ici Редактировать et téléchargez l'archive avec le code.

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud

  • Renseignez le chemin relatif dans le fichier télé_bot (extension py ne peut pas être spécifié) et une fonction de point de terminaison (dans l'exemple donné, il s'agit de principal).
  • Dans la section Variables d'environnement écrire une variable JETON et attribuez-lui le jeton du robot de télégramme souhaité.
  • Cliquez ici Enregistrer et développer, après quoi nous passons à la section Триггеры.
  • Nous mettons l'interrupteur Requête HTTPrendre la demande publique.

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud
Nous avons maintenant une URL pour appeler publiquement la fonction. Tout ce qui reste c'est configurer le webhook. Trouvez notre robot @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 dernier bulletin météo aéronautique directement dans la messagerie.

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud
Bien sûr, le code peut être amélioré, mais même dans son état actuel, il suffit de connaître la météo et les prévisions les plus précises auprès d'une source fiable.

Vous trouverez la version complète du code dans notre dépôts sur GitHub.

Les prévisions météo les plus précises : bot pour Telegram sur les fonctions cloud

Source: habr.com

Ajouter un commentaire