Mit Wetterdaten arbeiten: wetter.com API
Wie bereits im Artikel gestern über die Google Weather API angekündigt hier die Umsetzung einer wetter.com API Anbindung. Die API von wetter.com ist gut dokumentiert (wenn auch nicht vollständig) im Gegensatz zur Google API, es gibt klare Nutzungsbedingungen wann und in welchem Umfang sie genutzt werden kann.
Nachteile der wetter.com API sind:
– Man stimmt mit der Registrierung zu, Werbung per Email zu erhalten
– Man muss (in der kostenlosen Variante) zwei der drei folgenden Dinge tun: Link zu wetter.com, Grafik von wetter.com oder der Text “powered by wetter.com”
– Die Abfragen sind auf 10.000 pro Monat beschränkt. Dies kann auf gut besuchten Seiten, wenn jeder Benutzer sein persönliches Wetter bestaunen können soll zu wenig sein. Dann muss man Kontakt aufnehmen (und wahrscheinlich zahlen).
Um die wetter.com API nutzen zu können wird ein kostenloser Account benötigt, mit dem man auch direkt ein Projekt anlegt. Nach der Registrierung habe ich das Projekt “phpgangstatest” angelegt und erhalte dann einen API-Key.
Dann ändere ich noch in den Projekteinstellungen die Felder, die ich bei einer Suchanfrage bzw. einer Vorhersage zurückgeliefert haben möchte, wie folgt:
Als Rückgabeformat bietet die API sowohl XML als auch JSON. Da ich JSON bevorzuge habe ich dieses Format gewählt.
Wie genau sich die Anfrage zusammensetzt steht in der API-Dokumentation, daher möchte ich das hier nicht nachplappern, sondern zeige direkt meine kleine Klasse:
<?php class Widget_WeatherCom { private $_url = 'http://api.wetter.com'; private $_projectName; private $_apiKey; public function __construct($projectName, $apiKey) { $this->_projectName = $projectName; $this->_apiKey = $apiKey; } // return first result if there are more than one public function search($search) { // if it's a number, it's a postcode if (is_numeric($search)) { $checksum = md5($this->_projectName.$this->_apiKey.$search); $url = $this->_url.'/location/plz/search/'.$search.'/project/'.$this->_projectName.'/cs/'.$checksum.'/output/json'; } else { $checksum = md5($this->_projectName.$this->_apiKey.$search); $url = $this->_url.'/location/index/search/'.$search.'/project/'.$this->_projectName.'/cs/'.$checksum.'/output/json'; } $api = json_decode(file_get_contents($url), true); return $api['search']['result'][0]['city_code']; } public function getForecast($cityCode) { $checksum = md5($this->_projectName.$this->_apiKey.$cityCode); $url = $this->_url.'/forecast/weather/city/'.$cityCode.'/project/'.$this->_projectName.'/cs/'.$checksum.'/output/json'; $api = json_decode(file_get_contents($url), true); return $api['city']; } } $myWeather = new Widget_WeatherCom('phpgangstatest', 'xxxxxxxxxx'); $searchResult = $myWeather->search(59302); $weatherInformation = $myWeather->getForecast($searchResult); var_dump($weatherInformation);
Eine Suche nach 59302 ergibt:
$searchResult = $myWeather->search(59302);
Meine search() Funktion gibt der Einfachkeit halber nur das erste Ergebnis zurück. Natürlich kann man dies noch ändern im Falle von mehreren Suchergebnissen und alle Ergebnisse dem Benutzer präsentieren, damit er den entsprechend korrekten City-Code auswählen kann. Mit diesem City-Code können wir dann eine Anfrage an die Forecast-URL stellen:
$weatherInformation = $myWeather->getForecast($searchResult);
Wie man erkennen kann erhalten wir mehrere Werte pro Tag, nämlich 4 Werte (6:00, 11:00, 17:00, 23:00) für die nächsten 3 Tage (hinter den Punkten verstecken sich jeweils nochmal Werte für p, w, pc, wd etc.). Wofür genau die jeweiligen Buchstaben stehen sieht man in den Projekteinstellungen bzw. oben auf dem Bild.
Die wetter.com API ist mit der separaten Suche etwas flexibler. Man erhält mit den Daten für morgens, mittags, abends und nachts sowie Windgeschwindigkeit, Windrichtung und Regenwahrscheinlichkeit genauere Daten also bei Google, jedoch werden die meisten nur einen Wert pro Tag darstellen wollen nehme ich an. Des weiteren ist die API dokumentiert, was einem die Arbeit erleichtert, und die Nutzungsbedingungen sind klar definiert, wenn auch es dadurch einige Haken gibt, mit denen man leben muss. Sie ist aber auf jeden Fall einen Blick wert wenn man sich mit Wettervorhersagen und Wetterdaten beschäftigen möchte.
PS: Ich habe in diesem Demonstrations-Code die Fehlerabfragen weggelassen. Man sollte darauf reagieren können wenn der Dienst mal nicht erreichbar ist oder die Suche kein Ergebnis liefert. Des weiteren gilt auch hier: Die Ergebnisse sollten gecacht werden, um den Dienst zu schonen. Eine Suche wird innerhalb eines Tages natürlich das selbe Ergebnis liefern, und auch eine Abfrage pro City-URL reicht pro Tag, es kommt immer die selbe Antwort von der API.