TP API Web

Utilisation d’une API Web / Appli serveur #

Prérequis #

À la fin du TP , vous devez rendre un rapport au format PDF, ainsi que 2 fichiers Python (nommés comme indiqué dans le sujet).
Depuis 2015, utiliser openweathermap nécessite de s’enregistrer. On s’authentifie ensuite en utilisant une clé. Chaque requête doit donc être complétée par : &appid=XXXXXXXX est la valeur de la clé à utiliser. Cette clé est disponible sur Updago.

Nous allons utiliser le service OpenWeatherMap pour récolter des prévisions météo. Ces prévisions pourront être resservies par un site Web, par exemple.

Le site http://openweathermap.org propose une API pour récolter les informations qu’il diffuse.

Prendre connaissance des possibilités de l’API #

La page de documentation de l’API est accessible ici : http://openweathermap.org/api

Voici quelques exemples :

http://api.openweathermap.org/data/2.5/weather?q=Poitiers,fr&appid=XXX
Remplacez XXX par la clé API. DAns la suite, pensez à ajouter le champ appid=XXX.

La commande weather employée ici indique que nous souhaitons obtenir les conditions météo actuelles.

Le résultat est par défaut fourni au format json. Dans le cas de la commande weather, voici les informations qui sont obtenues : Weather Data

Il y a bien sûr d’autres commandes disponibles, qu’on trouvera dans la documentation. Notez en particulier la commande forecast qui permet d’obtenir des prévisions.

Outils Python #

Accès à l’API #

Comme indiqué dans le cours, nous allons utiliser Python pour interroger openweathermap. Le module requests sera utilisé à la place d’urllib :

(pensez à mettre la clé API)

import requests
r = requests.get("http://api.openweathermap.org/data/2.5/weather?q=Poitiers,fr&appid=XXX")
data=r.json()
print(data)

On récupère dans data un dictionnaire.

Affichage pour débuguer #

Une fois les données transformées en dictionnaire (data = r.json()), le dictionnaire peut être affiché proprement avec le module pprint :

from pprint import pprint
pprint(data)
{'base': 'stations',
 'clouds': {'all': 58},
 'cod': 200,
 'coord': {'lat': 46.5833, 'lon': 0.3333},
 'dt': 1615484983,
 'id': 2986494,
 'main': {'feels_like': 278.39,
          'humidity': 81,
          'pressure': 1015,
          'temp': 283.38,
          'temp_max': 283.71,
          'temp_min': 283.15},
 'name': 'Arrondissement de Poitiers',
 'sys': {'country': 'FR',
         'id': 6460,
         'sunrise': 1615443558,
         'sunset': 1615485493,
         'type': 1},
 'timezone': 3600,
 'visibility': 10000,
 'weather': [{'description': 'broken clouds',
              'icon': '04d',
              'id': 803,
              'main': 'Clouds'}],
 'wind': {'deg': 240, 'speed': 6.17}}

Gestion des dates #

Le module datetime permet de manipuler les dates et les heures. En particulier, il permet de convertir un timestamp en date :

import datetime
ts = 1402484400
print(datetime.datetime.fromtimestamp(ts))

Toujours dans le module datetime, la méthode datetime.datetime.now() renvoie la date (et l’heure actuelle). On peut aussi construire une date comme ceci :

d = datetime.datetime(year=2014, month=6,day=10, hour=11, minute=20)

Une date, obtenue ainsi ou avec now() peut être transformée en timestamp :

print(d.timestamp())

Serveur Web #

Le serveur Web (voir plus loin) sera réalisé avec Bottle. D’éventuels graphiques peuvent être intégrés avec highcharts, mais tout autre moyen (utilisation d’un service en ligne ?) peut être envisagé.

Avant de continuer, prenez connaissance de la documentation et faites tous les tests proposés ci-dessus.

Première partie : tests de l’API Openweathermap #

