Vous appréciez mon travail ?
Je serais ravi de prendre un café !

Vous prenez du plaisir à lire mes articles ? Vous apprenez de nouvelles choses ? Je serais ravis que vous supportiez mon travail avec une petite participation

1 café Merci, vous financez ma dose quotidienne de théïne (oui, en vrai je ne bois pas de café).
5 cafés Génial, ça couvre mes frais de serveur mensuels.
10 cafés Fantastique, avec ça je peux investir dans du matériel et approfondir mes connaissances.
BazinGa's - Tips & tuto IT

Exploitons la nouvelle API du BRA (avalanches)

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 !!

avalanche.cirilgroup.com

❄️ 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

50%