El servicio de Yahoo para el Clima Yahoo Weather tiene un API mediante el cual se puede consultar el estado del clima y devuelve los resultados en formato RSS (Yahoo! Weather RSS feed). Entonces basado en esta información crearemos un reporte del clima personalizado.
Obteniendo el RSS
Lo primero es obtener el URL con el RSS de acuerdo a la ciudad para la que deseamos consultar el clima, para ello ingresamos a Yahoo Weather, buscamos la ciudad deseada y observamos en la barra de direcciones el código de la ciudad. Por ejemplo si buscamos lima la ruta sería de la forma:
-
http://weather.yahoo.com/forecast/PEXX0011.html
Luego, el código de la ciudad es PEXX0011, luego de acuerdo a las especificaciones del API, el URL del RSS sería de la forma:
-
http://weather.yahooapis.com/forecastrss?u=c&p=PEXX0011
Utilizando SimplePie
Ahora que tenemos la información en RSS, utilizaremos SimplePie para interpretar los datos, adicionalmente utilizaremos un plugin para SimplePie llamado Yahoo! Weather el cual nos permite tener métodos para obtener los detalles del clima proveídos por Yahoo.
Entonces utilizando estos nuevos métodos obtenemos fácilmente los datos del clima directamente para nuestra aplicación. Lo primero es crear una nueva instancia del Feed y tomar el primer item que contiene los datos del clima.
-
require("simplepie.inc");
-
require("simplepie_yahoo_weather.inc");
-
-
$code = "PEXX0011";
-
$path = "http://weather.yahooapis.com/forecastrss?u=c&p=";
-
$feed = new SimplePie();
-
$feed->set_feed_url($path.$code);
-
$feed->set_item_class('SimplePie_Item_YWeather');
-
$feed->init();
-
$weather = $feed->get_item(0);
Luego de ello en la variable $weather, tenemos los datos necesarios, los cuales vamos a imprimir en nuestro html como en el siguiente código, en donde get_condition_image obtiene la imagen del clima y get_temperature la temperatura actual.
-
<img src="<?php echo $weather->get_condition_image(); ?>">
-
<ul>
-
<li>Condicion: <?php echo $weather->get_condition(); ?></li>
-
<li>Temp: <?php echo $weather->get_temperature(); ?>°C</li>
-
<li>Humedad: <?php echo $weather->get_humidity(); ?>%</li>
-
<li>Rising: <?php echo $weather->get_rising(); ?>%</li>
-
<li>Sunrise: <?php echo $weather->get_sunrise(); ?></li>
-
<li>Sunset: <?php echo $weather->get_sunset(); ?></li>
-
</ul>
Uniendo estos dos elementos y una pequeña hoja de estilos podemos obtener nuestra primera versión del pronostico del tiempo el cual pueden ver en: weather/basic.php.
Personalizando el Reporte del Clima
En el caso anterior, solo depende de nuestra creatividad para mostrar los datos del clima, en nuestro caso vamos a mostrar los datos del clima utilizando los iconos de acuerdo a la hora del día o la noche, para ello hacemos los cálculos necesarios para obtener el valor del día o la noche.
-
require("simplepie.inc");
-
require("simplepie_yahoo_weather.inc");
-
-
$code = "PEXX0011";
-
$path = "http://weather.yahooapis.com/forecastrss?u=c&p=";
-
-
$feed = new SimplePie();
-
$feed->set_feed_url($path.$code);
-
$feed->set_item_class('SimplePie_Item_YWeather');
-
$feed->init();
-
-
function time2minuts($time) {
-
$minuts = 0;
-
$minuts = 12*60;
-
}
-
$minuts = $minuts + (int)$ttime[0]*60 + (int)$ttime[1];
-
return $minuts;
-
}
-
-
$weather = $feed->get_item(0);
-
$fore = $weather->get_forecasts();
-
$unit = $weather->get_units_temp();
-
$ampm = "n"; // indica noche
-
$icon = $weather->get_condition_code();
-
// Calculamos la hora de Lima en minutos
-
$iniday = time2minuts($weather->get_sunrise());
-
$endday = time2minuts($weather->get_sunset());
-
-
if ($curday> $iniday && $curday <$endday ) {
-
$ampm = "d"; // indica dia
-
}
Luego mostramos estos resultados en nuestro HTML, esto lo hacemos de la siguiente forma:
-
<div id="weather" style="background:url('icon<?php echo $ampm; ?>.png')">
-
<div id="current" style="background:url('http://l.yimg.com/us.yimg.com/i/us/nws/weather/gr/<?php echo $icon.$ampm.".png"; ?>')">
-
<div id="temp"><?php echo $weather->get_temperature(); ?>°<?php echo $unit; ?></div>
-
<div id="fore"><?php echo $fore[0]->get_low()."°".$unit; ?> - <?php echo $fore[0]->get_high()."°".$unit; ?></div>
-
<div id="city"><?php echo $weather->get_city().", ".$weather->get_country(); ?></div>
-
</div>
-
</div>
Con lo cual obtenemos el resultado mostrado en weather/index.php en donde mostramos el icono del estado del clima de acuerdo a la hora del día, además de muestra la temperatura actual y el máximo y mínimo.
Posts Relacionados