Écrivez un programme Python qui, si on le lance, affiche les prévisions pour le lendemain. La prévision devra être correctement formatée et contenir au moins des indications de température, d’humidité, ainsi que la date. Par exemple :

Poitiers
Prévision pour le 12/06/2021
Témpératures de 18.7°C à 27.8 °C
Humidité 70%
Description : heavy intensity rain
Vitesse du vent : 6.2 km/h
Pour formater correctement la date, utilisez datetime.datetime.strftime()
Pour avoir la température dans la bonne unité, il faut ajouter un paramètre dans la requête. L’information est dans la documentation de l’API mentionnée plus haut.
Dans votre rapport, mettez une copie d’écran obtenue à l’exécution du programme. Rendez le fichier python obtenu (appelez le simplement meteo.py)

Seconde partie : utilisation d’une API et site Web #

Le reste du travail s’effectue en binôme. La bonne collaboration des membres du binôme fait partie de travail de TP.

On indique dans la suite quelques pistes de travail, puis un découpage possible du travail au sein du binôme.

Idée générale #

Votre objectif est d’exploiter un API Web. Peu importe laquelle, mais il faut en trouver une suffisamment riche pour produire un travail assez conséquent. Une liste d’API Web est donnée plus loin, mais vous pouvez tout à fait en trouver d’autres.

En parallèle de l’exploitation de l’API, vous créerez un service Web qui ressert, sous une forme modifiée, les données auxquelles vous avez accès via l’API.

Exemples :

  • Vous faites un site Web qui permet à l’utilisateur d’entrer une ville ou bien une position avec la latitude et la longitude, puis vous affichez la météo du jour à cet endroit. Vous pouvez ajouter un fond de carte, des icônes etc…

  • Vous faites un site Web qui demande le nom d’un.e acteur.rice, puis affiche la liste des jaquettes des films dans lesquels l’acteur.rice a joué, ainsi que la liste des acteur.rice.e avec lesquels il.elle a tourné. Vous pouvez utiliser l’API de themoviedb.

Le site Web réalisé pourra :

  • contenir de formulaires
  • contenir des images
  • utiliser des feuilles de style
  • contenir des cartes (pour la météo par ex.)
  • tracer des courbes (voir par exemple Highcharts)

Les objectifs sont :

  • d’apprendre à utiliser une API : récupérer les infos et les rendre manipulables
  • de développer un serveur Web (avec Python et bottle) qui sert les informations récupérées avec l’API
  • être capable de travailler à 2 simultanément sur un projet

Partage des tâches #

Toutes les fonctions relatives à l’exploitation de l’API devront être dans un module séparé du serveur. Le serveur Web fera appel aux fonctions de ce module, et n’utilisera jamais l’API directement.

Un des deux membres du binôme sera en charge du serveur. L’autre sera en charge du développement du module contenant les fonctions d’exploitation de l’API. Il faudra donc que les deux membres du binôme se mettent d’accord sur l’interface du module.

Pour reprendre l’exemple de la météo, si la page Web affiche la température et la pression, elle fera appel à une fonction, par exemple get_weather_data qui exploitera l’API d’openweathermap. Mais en aucun cas la fonction get_weather_data ne devra renvoyer le json d’openweathermap. Elle devra traiter elle-même le json et renvoyer son résultat, par exemple (21, 1020) (température et pression) dans un format indépendant de l’API exploitée.

Dans un premier temps vous vous focaliserez sur les fonctionnalités du serveur, en laissant de côté l’esthétique du site.

Une fois toutes les fonctionnalités implémentées, côté API, les deux membres du binôme pourront travailler sur le serveur Web, en ses partageant les tâches ainsi par exemple : une personne sur la programmation du serveur lui-même, l’autre sur l’écriture des feuilles de style.

Le fichier principal du serveur devra être nommé serveur.py.

Exemples d’API WEB #

Une liste (non exhaustive) de possibilités est donnée à la fin de cette page.