Depuis début novembre, Météo France met à disposition une nouvelle API (disponible ici) pour récupérer le Bulletin d’estimation du Risque d’Avalanche (BRA).
Vous trouverez toutes les informations en suivant ce lien vers la fiche produit.
L’API permet de récupérer le dernier bulletin de chaque massif montagneux au format XML (dont la structure est décrite dans ce document de Météo France) ainsi que les images associées au bulletin (météo, courbes d’enneigement…).
Grâce à cette API, j’ai monté une petite application pour visualiser les bulletins en temps réel (que vous pouvez consulter en plein écran sur avalanche.cirilgroup.com).
Nous allons voir quelques éléments pour utiliser cette API avec Python mais juste avant, sachez que vous pouvez intégrer cette application.
Intégrez l’application sur votre site
Vous souhaitez intégrer notre carte directement dans votre site web ? Aucun problème, il vous suffit d’utiliser un iframe
avec l’URL suivante :
<iframe id="iframe_bramap" title="BRA Map" src="https://avalanche.cirilgroup.com" width="100%" height="650px" > </iframe>
Vous souhaitez personnaliser le massif affiché par défaut ? C’est tout à fait possible, utilisez l’URL suivante :
https://avalanche.cirilgroup.com/index.html?_r=Massif&_f.Nom=MON_MASSIF
Indiquez le nom de votre massif en majuscule à la place de la balise MON_MASSIF
.
Si besoin, vous pouvez copier le nom indiqué dans le bulletin du massif que vous souhaitez afficher. Voici un exemple (consultable-ici) :
<iframe id="iframe_bramap" title="BRA Map" src="https://avalanche.cirilgroup.com/index.html?_r=Massif&_f.Nom=CHABLAIS" width="100%" height="650px" > </iframe>
N’hésitez pas non plus à simplement faire un lien vers l’appli.
Utiliser l’API
Authentification
L’API utilise une authentification OAuth2.
Le fonctionnement est assez simple, une authentification initiale permet de récupérer un jeton à fournit ensuite pour chaque appel à l’API.
La récupération du jeton se fait simplement en le demandant via une requête de type POST
en fournissant des informations d’authentification.
Voici comment procéder :
# Modules requis import requests import json # Variables # URL de récupération du jeton auth_url = "https://portail-api.meteofrance.fr/oauth2/token" # Identifiant d'authentification auth_client_id = "xxxxx" # Mot de passe d'authentification auth_client_mdp = "yyyyy" # Données de la requête POST, ici on indique le type d'authentification auth_data = { 'grant_type': 'client_credentials' } # En-têtes (non obligatoire) request_headers = { "User-Agent": "Arthur Bazin" } # Récupération du token response = requests.request( method = 'POST', url = auth_url, data = auth_data, auth = (auth_client_id, auth_client_mdp), headers = request_headers, verify = True ) # Le token est au format JSON token = response.json()
Le jeton possède la structure suivante :
{ 'access_token': 'eyJ4NX...qjow', 'scope': 'default', 'token_type': 'Bearer', 'expires_in': 3600 }
Notez que les données d’authentification dans la variable auth
sont fournies via un tuple contenant l’identifiant suivit du mot de passe. Dans le cas d’OAuth2, on parle souvent de « client id » et de « client secret ».
Pour récupérer ces éléments pour l’API Météo France, vous devez vous rendre dans la rubrique « Mes API » de votre compte sur https://portail-api.meteofrance.fr. Cliquez sur « Générer un token » ce qui vous permettra de récupérer une ligne de commande pour CURL comme suivant :
curl -k -X POST https://portail-api.meteofrance.fr/token -d "grant_type=client_credentials" -H "Authorization: Basic aWRlbnRpZmlhbnQ6bW90X2RlX3Bhc3Nl"
Il s’agit de la même requête que celle que nous avons généré avec Python, notez l’en-tête Autorization
:
Authorization: Basic aWRlbnRpZmlhbnQ6bW90X2RlX3Bhc3Nl
Cet en-tête est également généré dans notre requête Python grâce au paramètre auth
que nous avons renseigné sauf qu’ici les données d’authentification sont encodée en base64. Le site suivant vous permet de décoder les données de la dernière partie :
aWRlbnRpZmlhbnQ6bW90X2RlX3Bhc3Nl
=> identifiant:mot_de_passe
Les données d’identification sont en fait accolées, séparées par deux points puis encodées en base64.
Liste des massifs
L’API ne permet pas de récupérer tous les BRA d’un seul coup, il faut récupérer chaque BRA individuellement.
Dans sa documentation, Météo France nous indique la liste des massifs disponibles. Voici une variable Python qui les liste.
# Liste des massifs list_massifs = [ (1,"Chablais", "Haute-Savoie", "Alpes du Nord"), (2,"Aravis", "Haute-Savoie", "Alpes du Nord"), (3,"Mont-Blanc", "Haute-Savoie", "Alpes du Nord"), (4,"Bauges", "Savoie", "Alpes du Nord"), (5,"Beaufortain", "Savoie", "Alpes du Nord"), (6,"Haute-Tarentaise", "Savoie", "Alpes du Nord"), (7,"Chartreuse", "Isère", "Alpes du Nord"), (8,"Belledonne", "Isère", "Alpes du Nord"), (9,"Maurienne", "Savoie", "Alpes du Nord"), (10,"Vanoise", "Savoie", "Alpes du Nord"), (11,"Haute-Maurienne", "Savoie", "Alpes du Nord"), (12,"Grandes-Rousses", "Isère", "Alpes du Nord"), (13,"Thabor", "Hautes-Alpes", "Alpes du Sud"), (14,"Vercors", "Isère", "Alpes du Nord"), (15,"Oisans", "3sère", "Alpes du Nord"), (16,"Pelvoux", "Hautes-Alpes", "Alpes du Sud"), (17,"Queyras", "Hautes-Alpes", "Alpes du Sud"), (18,"Devoluy", "Hautes-Alpes", "Alpes du Sud"), (19,"Champsaur", "Hautes-Alpes", "Alpes du Sud"), (20,"Embrunnais Parpaillon", "Hautes-Alpes", "Alpes du Sud"), (21,"Ubaye", "Alpes de Haute-Provence", "Alpes du Sud"), (22,"Haut-Var Haut-Verdon", "Alpes de Haute-Provence / Alpes Maritimes", "Alpes du Sud"), (23,"Mercantour", "Alpes Maritimes", "Alpes du Sud"), (40,"Cinto Rotondo", "Haute-Corse Corse du Sud", "Corse"), (41,"Renoso Incudine", "Haute-Corse Corse du Sud", "Corse"), (64,"Pays-Basque", "Pyrénées Atlantiques", "Pyrénées"), (65,"Aspe Ossau", "Pyrénées Atlantiques", "Pyrénées"), (66,"Haute-Bigorre", "Hautes-Pyrénées", "Pyrénées"), (67,"Aure Louron", "Hautes-Pyrénées", "Pyrénées"), (68,"Luchonnais", "Haute-Garonne", "Pyrénées"), (69,"Couserans", "Haute-Garonne / Ariège", "Pyrénées"), (70,"Haute-Ariege", "Ariège", "Pyrénées"), (71,"Andorre", "Andorre", "Pyrénées"), (72,"Orlu St-Barthelemy", "Ariège", "Pyrénées"), (73,"Capcir Puymorens", "Pyrénées Orientales", "Pyrénées"), (74,"Cerdagne Canigou", "Pyrénées Orientales", "Pyrénées") ]
Il suffit maintenant de boucler sur cette liste pour récupérer les données de chaque BRA.
Récupérer les données des BRA
Les données des BRA sont au format XML, nous utiliserons donc le module xml.etree
pour les récupérer plus facilement.
Voici le code Python pour extraire les données :
# On importe le module pour traiter le xml import xml.etree.ElementTree as xml_etree # On prépare l'en-tête qui passera le jeton à l'API # On utilise la méthode update pour conserver l'en-tête "User-Agent" # Le jeton est contenu dans l'élément "access_token" des données récupérées précédemment request_headers.update( dict( Authorization= 'Bearer ' + token['access_token'] ) ) # Création d'une variable qui contiendra toutes les données des BRA bra_data= [] # On boucle sur chaque massif for massif_data in list_massifs: # On créé une variable avec quelques données de base sur les massifs data= dict( id_massif= massif_data[0], nom_massif= massif_data[1], departement_massif= massif_data[2], zone_massif= massif_data[3] ) # On récupère le BRA bra_response= requests.request( method= 'GET', url= "https://public-api.meteofrance.fr/public/DPBRA/v1/massif/BRA?id-massif="+ str(data['id_massif']) + "&format=xml", headers= request_headers, verify= True ) # On stocke les infos du BRA #data['bra_xml']= bra_response.text # On récupère les données au format XML bra_xml= xml_etree.fromstring(bra_response.text) # On ajoute les données présentes dans le BRA à notre variable data['date_bulletin']= bra_xml.attrib.get('DATEBULLETIN') data['risque']= bra_xml.find("./CARTOUCHERISQUE/RISQUE").attrib.get('RISQUEMAXI') data['risque_j2']= bra_xml.find("./CARTOUCHERISQUE/RISQUE").attrib.get('RISQUEMAXIJ2') data['declenchement_accidentel']= cartouche_accidentel = bra_xml.findtext("./CARTOUCHERISQUE/ACCIDENTEL"), data['declenchement_naturel']= cartouche_naturel = bra_xml.findtext("./CARTOUCHERISQUE/NATUREL"), data['resume']= cartouche_resume = bra_xml.findtext("./CARTOUCHERISQUE/RESUME"), # On ajoute les données à la variable qui contiendra le tout bra_data.append(data)
Vous pouvez ensuite stocker ces données comme bon vous semble, dans une base PostgreSQL par exemple.
Il ne vous reste plus qu’a être créatif !!
❄️ Bel hiver !! ❄️
Cet article vous a plu ?
N'hésitez pas à le partager, il interessera surement certains de vos contacts.
Les thèmes suivants contiennent des articles en lien avec celui-ci, allez faire un tour :
ProgrammationPython APIAvalancheOAuth2XML