Comentarios Total 56 comentarios
Publicado: 06/10/2008 2:17 pm
Buenísimo, muchas gracias. Hace tiempo que me había elaborado un decodificador de METAR para mostrar el clima, pero esta está mucho mejor.
Publicado: 07/10/2008 12:18 pm
Muy buen tutorial :) Yo ya había hecho una clase que hacía esto mismo, hasta la había publicado en mi blog xD http://turl.bloglivers.com/2008/07/03/weatherfetcher-el-clima-en-php/
Lo único era que le faltaba mostrar el clima de alguna forma, tu lo haz terminado muy bien con ese HTML y la imagen ;)
Un Saludo!
Publicado: 11/10/2008 5:58 am
Buenísima aplicación, muchas gracias.
Un cordial saludo desde Galicia, España ;)
Publicado: 14/10/2008 3:49 am
gran aporte, gracias
Publicado: 21/10/2008 10:03 am
El script esta perfecto. Muy bueno pero tiene un problema.
El tema de yahoo el id del pais.
Estaria bueno conseguir dependiendo de la ip de la visita la ubicacion del pais .
No se si existe en las apis de yahoo para determinar el id del pais .
Saludos y muy buen script
Publicado: 21/10/2008 5:19 pm
La verdad que te pasaste!!! Necesito un favor: como se modificaria el codigo para que las imagenes de noche y dia se modifiquen segun la hora de córdoba, argentina? Perdon mi ignorancia…Gracias! Saludos!
Publicado: 21/10/2008 5:27 pm
woo que padre tutorial, lo antes posible lo voy a provar para poderlo implementar
Publicado: 25/10/2008 1:04 am
Muchas gracias por compartir tus conocimientos, muy bueno el tutorial y la implementacion de las librerias.
Tengo una duda con respecto a la transparencia de las imagenes de los resultados del clima en internet explorer 6… ¿Se podrá solucionar? La verdad es que no conozco mucho de php, ojala me puedas orientar para resolverlo.
Saludos!
JRC.
Publicado: 27/10/2008 10:11 pm
Hola, respecto a los PNGs tranparentes en IE6 puedes leer la forma de resolverlo en: http://blog.unijimpe.net/png-fix-para-ie6/
Publicado: 03/11/2008 9:43 pm
Gran Tutorial. Sólo quiero saber cómo este sitio http://www.philtvguide.com poder llevar a cabo múltiples varias ciudades en una página (www.philtvguide.com/philippines-weather/)
Publicado: 25/11/2008 4:56 pm
Hola, pusé el código en una web con algunas variaciones del tamaña de las imágenes, se bien en Firefox-Opera pero en IE6 no se ve. ¿cual puede ser el problema?
En http://www.ilovelasgrutas.com.ar lo puedes ver.
Muy buenos y útiles tus aportes.
De antemano, muchas gracias.
Publicado: 25/01/2009 10:26 pm
muchas gracias por el codigo, la verdad que me resulto super util para no tener que depender de un plugin para hacer esto :D
Publicado: 14/02/2009 2:35 pm
Me hace falta k si puedes me mandes el codigo completo a mi direccion de correo k me hace falta para un trabajo…gracias.
Publicado: 14/02/2009 2:36 pm
la direccion es eramirezr@estudiantes.uci.cu
Publicado: 14/02/2009 10:22 pm
La ruta completa del script final para descargar esta al final del post y si no la ubicas te dejo la ruta para que descargues los archivos fuente.
http://www.box.net/shared/pn9z58z518
Publicado: 15/02/2009 1:09 am
Ayuda:
cuando baje el paquete me dio este error, favor de ayudarme…..
‘Call to a member function get_forecasts() on a non-object in C:\wamp\www\weather\index.php on line 25′
Publicado: 16/02/2009 3:07 pm
el error k me da es de k me dice k la variable $weather no es un objeto y por lo tanto me da error en cada llamada a los metodos de la clase…favor de ayudarme…….
Publicado: 24/02/2009 1:29 pm
Yo tengo el mismo problema Enoel, ya lograste solucionarlo??? o alguien que pueda ayudarnos???
Gracias !
Publicado: 26/02/2009 1:48 pm
Esta excelente el codigo!!
Sobre la pregunta de Miguel:
Pega esta parte del codigo dentro tu
require(“simplepie.inc”);
require(“simplepie_yahoo_weather.inc”);
Luego podras usar cuantos quieras.
Ese codigo es la conexion con el sistema, lo pones una vez nada mas.
Si pones mas de una vez no funciona.
Saludos, espero haberte ayudado
Publicado: 02/03/2009 1:44 pm
Rodrigo todavia no he podido dar con el error, si lo solucionas publicalo
Publicado: 03/03/2009 1:33 pm
Hola esta buenisimo, pero tengo algunas dudas, quisiera saber si puedo obtener tambien la hora. ademas de como puedo ver los codigos de la ciudad. yo soy de Colombia-Bogotá.
Gracias por la ayuda.
Publicado: 03/03/2009 3:59 pm
Es un golazo este artículo. Alguien sabe de dónde puedo obtener un tutorial parecido para hacer una implementación como esta sin usar PHP, o bien, utilizando ASP?
Muy agradecido!
Publicado: 03/03/2009 11:45 pm
Mauricio, como se explica en el post, para encontrar el código debes entrar a http://weather.yahoo.com buscas la ciudad de tu elección y luego te fijas en el URL que contendrá el código de la ciudad, en tu caso para Bogotá el código es: COXX0004
Publicado: 14/03/2009 11:54 am
Oye una excelente herramienta solo que tengo una duda ta coloque el archivo pero cada cuando se vuelve a cargar la informacion del clima, o no se si tenga que modificar algo para que cambie el clima cada 10 minutos.
Si lo hace bien cuando cambie de dia a noche pero cuando toma una temperatura cuando abras la pagina, se queda con esa todo el dia.
Lo resolvi borrando el cache pero no se si exista una forma de hacerlo sin borrar el cache.
Espero una pronta respuesta de tu parte.
SALUDOS
DIEGO
Publicado: 14/03/2009 12:17 pm
Oye una duda que es lo que pasa, aunque es de dia me esta marcando ahora que el icono de noche, de hecho tambien se ve en tu ejemplo.
Publicado: 14/03/2009 12:39 pm
Nuevamente yo antes funcionaba bien pero ahora aparte de lo que te escribi anteriormente me manda este error:
Warning: ./cache/eaa6ab0e8c97bbc9d6e57001b46a6900.spc is not writeable in /home/produccio7/domains/produccionesbajio.com/public_html/weather/simplepie.inc on line 1769
Publicado: 27/03/2009 8:32 am
Y es posible sacar los datos de la predicción, estoy probando con la clase SimplePie_YWeather_Forecast pero no se exactamente como decirle el núemro de dias o la fecha de la que quiero la predicción.
Publicado: 27/03/2009 10:18 am
Me contesto a mi mismo, por defecto te pasa también el dato del día siguiente y lo guarda en el $fore[1] lógicamente
$fore[1]->get_low()
$fore[1]->get_code()
….
Publicado: 10/04/2009 3:45 pm
Hola, tuve algunos problemas para calcular la hora de Argentina, el script que uso es el mismo, como lo logro? Ya que cuando son las 5 de la tarde en argentina aparece la luna, muchas gracias.
http://realidadweb.com.ar/clima.php
Publicado: 10/04/2009 4:18 pm
El problema es que el servidor donde tienes alojado tu aplicación debe tener otra hora como ocurrio en mi caso, es por ello que le aumente dos horas es mi script:
$curday = 2*60 + time2minuts(date(“g:i a”));
Puedes modificar el valor que le sumas a la hora calculada (2*60) hasta lograr la hora correcta para tu ciudad.
Publicado: 18/04/2009 10:49 pm
No investigue mucho el codigo pero si eliminas la llamada a la funcion time2minuts cambia el icono del sol a la luna, ahora son las 00:47 en Agentina y me aparecia el sol, asique tome el valor directo de weather y cambio a la luna, no se que pasara mañana =) en principio funcionó.
las variables quedarian asi
$iniday = $weather->get_sunrise();
$endday = $weather->get_sunset();
abrazos
Publicado: 14/05/2009 8:58 pm
ge-nial!
me has salvado la vida! ^^
funciona perfecto!.. btw, realice el cambio de calculo de hora, porque mi servidor es argentino, y mi página es méxicana..
saludetes!
Publicado: 08/06/2009 5:47 am
a mi tambien me sale el mismo Warning que Diego.
Warning: ./cache/eaa6ab0e8c97bbc9d6e57001b46a6900.spc is not writeable
Como puedo quitarlo?
Gracias
Publicado: 08/06/2009 11:16 am
BARBAROOO ya lo aplicare. en varios sites. y funca de maravillas…
consulta.. en http://www.flashcenter.com.ar/ baje Widget de Clima en flash que funciona.. casi de la misma manera pero en flash.. por alguna caracteristica del server no funca en el mio . testee configuraciones etc.. me encantaria si alguin sabe como modificar el anterior o adapptar este para que levante los datos desde el flash ya que se me complico conis conocimientos.!! saludos gente. abrazo Esteba
Publicado: 14/06/2009 10:13 am
How to put more than one city/place on same page like http://www.philtvguide.com/philippines-weather/ ?
Thanks for a great script :-)
Publicado: 14/06/2009 10:16 am
When try with two cities/places I got following error:
Fatal error: Cannot redeclare time2minuts() (previously declared in /mounted-storage/………
Someone have any ideas to get around this ?
Thanks :-)
Publicado: 14/06/2009 10:35 am
Hola Kim, lo que pasa que has copiado todo el código nuevamente, entonces como la función time2minuts esta declarada al inicio te genera un error. Entonces solo copia el código sin incluir la función time2minuts.
Publicado: 05/07/2009 3:37 pm
Hola a los que le da el error Warning: ./cache/eaa6ab0e8c97bbc9d6e57001b46a6900.spc is not writeable
Tienen 2 opciones:
Poner la carpeta cache en el mismo lugar que el archivo .inc.
O si no desabilitar la cache
$feed->enable_cache(false);
Un saludo.
Publicado: 07/07/2009 2:11 am
Hola, a los que tienen error de las 12 am a la 1 am y les pone solecito lo que hice fue modificar la funcion time2minuts para que verificara si era entre las 12 y 1 para que no me sumara 12 horas a los minutos y quedaria asi:
function time2minuts($time) {
$minuts = 0;
$atime = explode(” “, $time);
if (strtolower($atime[1]) == “pm”) {
$minuts = 12*60;
}
$ttime = explode(“:”, $atime[0]);
if(($ttime[0] == 12) && $atime[1] == “am”)
{
$minuts = $minuts + (int)$ttime[1];
}
else
{
$minuts = $minuts + (int)$ttime[0]*60 + (int)$ttime[1];
}
return $minuts;
}
Publicado: 16/07/2009 12:46 am
che lo que no entiendo es la linea siguiente:
$curday = 2*60 + time2minuts(date(“g:i a”));
por que coloca el 2*60, o sea le suma dos horas a las que tiene el server? ese punto lo hicieron por queel server tenia dos horas menos?, Saludos, Muy Bueno el Codigo.
Publicado: 16/07/2009 9:45 am
Ese valor es por que la hora de mi servidor tenia una diferencia con la hora de Lima que es donde vivo, uds tienen que modificar este valor dependiendo de la hora de su servidor hasta ajustarse a la hora de su localidad.
Publicado: 23/07/2009 10:24 pm
Che el problema de las 12 am tambien aparece a las 12 pm, resulta que cuando son las 12 pm te muestra una luna y cuando son las 12 am te muestra un sol, qui la solucion de la funcion para que ande bien tanto en las 12 am como en las 12 pm
function time2minuts($time) {
$minuts = 0;
$atime = explode(” “, $time);
$ttime = explode(“:”, $atime[0]);
if (strtolower($atime[1]) == “pm”) {
$minuts = 12*60;
}
if($ttime[0] == “12″) $ttime[0] = “0″;
$minuts = $minuts + (int)$ttime[0]*60 + (int)$ttime[1];
return $minuts;
}
Publicado: 23/07/2009 10:25 pm
la Solucion esta poner el
if($ttime[0] == “12″) $ttime[0] = “0″;
en la funcion,
Saludos,
Publicado: 25/08/2009 11:18 am
Antes que nada gracias por el tuto, me fue muy util. Localmente todo funciona lo mas bien, pero cuando lo subo a mi sitio me da el siguiente error: Fatal error: Call to a member function get_condition() on a non-object
Tenes idea de cual es el error? si me podes ayudar te lo voy a agradecer.
Saludos!
Publicado: 29/09/2009 10:47 am
Me funciono de lujo con la modificacion de Luciano D, solo que reemplaze las comillas dobles por simples.
Publicado: 17/10/2009 9:53 am
echo $weather->get_condition_code();
si de esa forma imprimo el condition code de hoy, como lo haría con el del día de mañana ??
graciias
Publicado: 19/10/2009 6:33 pm
Hola amigo, muy buen y muy útil script, felicitaciones!!!
Tengo un problema y no se resolverlo. Como hago para achicar las imagenes? Tal vez es una pregunta muy tonta pero le estoy dando vueltas y no puedo hacerlo.
Muchas gracias y saludos
Publicado: 14/11/2009 3:12 pm
me aparece este error, ayudenme :(
Warning: ./cache/4334f5b59ddab2ba6c42e63aa7cd8bf7.spc is not writeable in /home/a5349153/public_html/weather/simplepie.inc on line 1769
Publicado: 14/11/2009 3:18 pm
Flor, debes crear una carpeta llamada tmp en donde se guardarán los archivos de cache y además debes darle los permisos de escritura, con eso se resuelve todo.
Publicado: 23/11/2009 10:42 am
La mejor aplicación de esta secuencia de comandos o programa que Ive visto es este http://www.philjobspot.com. ¿Cómo lo hacen?
Publicado: 24/11/2009 12:46 am
Me he dado cuenta en este http://www.philjobspot.com sitio web que tienen un código de fuente diferente en comparación con el tutorial de esta página. Están utilizando http://weather.yahooapis.com/forecastrss?u=c&w = en lugar de http://weather.yahooapis.com/forecastrss?u=c&p = (Comunicación de la categoría P y W). Y diferente formato de código de la ciudad.
Publicado: 14/12/2009 8:41 pm
Hola. Necesito el componente .fla que en su momento estaba publicado en http://www.flashcenter.com.ar/. Hoy, esta URL redirige a un sitio que aparentemente está en construcción y ya no encuentro el archivo. Si alguien sabe donde puedo encontrarlo se lo agradezco. Saludos, Victoria
Publicado: 21/01/2010 8:33 pm
Dude, is there a way to show forecasts for few days in a row (e.g. today(Monday), Tuesday, Wednesday etc. ?) ? :O
And, maybe someone has already mentioned it above (my Spanish < 0), how to get this city code by any other way ?
Publicado: 26/01/2010 6:40 pm
Exelente información, solo tengo un detalle, mi variable $path=”http://weather.yahooapis.com/forecastrss?p=MXHO0590&u=c” no me manda la temperatura en ºC, sino en ºF, que pasa? si se supone que u=c? Help me please.
Publicado: 26/01/2010 6:42 pm
AH! y que digo excelente información, es un super aporte, gracias por que en verdad me sacaron del hoyo en mi proyecto escolar. =)
Publicado: 05/02/2010 4:45 pm
Me pasa lo mismo con lode los C y F. Puse el feed con u=c y me devuelve la temperatura en ºf