E vremea să aflăm vremea


Pentru iGoogle, unde are un gadget cu vremea, Google foloseşte un API nedocumentat. Evident că pasionaţii de săpat în cod au aflat de el şi drept urmare îl poate folosi oricine. Pentru moment Google insistă că e de uz intern, dar la un moment dat eu cred că va deveni serviciu public. Cam aceasta este deci situaţia cu Google Weather API, despre care nu puteţi afla nimic oficial dar pe care vom vedea în continuare cum îl putem fructifica pentru a afişa în situl nostru informaţii meteo. Poate că v-aţi săturat de widget-uri meteo şi doriţi să inseraţi chiar Dvs partea cu vremea, în locul dorit, cu aspectul dorit…

Pentru partea de HTML vă puteţi uita în sursa paginii demonstrative. Eu mă voi limita la explicaţiile PHP. Mai întâi luăm localitatea din formular (dacă nu este, punem implicit una). Apoi ajungem la API-ul pentru vreme. După cum vedeţi îi dăm localitatea şi merge! Opţional putem pune hl=ro pentru română, dar fiţi pregătiţi pentru bătăi de cap în acest caz. Singura soluţie ca să meargă prelucrarea datelor ca XML a fost să pun encoding ca mai jos, cu replace-ul din linia 7. (Pentru engleză nu e nevoie de aşa ceva.) Având XML-ul am populat trei variabile cu informaţiile generice (information), despre ziua de azi (current) şi despre zilele următoare (forecast). Nu a mai rămas decât să le parcurg. Ca să vedeţi XML-ul complet, vedeţi sursa acestei pagini.

[PHP]if(isset($_POST[‘localitate’]))
$localitate=$_POST[‘localitate’];
else
$localitate="Cluj Napoca";
$continut = file_get_contents(‘http://www.google.com/ig/api?weather=’.str_replace(" ","+",$localitate).’&hl=ro’);
if(stripos($continut,"este momentan")===false){
$continut=str_replace(‘<?xml version="1.0"?>’, ‘<?xml version="1.0" encoding="ISO-8859-2"?>’,$continut);
$continut=strtolower($continut);
$xml = simplexml_load_string($continut);
$information = $xml->xpath("/xml_api_reply/weather/forecast_information");
$current = $xml->xpath("/xml_api_reply/weather/current_conditions");
$forecast_list = $xml->xpath("/xml_api_reply/weather/forecast_conditions");
echo ‘<table width=690 cellpadding=15 cellspacing=0><tr><td colspan=3>’;
echo "<h1>Vremea în $localitate</h1>";
echo "<img src=’http://www.google.com".$current[0]->icon[‘data’]."’ alt=’weather’ align=left vspace=20 hspace=20>";
echo "Temperatura: ".$current[0]->temp_c[‘data’]."&deg;C<br>";
echo "Starea vremii: ".$current[0]->condition[‘data’]."<br>";
echo "".ucfirst($current[0]->humidity[‘data’])."<br>";
echo "</td><td rowspan=3><img src=’http://maps.google.com/maps/api/staticmap?center=".str_replace(" ","+",$localitate)."&zoom=9&size=350×500&sensor=false’ align=’right’></td>";
echo "</tr><tr>";
$i=0;
foreach ($forecast_list as $forecast){
echo "<td><strong>".ucfirst($forecast->day_of_week[‘data’])."</strong><br>";
echo "<img src=’http://www.google.com".$forecast->icon[‘data’]."’ alt=’weather’><br>";
echo "Minima: ".$forecast->low[‘data’]." &deg;C<br>Maxima: ".$forecast->high[‘data’]." &deg;C<br>";
echo "Prognoză:<br>".$forecast->condition[‘data’];
echo "</td>";
if(++$i==2)
echo "</tr><tr>";
}
echo ‘</tr></table>’;
}
else
echo "<font color=#cc0000>Nu există date meteo pentru $localitate.</font>";[/PHP]

Iar acum iată spre demonstraţie ce face codul de mai sus. Buguri cunoscute: dacă scrieţi Braşov sau Iaşi (deci cu diacritce) va merge. Dacă scrieţi Bucureşti sau Bacău nu va merge (de ce? habar nu am!). Dacă scrieţi Bucuresti sau Bucharest sau London (nu Londra) sau Berlin sau altele… va merge aproape mereu :) .

Codul e scris didatic. Profesionist ar fi cu un cache pentru datele meteo, că nu se schimbă de la minut la minut 😉 . Şi alte schimbări pe ici pe colo.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (4 evaluări, media: 5,00 din 5)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *