Logo de islavisual
Isotipo de islavisual IslaVisual
imagen de sección

Ultima revisión 17/02/2010

Usando la API de Google Analytics desde PHP

Tenía pendiente crear un bloque de entradas más vistas (o visitadas) y aprovechando la apertura del API de Google Analytics y lo entretenido de la documentación he creado un breve programita en PHP para acceder a esos datos.

Basta con definir GA_LOGIN y GA_PASS con nuestros datos de acceso a Analytics e indicar en GA_IDS el id del perfil a consultar. El último dato también se puede obtener con el API, como explican en el ejemplo de datos de cuenta, pero he preferido indicarlo directamente para simplificar. Para obtener este número basta con entrar en Analytics, editar el perfil que deseemos y copiar el Número de identificación del perfil que nos indica.

Este ejemplo obtiene las páginas con más visitas de la última semana ordenados de forma decreciente por visitas.

<?php
    define('GA_LOGIN',  'LOGIN');       # cambiar
    define('GA_PASS',   'PASSWORD');    # cambiar
    define('GA_IDS',    'ID');          # cambiar
    define('GA_APP',    'www.mabarroso.com-ga-1.0');

    # Login
    $loginURL  = 'https://www.google.com/accounts/ClientLogin?accountType=GOOGLE&Email='.GA_LOGIN;
    $loginURL .= '&Passwd='.GA_PASS.'&source='.GA_APP.'&service=analytics';
    $loginData = file_get_contents($loginURL);
    list(,$Auth) = split('Auth=', $loginData);

    if (!$Auth) {
        exit('no logged in');
    }

    # Fijamos user agent y Auth en la cabecera de las peticiones
    ini_set('user_agent', GA_APP."rnAuthorization: GoogleLogin auth=$Auth");

    # Rango de fechas
    $dateEnd = date('Y-m-d', time()-86400);  // ayer
    $dateBegin = date('Y-m-d', time()-604800); // la semana pasada

    # Consulta
    $data = file_get_contents('https://www.google.com/analytics/feeds/data?ids=ga:'.GA_IDS;
    $data.= '&dimensions=ga:pagePath&metrics=ga:pageviews&sort=-ga:pageviews&start-index=1&max-results=10&start-date='.$dateBegin;
    $data.= '&end-date='.$dateEnd);
    $data = str_replace(array('dxp:dimension','dxp:metric'), array('dxpdimension','dxpmetric'), $data);
    $xml = simplexml_load_string($data);

    # Datos
    $i = 0;
    foreach ($xml->entry as $entry) {
        echo ++$i.' '.$entry->dxpdimension['value'].' : '. $entry->dxpmetric['value'] .'<br/>';
    }
?>

He tenido problemas al recuperar los valores dxp:dimensión y dxp:metric con SimpleXML. No es una solución elegante pero, para salvar el obstáculo, reemplazo esas cadenas de texto por otras que no dan problemas (les quito los dos puntos).

Con una tarea programada para ejecutarse una vez al día: se recuperan los datos, se construye el código HTML y se guarda en archivo. La consulta a Google no se hace en cada petición. Es innecesario. Por el momento son las entradas más vistas durante la última semana, como en el código de ejemplo. Con el paso del tiempo comprobaré si conviene acortar o alargar el periodo.

Ahora se me ocurre que también sería interesante hacer otro bloque que fuera La entrada más vista ayer. Valdría el mismo código, cambiando la fecha inicial por $dateBegin = date('Y-m-d', time()-172800); (fecha actual menos el número de segundos de dos días). Por optimizar, también se puede cambiar en la url de la consulta max-results=1 y así obtener un único resultado en vez de 10.

Sobre el autor

Imagen de Pablo Enrique Fernández Casado
Pablo Enrique Fernández Casado

CEO de IslaVisual, Manager, Full Stack Analyst Developer y formador por cuenta ajena con más de 25 años de experiencia en el campo de la programación y más de 10 en el campo del diseño, UX, usabilidad web y accesibilidad web. También es escritor y compositor de música, además de presentar múltiples soft kills como la escucha activa, el trabajo en equipo, la creatividad, la resiliencia o la capacidad de aprendizaje, entre otras.

Especializado en proveer soluciones integrales de bajo coste y actividades de consultoría de Usabilidad, Accesibilidad y Experiencia de Usuario (UX), además de ofrecer asesoramiento en SEO, optimización de sistemas y páginas web, entre otras habilidades.