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 :

1
curl "https://api-adresse.data.gouv.fr/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
}

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

1
curl "https://api-adresse.data.gouv.fr/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://api-adresse.data.gouv.fr/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://api-adresse.data.gouv.fr/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 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 :

Au préalable, vous aurez trouvé le endpoint de l'API.

Mascotte SepiaInformations[2]

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

Logo Open Food FactsInformations[3]

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