TP API Web

Utilisation d’une API Web #

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 sonc être complétée par : `&appid=XXXXX` où `XXX` 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 :

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

Affichage pour débuguer #

Le module json permet d’afficher de manière lisible des données au format json :

import json
# supposons que obj soit un objet au format json 
print(json.dumps(obj,indent=2))
...

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)

Gestion des dates #

Le module datetime, qui doit être installé sur vos machines 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))

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

Travail à faire #

Prenez connaissance de la documentation et faites tous les tests proposés ci-dessus.

Pour tous #

É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/2014
Témpératures de 18.7°C à 27.8 °C
Humidité 70%
Prévision : heavy intensity rain

Dans votre rapport, mettez une copie d’écran obtenue à l’exécution du programme. Rendez le fichier python obtenu (appelez le simplement meteo.py)

Deux options #

Vous pouvez continuer à travail sur OpenWeatherMap ou bien trouver une autre API à exploiter (voir en fin de document). Dans les deux cas, il n’y a pas de question précise. Le site Web réalisé pourra :

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

En groupe OPTION 1 : Travail avec Openweathermap #

Le travail suivant est réalisé par 2 personnes. L’une s’occupe de récupérer les informations sur openweathermap : on l’appelle A. L’autre crée un service Web pour servir ces informations : on l’appelle B Dans toute la suite, mettez-vous d’accord très précisément sur ce que renvoient les fonctions écrites par A, de manière à ce que A et B puissent avancer en même temps.

B commencera donc directement la réalisation du serveur Web (dernière question). A réalisera les fonctions suivantes et fournira au fur et à mesure des modification son fichier à B qui réalise le serveur Web. En commentaire de chaque fonction, donnez l’URL de la page de doc de l’API que vous avez consultée. Ajoutez vos autres sources de documentation s’il y a lieu.

Si vous n’avez pas la possibilité d’obtenir des copies d’écran de l’application finale, faites des copies d’écran des tests que vous avez réalisé pour vérifier le bon fonctionnement de votre partie.

Programmeur A #

Écrivez une fonction qui renvoie la pression (en millibars), la vitesse du vent (en km/h), la température (en °C) actuelles (sous forme d’un tuple)

Il est possible de consulter un historique des relevés météo (un par heure). Écrivez une fonction qui renvoie un relevé des k derniers jours (vous pourrez choisir la valeur de k). Le relevé pourra être celui de température, de pression, ou d’humidité. Factorisez le code au maximum.

Openweathermap sert aussi des tuiles (morceaux de cartes) permettant de construire des cartes de température, de précipitations etc… On obtient ces tuiles de la même manière que les tuiles OpenStreetMap. Au niveau de zoom 5, la France est couverte par 5 tuiles de 256x256:

  • SERVER/5/15/10.png
  • SERVER/6/10.png
  • SERVER/5/15/11.png
  • SERVER/5/16/11.png

Si SERVER = http://a.tile.openstreetmap.org, on obtient les cartes géographiques openstreetmap, et si SERVER = http://a.tile.openweathermap.org/map/temp, on obtient la cartes des températures.

En utilisant requests (r = requests.get(...)), on obtient dans r.content les données binaires récupérées (image). Ces données peuvent être utilisées pour obtenir ensuite l’image sous une forme ou une autre (c’est par exemple possible avec le module imageio). Les moyens à disposition pour gérer les images sont disponibles ici : Travailler avec des images en Python

Attention à l’usage que vous faites du serveur de tuiles OpenStreetmap : http://wiki.openstreetmap.org/wiki/Tile_usage_policy. Vous pouvez éventuellement utiliser un serveur alternatif.

Programmeur B #

Intégrez le tout dans une page Web servie par bottle. L’utilisateur pourra entrer le nom d’une ville et on lui affichera l’intégralité des informations récupérées ci-dessus.

Statistiques météo #

À partir d’une latitude et d’une longitude, vous pouvez réaliser des statistiques indiquant, par mois, la pluviométrie moyenne de chaque mois (sur les 5 dernières années par exemple). Réalisez un service Web qui automatise cette tâche.

En groupe : OPTION 2 : Utiliser une autre API #

Vous pouvez utiliser une autre API. Une liste (non exhaustive) de possibilités est donnée à la fin de cette page.

L’objectif est :

  • D’apprendre à utiliser une API : Récupérer les infos et les rendre manipulables (programmeur A)
  • De développer un serveur Web (avec Python et bottle) qui sert les informations récupérées ci-dessus (programmeur B)
  • Être capable de travailler à 2 simultanément sur un projet