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.
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://api-adresse.data.gouv.fr/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
}
La signification de tous les champs est expliquée dans la documentation de l'API.
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 format document).
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. À partir de la documentation, filtrer avec le code postal du lycée (69001). Et donner la réponse obtenue.
Solution
curl "https://api-adresse.data.gouv.fr/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://api-adresse.data.gouv.fr/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://api-adresse.data.gouv.fr/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
data
est 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 en question est recommandée !
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, 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.

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