Minerva Piquero en PHP

      1 Comment on Minerva Piquero en PHP

He conseguido por fin una de las cosas en las que estaba trabajando. Se trata de recuperar los datos meteorológicos de un servidor de internet en formato XML y tratarlos para presentarlos en mi propia página web.
Para ello he usado el único servicio que he encontrado que proporcionaba esa información en el formato que yo queria y en el lugar que necesitaba. Se trata de The weather channel, que me proporciona un feed en XML con los datos del tiempo en Navacerrada, España, que es el lugar mas cercano al centro neuralgico de mis salidas en bici de los domingos.
Este servidor es el mismo que le da la información del tiempo a portales como Terra, por ejemplo.

En las especificaciones de uso del servicio se indica que el XML hay que cachearlo para no realizar peticiones innecesarias al servidor de weather así que he realizado un PHP que cada vez que se le pide el tiempo verifica si ya tiene el archivo XML en local y si los datos contenidos en el necesitan ser refrescados. Si es necesario un refresco de los datos y solo entonces, se vuelve a pedir el XML y se guarda en disco.
A partir de este archivo compongo una linea de parametros para pasarlos por GET a una animación en Flash que recoge dichos datos y los presenta de una forma mas o menos bonita. El resultado final lo podeis ver en la página de A joderse, la agrupación ciclista a la que pertenezco.

Para leer el XML he utilizado las librerias de Active Link que aunque estan bastante mal documentadas, despues de pelearme con ellas un rato conseguí lo que quería.
Este es el código PHP usado:

<?php

// Reads Weather data from a XML file if exists and is dated or
// retrieves it from the weather channel if not.
// The code for Navacerrada, Spain is SPXX0113

require_once("classes/include.php");
import("org.active-link.xml.XML");
import("org.active-link.xml.XMLDocument");
import("org.active-link.net.Socket");
import("org.active-link.net.HTTPClient");

$refresh = false;
$xoapserver = "xoap.weather.com";
$xoapport = 80;
$URI = "/weather/local/SPXX0113?cc=*&unit=m&prod=xoap&par=***********&key=********";
$weatherfile = "navacerrada.xml";
$updatetime = 600;

if (! file_exists($weatherfile))
    $refresh = true;
else
{
    // Check if update time has elapsed between file date and actual time
    if (time() - filemtime($weatherfile) >= $updatetime)
        $refresh = true;

    // Try to load XML localy to verify its correctness
    $weatherXMLDoc = new XMLDocument($weatherfile);
    if ($weatherXMLDoc->getXMLString()=="")
        $refresh = true;
}

if ($refresh)
{
    // Query parameters
    // cc       Current Conditions OPTIONAL VALUE IGNORED
    // dayf     Multi-day forecast information for some or all forecast elements
    //          OPTIONAL
    //          VALUE = [ 1..10 ]
    // link     Links for weather.com pages 
    // par  Application developers Id assigned to you 
    // prod     The XML Server product code 
    // key  The license key assigned to you 
    // unit     Set of units. Standard or Metric DEFAULT = s

    $request = new HTTPClient($xoapserver, $xoapport);
    $request->setRequestURI($URI);
    $result = $request->sendRequest();
    $xml = new XML($result);
    $weatherXMLDoc = new XMLDocument();
    $weatherXMLDoc->setXML($xml);
    $weatherXMLDoc->save($weatherfile);
}

$xml = $weatherXMLDoc->getXML();

// Information layout
$querystring = "";

$querystring .= "name=" . urlencode("Navacerrada");
$querystring .= "&temp=" . urlencode($xml->getTagContent ("weather/cc/tmp")."º".
    $xml->getTagContent("weather/head/ut"));
$querystring .= "&flik=" . urlencode($xml->getTagContent ("weather/cc/flik")."º".
    $xml->getTagContent("weather/head/ut"));
$querystring .= "&icon=" . urlencode($xml->getTagContent ("weather/cc/icon"));
$querystring .= "&bar=" . urlencode($xml->getTagContent ("weather/cc/bar/r").
    $xml->getTagContent("weather/head/up"));
$querystring .= "&bardir=" . urlencode($xml->getTagContent ("weather/cc/bar/d"));
$querystring .= "&wspeed=" . urlencode($xml->getTagContent ("weather/cc/wind/s").
    $xml->getTagContent("weather/head/us"));
$querystring .= "&wdir=" . urlencode($xml->getTagContent ("weather/cc/wind/d"));
$querystring .= "&moist=" . urlencode($xml->getTagContent ("weather/cc/hmid"));
$querystring .= "&vis=" . urlencode(latin1_encode($xml->getTagContent ("weather/cc/vis").
    $xml->getTagContent("weather/head/ud")));

?>

Los datos de conexion con weather.com los he ocultado por que son personales para mi conexion, pero creo que el ejemplo es bastante esclarecedor para quien quiera o necesite incorporar esta información en sus programas. Aclarar que el código SPXX0113 es el utilizado para Navacerrada, para otras localizaciones hay que buscar su código.
Si te das de alta en el servicio recibes un documento en PDF que te explica pormenorizadamente como has de pedir los archivos XML, cada cuanto tiempo y con que parámetros, ademas de orientar en las búsquedas de otras localizaciones.
Solo espero que Weather.com tarde mucho en empezar a cobrar por este servicio, cosa que me temo que acabará pasando, como casi con todo lo bueno de Internet.

Como siempre en estos casos, si te sirve de algo mi código, dame crédito por favor.

1 thought on “Minerva Piquero en PHP

  1. edgar

    Este post me ha sido util pero la rutina de xml no me funciona tal como deberia me agradaria si me pudieras ayudar o dar algun consejo.

Comments are closed.