Api Web et Python
Partie 1 : interrogation d'une API
La Base Adresse Nationale est une API gratuite du gouvernement français qui permet d'obtenir un certain nombre d'informations à partir d'une adresse postale, ou l'inverse, obtenir un lieu ou adresse à partir de coordonnées géographiques : latitude et longitude.
Nous allons donc pouvoir interroger l'API pour obtenir des informations sur l'adresse postale de notre lycée : 41 cours Général Giraud. La documentation de l'API nous informe que l'on peut utiliser le paramètre q pour cette recherche avec l'outil curl que nous pouvons utiliser dans un terminal :
curl "https://data.geopf.fr/geocodage/search/?q=41+cours+general+giraud"
{"type": "FeatureCollection",
"version": "draft",
"features": [
{"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
4.822378,
45.769356]
},
"properties": {
"label": "41 Cours Général Giraud 69001 Lyon",
"score": 0.9666027272727272,
"housenumber": "41",
"id": "69381_3130_00041",
"name": "41 Cours Général Giraud",
"postcode": "69001",
"citycode": "69381",
"x": 841617.76,
"y": 6520495.01,
"city": "Lyon",
"district": "Lyon 1er Arrondissement",
"context": "69, Rhône, Auvergne-Rhône-Alpes",
"type": "housenumber",
"importance": 0.63263,
"street": "Cours Général Giraud"
}
},
{"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
4.857804,
46.794903]
},
"properties": {
"label": "41 Rue Général Giraud 71100 Chalon-sur-Saône",
"score": 0.5688992307692308,
"housenumber": "41",
"id": "71076_3140_00041",
"name": "41 Rue Général Giraud",
"postcode": "71100",
"citycode": "71076",
"x": 841690.89,
"y": 6634418.5,
"city": "Chalon-sur-Saône",
"context": "71, Saône-et-Loire, Bourgogne-Franche-Comté",
"type": "housenumber",
"importance": 0.71943,
"street": "Rue Général Giraud"
}
},
{"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
0.168407,
49.511065]
},
"properties": {
"label": "Rue Général Giraud 76610 Le Havre",
"score": 0.5206972727272728,
"id": "76351_3425",
"name": "Rue Général Giraud",
"postcode": "76610",
"citycode": "76351",
"x": 494889.87,
"y": 6938314.66,
"city": "Le Havre",
"context": "76, Seine-Maritime, Normandie",
"type": "street",
"importance": 0.68767,
"street": "Rue Général Giraud"
}
},
{"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-0.360194,
49.180507]
},
"properties": {
"label": "Rue Général Giraud 14000 Caen",
"score": 0.5206472727272727,
"id": "14118_3410",
"name": "Rue Général Giraud",
"postcode": "14000",
"citycode": "14118",
"x": 455056.84,
"y": 6903075.07,
"city": "Caen",
"context": "14, Calvados, Normandie",
"type": "street",
"importance": 0.68712,
"street": "Rue Général Giraud"
}
},
{"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
2.46031,
48.942095]
},
"properties": {
"label": "41 Rue du Général Giraud 93150 Le Blanc-Mesnil",
"score": 0.5191079310344827,
"housenumber": "41",
"id": "93007_1040_00041",
"name": "41 Rue du Général Giraud",
"postcode": "93150",
"citycode": "93007",
"x": 660466.21,
"y": 6871482.38,
"city": "Le Blanc-Mesnil",
"context": "93, Seine-Saint-Denis, Île-de-France",
"type": "housenumber",
"importance": 0.74467,
"street": "Rue du Général Giraud"
}
}
],
"attribution": "BAN",
"licence": "ETALAB-2.0",
"query": "41 cours general giraud",
"limit": 5
}
Question
Après analyse de ce dictionnaire, donner les clés (au sens dictionnaire) de cette réponse.
Indice
Le logiciel VSCodium permet d'afficher la réponse parfaitement formatée (menu contextuel d'un fichier .json puis mettre le document en forme).
Solution
Cette réponse est un dictionnaire qui contient 7 clés : 'type', 'version', 'features', 'attribution', 'licence', 'query' et 'limit'.
Question
On constate que d'autres villes apparaissent.
La documentation de l'API nous informe que l'on peut filtrer les réponses par de nombreux moyens : code postal, code INSEE, ville... On rajoute le filtre en ajoutant dans paramètres à notre requete GET (cf le cours).
Filtrer avec le code postal du lycée (69001). Et donner la réponse obtenue.
Solution
curl "https://data.geopf.fr/geocodage/search/?q=41+cours+general+giraud&postcode=69001"
{"type": "FeatureCollection",
"version": "draft",
"features": [
{"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
4.822378,
45.769356]
},
"properties": {
"label": "41 Cours Général Giraud 69001 Lyon",
"score": 0.9666027272727272,
"housenumber": "41",
"id": "69381_3130_00041",
"name": "41 Cours Général Giraud",
"postcode": "69001",
"citycode": "69381",
"x": 841617.76,
"y": 6520495.01,
"city": "Lyon",
"district": "Lyon 1er Arrondissement",
"context": "69, Rhône, Auvergne-Rhône-Alpes",
"type": "housenumber",
"importance": 0.63263,
"street": "Cours Général Giraud"
}
}
],
"attribution": "BAN",
"licence": "ETALAB-2.0",
"query": "41 cours general giraud",
"filters": {
"postcode": "69001"
},
"limit": 5
}
Partie 2 : Utilisation d'une API avec Python
Voici un code Python permettant l'interrogation de l'API :
import requests
url = "https://data.geopf.fr/geocodage/search/?q=41+cours+general+giraud&postcode=69001"
reponse = requests.get(url)
data = reponse.json()
On utilise pour cela le module requests qui est une librairie HTTP qui permet de réaliser des requêtes avec Python. La réponse de l'API sera stockée dans la variable reponse que l'on mettra au format JSON (data) afin d'exploiter les données comme si c'était un dictionnaire Python, pratique !
Question
Tester ces lignes de codes puis programmer une fonction interrogation_BAN() qui prend pour paramètres l'adresse et le code postal.
Indice
L'usage d'un f-string sera pratique pour utiliser les 2 paramètres...
Solution
def interrogation_BAN(adresse, code_postal):
url = f"https://data.geopf.fr/geocodage/search/?q={adresse}&postcode={code_postal}"
reponse = requests.get(url)
data = reponse.json()
return data
Question
Améliorer le code suivant, en créant une nouvelle fonction interrogation_BAN_coordonnees() qui retourne uniquement les coordonnées géographiques latitude / longitude.
Indice
On rappelle que
dataest un dictionnaire de 7 ou 8 clés selon le requête.
data['features']est un tableau contenant un ou plusieurs éléments de type dictionnaire : chaque dictionnaire correspond à une adresse potentielle, la première (indice0) étant la plus susceptible de correspondre à notre demande.
data['features'][0]est un dictionnaire possédant trois clés :'type','geometry'et'properties'.data['features'][0]['geometry']est un dictionnaire possédant deux clés :'type'et'coordinates'.
Déduire de ces lignes les coordonnées...
Question
Pour finir, créer une fonction geocodage_inverse() qui prend pour paramètres une latitude et une longitude (sous forme de flottant) et qui retourne une adresse complète.
Pour tester notre fonction, on pourra utiliser les coordonnées géographiques trouvées précédemment et les ré-injecter dans cette fonction.
Indice
Lire la documentation de l'API, section reverse, est recommandée !
Indice
Le endpoint pourra être mis en variable :
endpoint = 'https://data.geopf.fr/geocodage/reverse/
Indice
Derrière le endpoint, on ajoute la requête qui sera du type (latitude et longitude sont les paramètres de la fonction) :
?lon={longitude}&lat={latitude}
Question bonus
Améliorer votre fonction geocodage_inverse pour qu'elle nous renvoie : Tour Eiffel si on lui envoie ses coordonnées géographiques qui sont (2.294479, 48.858296).
Il faudra utilise le paramètre index pour cela ; sachant que POI veut dire Point Of Interest. Voir la documentation pour plus de détails.
Le résultat de l'appel de la fonction pour les coordonnées du lycée et de la Tour Eiffel pourrait être :
Partie 3 : Utilisations d'autres API
Nous allons utiliser d'autres API publiques. Les exercices ci-dessous sont faits pour apprendre à lire les documentations des API.
Question
Le serveur de streaming vidéo https://tube-sciences-technologies.apps.education.fr/ est une alternative à YouTube.
Après avoir trouvé le logiciel qui fait tourner ce portail et trouver la documentation de son API (API Rest Reference), programmez une fonction stats_instance() qui renvoie :
le nombre d'utilisateurs du serveur (également appelé instance),
le nombre de vidéos du serveur,
le nombre de commentaires sur ce serveur https://tube-sciences-technologies.apps.education.fr/
Au préalable, vous aurez trouvé le endpoint de l'API, dans la documentation référence de l'API.

ATTENTION, les informations demandées sont publiques, pas besoin de créer un compte ou téléchargement quelque chose !
Indice
Vous trouverez ces data dans la section stats (statistiques) de la documentation API du logiciel (API Rest Reference).
Vous pouvez comparer vos résultats avec la page À propos de l'instance.
Solution
Le endpoint suffira... https://tube-sciences-technologies.apps.education.fr/api/v1/server/stats
On peut trouver les informations dans la documentation de l'API : https://docs.joinpeertube.org/api-rest-reference.html#tag/Stats/operation/getInstanceStats
Question

À l'aide de la base de données OpenFoodFact, coder une fonction qui, en envoyant le code barre d'un produit, nous affiche la photo du produit...
Indice
Pour télécharger une image, vous pouvez utiliser le module requests en récupérant les données depuis une requête get, puis en stockant ces données (reponse.content) dans un fichier ouvert en mode write binary ('wb').
L'affichage de l'image se fera avec le module PIL de Python.
Question
Proposer, et rédiger, sur un support de votre choix, un exercice à destination d'un élève de Terminale NSI qui utilise une API Web de votre choix (autre que celles ci-dessus).
Vous vous efforcerez de rédiger des phrases construites et produirez également la correction.
