Cómo integrar Google Analytics en una web en .net

En el desarrollo web es fundamental ofrecer continuamente a nuestros clientes nuevas funcionalidades para sus sitios web. Para este propósito Google pone a nuestra disposición una gran variedad de APIs con las que podemos aportar valor añadido a nuestros proyectos. Hoy voy a explicar cómo podemos integrar datos de extraídos de Google Analytics en el área de administración del site.

Este desarrollo puede dividirse en varias fases:

  • Crear una cuenta de Google Analytics en la web
  • Solicitar desde una aplicación web .net datos de una cuenta de Google Analytics
  • Formatear y publicar los datos obtenidos

Crear una cuenta de Google Analytics

En primer lugar debemos disponer de una cuenta de Google, para ello debemos pedir a algún amigo que nos envíe una invitación para crear una cuenta de correo de Gmail. Una vez que tenemos nuestro correo de Gmail vamos a http://www.google.com/analytics/es-ES/ y nos registramos en Google Analytics. Una vez registrados debemos crear un nuevo perfil de sitio web introduciendo la url de la web, país y zona horaria. Google nos proporcionará un código javascript, que deberemos insertar en todas las páginas de la web justo antes del cierre de la etiqueta “body”.

Solicitar desde una aplicación web .net datos de una cuenta de Google Analytics

Una vez que estamos registrando tráfico en nuestra cuenta de Google Analytics tenemos que establecer una conexión entre la aplicación web y Google Analytics, para este propósito Google nos proporciona tres posibilidades: AuthSub, Oauth y ClientLogin. Nosotros nos vamos a centrar en ClientLogin ya que permite conectarse a una cuenta de Google Analytics aportando los datos de acceso desde la propia aplicación, con esto conseguimos que el acceso sea totalmente transparente al usuario. En los otros dos casos, cada vez que el cliente accediera a la página donde se muestran los datos, el sistema le pediría loguearse.

El primer paso es añadir dentro de la etiqueta <appSettings> del archivo Web.config el usuario y contraseña de la cuenta de Google desde la cual vamos a leer los datos de Analytics:

<add key="analyticsLoginEmail" value="aquí va el email" />

<add key="analyticsLoginPassword" value="aquí va el password" />

El paso siguiente es crear una clase donde programaremos la conexión y la petición de datos, por ejemplo GoogleAnalytics.cs, esta clase debe contener los siguientes métodos:

getSessionTokenClientLogin

Parámetros:

  • string email: El email de la cuenta a acceder
  • string password: El password de dicha cuenta

Acción:

Establecer la conexión con la cuenta de Google.

Código:

public static string getSessionTokenClientLogin(string email, string password)
{
//Google analytics requires certain variables to be POSTed
string postData = "Email=" + email + "&Passwd=" + password;

//defined - should not channge much
postData = postData + "&accountType=HOSTED_OR_GOOGLE" + "&service=analytics" + "&source=humanlevel-testapp-1";

ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(postData);

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("https://www.google.com/accounts/ClientLogin");
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();

// Send the data.
newStream.Write(data, 0, data.Length);
newStream.Close();

HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
Stream responseBody = myResponse.GetResponseStream();

Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(responseBody, encode);

//returned from Google Analytics API
string response = readStream.ReadToEnd();

//get the data we need
string[] auth = response.Split(new string[] { "Auth=" }, StringSplitOptions.None);

//return it (the authorization token)
return auth[1];
}

getData

Parámetros:

  • string sessionToken: Variable de sesión de conexión
  • string profileID: El identificador de la web en Google Analytics
  • string metrics: La métrica para la petición (ga:visits)
  • string dimensions: La dimensión de la petición (ga:day)
  • DateTime start_date: La fecha de inicio del periodo a consultar
  • DateTime end_date: La fecha de finalización del periodo a consultar
  • int max_results: El número máximo de resultados a devolver
  • string filters: El filtro a ejecutar en la petición, con este parámetro solicitaremos los resultados únicamente para una página y no para toda la web

Acción:

Recibirá los parámetros de la petición y formateará los datos para formar la url que solicitará los datos a Google Analytics, quedando una url similar a esta:

https://www.google.com/analytics/feeds/data?ids=ga:" + profileID + "&dimensions=" + dimensions+ "&metrics=" + metrics+ "&start-date=" + String.Format("{0:yyyy-MM-dd}", start_date) + "&end-date=" + String.Format("{0:yyyy-MM-dd}", end_date) + "&prettyprint=true&max-results=" + max_results.ToString()+"&filters="+filters

