Utiliser l’API météo de Google

Pour un de mes sites perso sur les villes de France, j’utilisais le webservice météo fourni par The Weather Channel mais quelques temps celui-ci est devenu payant j’ai donc dû trouver une solution alternative. Apres un peu de recherche à droite et à gauche j’ai trouvé un webservice peu connu et peu documenté fourni par Google correspondant bien à mes besoins.

L’utilisation de ce service est plutot simple, il suffit d’interroger la bonne url  pour obtenir la météo sous la forme d’un fichier xml.

L’url à utiliser est de la forme : http://www.google.com/ig/api?weather=paris, france&hl=fr

Il y a deux paramètres interessants :

  • weather : le lieu pour lequel on souhaite obtenir la météo
  • hl : la langue dans laquelle on veut les résultats
Il n’y a ici rien de très compliqué, voici une classe qui interroge ce service et qui renvoie les données sous la forme d’un tableau.

 

class Meteo
{
	private $base = "http://www.google.com/ig/api",
			$lang = "fr";
 
	public function get($location)
	{
		$weather = array();
 
		$data = utf8_encode(file_get_contents($this->base."?weather=".urlencode($location)."&hl=".$this->lang));
		$xml = simplexml_load_string($data);
 
		if(!isset($xml->weather->problem_cause))
		{
			// City
			$weather["city"] = (string)$xml->weather->forecast_information->city->attributes()->data;
 
			// Current conditions
			$weather["current"]["condition"] = (string)$xml->weather->current_conditions->condition->attributes()->data;
			$weather["current"]["temp_f"] = (string)$xml->weather->current_conditions->temp_f->attributes()->data;
			$weather["current"]["temp_c"] = (string)$xml->weather->current_conditions->temp_c->attributes()->data;
			$weather["current"]["humidity"] = (string)$xml->weather->current_conditions->humidity->attributes()->data;
			$weather["current"]["icon"] = (string)$xml->weather->current_conditions->icon->attributes()->data;
			$weather["current"]["wind_condition"] = (string)$xml->weather->current_conditions->wind_condition->attributes()->data;
 
			$icon = explode("/", $weather["current"]["icon"]);
			$weather["current"]["icon"] = $icon[count($icon)-1];
 
			// Forecast conditions
			$weather["forecast"] = array();
			foreach($xml->weather->forecast_conditions as $forecast)
			{
				$f = array();
				$f["day_of_week"] = (string)$forecast->day_of_week->attributes()->data;
				$f["low"] = (string)$forecast->low->attributes()->data;
				$f["high"] = (string)$forecast->high->attributes()->data;
				$f["icon"] = (string)$forecast->icon->attributes()->data;
				$f["condition"] = (string)$forecast->condition->attributes()->data;
 
				$icon = explode("/", $f["icon"]);
				$f["icon"] = $icon[count($icon)-1];
 
				$weather["forecast"][] = $f;
			}
		}
 
		return $weather;
	}
}

Read 13 comments

  1. Bonjour,

    Ayant moi-même mis ça en place sur un site, je recommande fortement de mettre les résultats en cache car Google peut blacklister les sites qui en font une utilisation trop intensive. Cette limite ne se trouve dans aucune doc (vu que le webservice n’est pas documenté) et est donc assez embêtante à débugguer.

    Du coup, j’ai résolu ces problèmes (et amélioré les performances de l’appli) en mettant en cache chaque valeur de retour en fonction de l’url appelée.

    Pierre.

  2. Pour palier à l’arrêt de l’API météo de Google, nous avons commencé à développer une version de substitution reprenant la syntaxe de celle de Google :

    http://api.previmeteo.com/YOUR_API_KEY/ig/api?weather=Paris,France&hl=fr

    nous contacter pour avoir YOUR_API_KEY

    Conditions d’utilisation : gratuit pour les projets perso et non commerciaux avec un « fairuse » de moins de 200 accès quotidiens. Au-delà, nous demander sur http://www.previmeteo.com rubrique à propos, contactez-nous…

  3. Bonjour,

    L’API ne fonctionne plus chez moi non plus…
    J’ai cherché d’autres API mais le résultat n’est pas fabuleux pour moi. La solution pour laquelle j’ai opté, c’est le widget météo : http://www.my-meteo.fr/meteo+webmaster.html

    C’est loin d’être parfait, mais avec les possibilités de personnalisation, on s’en sort. Moi qui suit nul en design, cela me convient et cela m’éviter de jouer avec des CSS à tout va…

    Sandrine.

Laisser un commentaire