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 :

1
curl "https://data.geopf.fr/geocodage/search/?q=41+cours+general+giraud" 

Le retour de la commande est un dictionnaire au format .json[1] que voici :

1
{
2
    "type": "FeatureCollection",
3
    "version": "draft",
4
    "features": [
5
        {
6
            "type": "Feature",
7
            "geometry": {
8
                "type": "Point",
9
                "coordinates": [
10
                    4.822378,
11
                    45.769356
12
                ]
13
            },
14
            "properties": {
15
                "label": "41 Cours Général Giraud 69001 Lyon",
16
                "score": 0.9666027272727272,
17
                "housenumber": "41",
18
                "id": "69381_3130_00041",
19
                "name": "41 Cours Général Giraud",
20
                "postcode": "69001",
21
                "citycode": "69381",
22
                "x": 841617.76,
23
                "y": 6520495.01,
24
                "city": "Lyon",
25
                "district": "Lyon 1er Arrondissement",
26
                "context": "69, Rhône, Auvergne-Rhône-Alpes",
27
                "type": "housenumber",
28
                "importance": 0.63263,
29
                "street": "Cours Général Giraud"
30
            }
31
        },
32
        {
33
            "type": "Feature",
34
            "geometry": {
35
                "type": "Point",
36
                "coordinates": [
37
                    4.857804,
38
                    46.794903
39
                ]
40
            },
41
            "properties": {
42
                "label": "41 Rue Général Giraud 71100 Chalon-sur-Saône",
43
                "score": 0.5688992307692308,
44
                "housenumber": "41",
45
                "id": "71076_3140_00041",
46
                "name": "41 Rue Général Giraud",
47
                "postcode": "71100",
48
                "citycode": "71076",
49
                "x": 841690.89,
50
                "y": 6634418.5,
51
                "city": "Chalon-sur-Saône",
52
                "context": "71, Saône-et-Loire, Bourgogne-Franche-Comté",
53
                "type": "housenumber",
54
                "importance": 0.71943,
55
                "street": "Rue Général Giraud"
56
            }
57
        },
58
        {
59
            "type": "Feature",
60
            "geometry": {
61
                "type": "Point",
62
                "coordinates": [
63
                    0.168407,
64
                    49.511065
65
                ]
66
            },
67
            "properties": {
68
                "label": "Rue Général Giraud 76610 Le Havre",
69
                "score": 0.5206972727272728,
70
                "id": "76351_3425",
71
                "name": "Rue Général Giraud",
72
                "postcode": "76610",
73
                "citycode": "76351",
74
                "x": 494889.87,
75
                "y": 6938314.66,
76
                "city": "Le Havre",
77
                "context": "76, Seine-Maritime, Normandie",
78
                "type": "street",
79
                "importance": 0.68767,
80
                "street": "Rue Général Giraud"
81
            }
82
        },
83
        {
84
            "type": "Feature",
85
            "geometry": {
86
                "type": "Point",
87
                "coordinates": [
88
                    -0.360194,
89
                    49.180507
90
                ]
91
            },
92
            "properties": {
93
                "label": "Rue Général Giraud 14000 Caen",
94
                "score": 0.5206472727272727,
95
                "id": "14118_3410",
96
                "name": "Rue Général Giraud",
97
                "postcode": "14000",
98
                "citycode": "14118",
99
                "x": 455056.84,
100
                "y": 6903075.07,
101
                "city": "Caen",
102
                "context": "14, Calvados, Normandie",
103
                "type": "street",
104
                "importance": 0.68712,
105
                "street": "Rue Général Giraud"
106
            }
107
        },
108
        {
109
            "type": "Feature",
110
            "geometry": {
111
                "type": "Point",
112
                "coordinates": [
113
                    2.46031,
114
                    48.942095
115
                ]
116
            },
117
            "properties": {
118
                "label": "41 Rue du Général Giraud 93150 Le Blanc-Mesnil",
119
                "score": 0.5191079310344827,
120
                "housenumber": "41",
121
                "id": "93007_1040_00041",
122
                "name": "41 Rue du Général Giraud",
123
                "postcode": "93150",
124
                "citycode": "93007",
125
                "x": 660466.21,
126
                "y": 6871482.38,
127
                "city": "Le Blanc-Mesnil",
128
                "context": "93, Seine-Saint-Denis, Île-de-France",
129
                "type": "housenumber",
130
                "importance": 0.74467,
131
                "street": "Rue du Général Giraud"
132
            }
133
        }
134
    ],
135
    "attribution": "BAN",
136
    "licence": "ETALAB-2.0",
137
    "query": "41 cours general giraud",
138
    "limit": 5
139
}

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

1
curl "https://data.geopf.fr/geocodage/search/?q=41+cours+general+giraud&postcode=69001"
1
{
2
    "type": "FeatureCollection",
3
    "version": "draft",
4
    "features": [
5
        {
6
            "type": "Feature",
7
            "geometry": {
8
                "type": "Point",
9
                "coordinates": [
10
                    4.822378,
11
                    45.769356
12
                ]
13
            },
14
            "properties": {
15
                "label": "41 Cours Général Giraud 69001 Lyon",
16
                "score": 0.9666027272727272,
17
                "housenumber": "41",
18
                "id": "69381_3130_00041",
19
                "name": "41 Cours Général Giraud",
20
                "postcode": "69001",
21
                "citycode": "69381",
22
                "x": 841617.76,
23
                "y": 6520495.01,
24
                "city": "Lyon",
25
                "district": "Lyon 1er Arrondissement",
26
                "context": "69, Rhône, Auvergne-Rhône-Alpes",
27
                "type": "housenumber",
28
                "importance": 0.63263,
29
                "street": "Cours Général Giraud"
30
            }
31
        }
32
    ],
33
    "attribution": "BAN",
34
    "licence": "ETALAB-2.0",
35
    "query": "41 cours general giraud",
36
    "filters": {
37
        "postcode": "69001"
38
    },
39
    "limit": 5
40
}

Partie 2 : Utilisation d'une API avec Python

Voici un code Python permettant l'interrogation de l'API :

1
import requests
2
url = "https://data.geopf.fr/geocodage/search/?q=41+cours+general+giraud&postcode=69001"
3
reponse = requests.get(url)
4
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

1
def interrogation_BAN(adresse, code_postal):
2
    url = f"https://data.geopf.fr/geocodage/search/?q={adresse}&postcode={code_postal}"
3
    reponse = requests.get(url)
4
    data = reponse.json()
5
    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 (indice 0) é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 :

1
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) :

1
?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 :

Fenêtre du résultat de l'appel de la fonctionInformations[2]

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 :

Au préalable, vous aurez trouvé le endpoint de l'API, dans la documentation référence de l'API.

Mascotte SepiaInformations[3]

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

Logo Open Food FactsInformations[4]

À 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

Vous pouvez utiliser le json de démonstration pour vous aider à trouver l'information...

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.