Esta url debemos pasarla como parámetro al siguiente método:

GArequestResponseHelper

Parámetros:

  • string url: Url de petición de datos formateada por getData
  • string token: Token de sesión

Acción:

Realizar la petición a Google Analytics, os copio el código:

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);

myRequest.Headers.Add("Authorization: GoogleLogin auth=" + token);

HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
Stream responseBody = myResponse.GetResponseStream();

Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(responseBody, encode);

return readStream.ReadToEnd();

Ahora que ya tenemos la clase con la que conectaremos y realizaremos la petición, en la página donde queremos mostrar los datos obtenidos debemos hacer lo siguiente:

//Nos logeamos con el user y pass
string analyticsLoginEmail = ConfigurationManager.AppSettings["analyticsLoginEmail"].ToString();
string analyticsLoginPassword = ConfigurationManager.AppSettings["analyticsLoginPassword"].ToString();
string token = GoogleAnalytics.getSessionTokenClientLogin(analyticsLoginEmail, analyticsLoginPassword);

Session["token"] = token;

//Hacemos la petición a Google Analytics
results = GoogleAnalytics.getData(Session["token"].ToString(), profile,  metrics, dimensions, start_date, end_date, max_results, filters);

XmlDocument resultsXML = new XmlDocument(); resultsXML.LoadXml(results);

Debug.WriteLine(resultsXML);

//each line/record return from the API will be contained in an 'entry' element
XmlNodeList entries = resultsXML.GetElementsByTagName("entry");

Formatear y publicar los datos obtenidos

Google Analytics nos proporciona un XML de elementos “entry” con la siguiente estructura:

<entry>
<id>http://www.google.com/analytics/feeds/data?ids=ga:459940&amp;ga:pageTitle=dynamic%20URL%20rewriter%20tool%20%7C%20mod%20rewrite%20tool%20%7C%20convert%20dynamic%20urls%20into%20static%20urls&amp;start-date=2009-03-01&amp;end-date=2009-03-31</id>
<updated>2009-03-30T17:00:00.001-07:00</updated>
<title type=’text’>ga:pageTitle=dynamic URL rewriter tool | mod rewrite tool | convert dynamic urls into static urls</title>
<link rel=’alternate’ type=’text/html’ href=’http://www.google.com/analytics’/>
<dxp:dimension name=’ga:pageTitle’ value=’dynamic URL rewriter tool | mod rewrite tool | convert dynamic urls into static urls’/>
<dxp:metric confidenceInterval=’0.0′ name=’ga:pageviews’ type=’integer’ value=’409′/>
</entry>
<entry>
<id>http://www.google.com/analytics/feeds/data?ids=ga:459940&amp;ga:pageTitle=Google%20Analytics%20-%20exclude%20your%20visits%20even%20with%20a%20dynamic%20IP&amp;start-date=2009-03-01&amp;end-date=2009-03-31</id>
<updated>2009-03-30T17:00:00.001-07:00</updated>
<title type=’text’>ga:pageTitle=Google Analytics - exclude your visits even with a dynamic IP</title>
<link rel=’alternate’ type=’text/html’ href=’http://www.google.com/analytics’/>
<dxp:dimension name=’ga:pageTitle’ value=’Google Analytics - exclude your visits even with a dynamic IP’/>
<dxp:metric confidenceInterval=’0.0′ name=’ga:pageviews’ type=’integer’ value=’389′/>
</entry>

Para obtener los datos que nos interesan podemos hacer un bucle que vaya accediendo a los campos value:

for (int i = 0; i < num_puntos; i++)
{
      string demension = entries[i].ChildNodes[4].Attributes["value"].Value;
      string metric = entries[i].ChildNodes[5].Attributes["value"].Value;

      Response.Write(demension + " - " + metric + "<br/>");
}

O podemos almacenarlos en ArrayList para utilizarlos como más nos interese.

Una vez hagamos este ejemplo, las posibilidades son ilimitadas, teneís toda la información para realizar multitud de peticiones en la documentación de la API http://code.google.com/intl/es-ES/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html. Y si necesitáis otros tipos de acceso hay mucha información en este tutorial de Akamarketing de donde he obtenido información para este post.

En el próximo post veremos cómo podemos utilizar la API de Google Charts para formatear estos resultados y desarrollar nuestro Google Analytics personalizado.

Comparte:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • Meneame
  • Technorati
  • TwitThis
  • Bitacoras.com

Puedes seguir cualquier respuesta a esta entrada mediante el canal RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio.

Deja un comentario

XHTML: Puedes usar las siguientes etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>