Twitter Facebook RSS Feed

martes, 14 de julio de 2020 a las 19:35hs por Gustavo Cantero (The Wolf)

Estos días estuvimos haciendo un reporte para un cliente, el cual incluye gráficos estadísticos y donde debíamos mezclar métricas de la aplicación web que desarrollamos (cantidad de usuarios, mails enviados, etc.) con datos que debimos obtener de Google Analytics (PageViews, origen de las visitas, etc.). Obviamente para esto tuvimos que conectar nuestra aplicación con Google, cosa que no es complicada, pero si no sabés lo que tenés que hacer, puede hacerte perder mucho tiempo. Por esta razón me decidí a escribir esta guía de cómo consultar Google Analytics desde .NET – para quién la necesite.

Aplicación de Google

Lo primero que debemos tener en cuenta es que nuestra aplicación tiene que identificarse con Google y tener los permisos necesarios para leer nuestra información. Para esto tenemos dos opciones: utilizar OAuth, donde un usuario con permisos en la cuenta de Google Analytics deberá identificarse y permitir a nuestra aplicación que lea los datos, o utilizar una cuenta de servicio, donde desde Google Analytics deberemos autorizar a la aplicación una sola vez y ya tendrá permisos.
En el caso de OAuth, debemos crear credenciales del tipo “ID de cliente de OAuth”. Acá nos va a pedir varios datos: logo, una página donde se muestren las políticas de privacidad, etc. Esto es debido a que podemos utilizar nuestra aplicación para que un tercero la consuma y nosotros leer sus datos. Toda esta información, la de la configuración de nuestra aplicación, debe ser revisada y aprobada por personal de Google.
En el segundo caso debemos crear una “cuenta de servicio”. Este es el caso que utilizaremos en nuestro ejemplo, permitiendo de forma sencilla que nuestra aplicación tenga acceso a nuestros datos.
Para ambos casos primero debemos crear una aplicación en Google Cloud Platform, luego seleccionar “API y servicios”, “Credenciales” y nos llevará a una página con las credenciales de nuestra aplicación.

Como nuestra aplicación es nueva no va a tener ninguna credencial, por lo cual debemos pulsar el “Crear credenciales” y elegir “Cuenta de servicio”.

Acá nos va a pedir un par de datos básicos, como nombre y descripción del proyecto, pero lo más interesante es que tenemos que ingresar un identificador, el cual será una cuenta de Google que identifique a nuestra aplicación:

En nuestro ejemplo, la cuenta de nuestra aplicación es “mi-proyecto@scientia.iam.gserviceaccount.com”. El resto de los datos que pide podemos dejarlos como están.
Luego de creada la aplicación la veremos en el listado de aplicaciones. Ahí debemos entrar en la edición de esta, y en la sección de “claves” pulsar en “agregar clave”, “crear nueva clave” y elegimos generar un certificado X.509 con formato P12. Este archivo lo vamos a utilizar desde nuestro código para que se identifique al conectarse.

Permisos de nuestra aplicación

Ahora viene lo interesante: como nuestra aplicación ahora puede identificarse con una cuenta de correo, para darle permisos a nuestra cuenta de Google Analytics sólo debemos ir a la administración de la misma, y en la opción “Gestión de usuarios de vistas” podemos agregarlo como a un usuario cualquiera.

Sólo debemos darle permisos de “Leer y analizar” para que pueda consultar los datos de Analytics:

Luego de esto, nuestra aplicación ya tendrá permisos.

Antes de continuar con el código debemos obtener un dato de Google Analytics que necesitaremos después: el identificador de la vista. Para esto podemos entrar en la configuración de la vista y podremos ver el dato (anotalo en algún lugar, después lo vamos a usar).

Listo, ahora el código

Una vez que hicimos todo lo anterior, sólo nos queda programar.
Para hacer más sencilla la programación utilizaremos la librería Google.Apis.AnalyticsReporting.v4 de las librerías de Google que hay disponibles para .NET. Podemos instalarla desde la Package Manager Console de Visual Studio con esta línea:

Install-Package Google.Apis.AnalyticsReporting.v4

O podemos instalarla desde NuGet:

Esto no sólo va a instalar esta librería, sino también algunas dependencias que son necesarias. Ahora si, podemos ponernos a crear el código.
El código es relativamente sencillo, se explica sólo con los comentarios, ya que solamente debemos crear las credenciales con el certificado creado al inicio de este artículo, establecer el rango de fechas, métricas, dimensiones y enviar todo al servidor. En este ejemplo pediremos la cantidad de PageViews por mes, desde agosto de 2019 hasta hoy.

using Google.Apis.AnalyticsReporting.v4;
using Google.Apis.AnalyticsReporting.v4.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
 
namespace TestGAnalytics
{
    public class TestPageViews
    {
        /// <summary>
        /// Clase para representar los PageViews de un mes
        /// </summary>
        public class MonthData
        {
            /// <summary>
            /// Año/mes
            /// </summary>
            public string YearMonth { get; set; }
            /// <summary>
            /// Cantidad de vistas
            /// </summary>
            public int PageViews { get; set; }
        }
 
        /// <summary>
        /// Método para obtener de Google Analytics la cantidad de vistas
        /// por mes desde agosto de 2019 hasta hoy
        /// </summary>
        /// <returns>Vector con vistas por mes</returns>
        public MonthData[] GetPageViews()
        {
            //Identificación de la vista, obtenido de Google Analytics
            const string VIEW_ID = "52765144";
 
            //Cuenta de nuestra aplicación
            string serviceAccountEmail = "mi-proyecto@scientia.iam.gserviceaccount.com";
 
            //Con el certificado, creamos las credenciales para conectarnos
            var certificate = new X509Certificate2(
                @"C:\path-al-certificado\mi-certificado.p12",
                "notasecret",
                X509KeyStorageFlags.Exportable);
            ServiceAccountCredential credential = new ServiceAccountCredential(
               new ServiceAccountCredential.Initializer(serviceAccountEmail)
               {
                   //Acá es donde decimos que nuestra cuento sólo va a leer datos de Google Analytics
                   //Si queremos utilizar esta librería para consumir datos de otro servicio de Google,
                   //debemos cambiar este valor
                   Scopes = new[] { AnalyticsReportingService.Scope.AnalyticsReadonly }
               }.FromCertificate(certificate));
 
            //Creamos el servicio
            var service = new AnalyticsReportingService(
                new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Test de Scientia"
                });
 
            //Creamos el rango de fechas
            DateRange dateRange = new DateRange()
            {
                StartDate = "2019-08-01",
                EndDate = "today"
            };
 
            //Creamos las métricas
            Metric metric = new Metric()
            {
                Expression = "ga:pageviews",
                Alias = "sessions"
            };
 
            //Creamos la dimensión
            Dimension dimension = new Dimension()
            {
                Name = "ga:yearMonth"
            };
 
            //Creamos el request del reporte
            ReportRequest request = new ReportRequest()
            {
                ViewId = VIEW_ID,
                DateRanges = new List<DateRange>() { dateRange },
                Metrics = new List<Metric>() { metric },
                Dimensions = new List<Dimension>() { dimension }
            };
 
            //Creamos el request a enviar
            List<ReportRequest> requests = new List<ReportRequest> { request };
 
            //Creamos el reporte
            GetReportsRequest getReport = new GetReportsRequest()
            {
                ReportRequests = requests
            };
 
            //Enviamos todo a Google y obtenemos el resultado
            GetReportsResponse response = service.Reports.BatchGet(getReport).Execute();
 
            //Obtengo el primer reporte, porque sólo pedimos uno
            var rep = response.Reports[0];
 
            //Utilizamos LINQ para convertir los datos devueltos a nuestra clase
            var data = rep.Data.Rows.Select(
                row => new MonthData()
                {
                    YearMonth = row.Dimensions[0],
                    PageViews = int.Parse(row.Metrics[0].Values[0])
                });
 
            return data.ToArray();
        }
    }
}

Nótese que en cada petición podemos pedir varios reportes, y cada uno puede devolver varias métricas y utilizar varias dimensiones, acá sólo usamos uno de cada uno para hacer más sencillo el ejemplo.
Para ver todas las posibilidades que nos ofrece Google Analytics podemos usar Query Explorer, una aplicación web que nos permite jugar con los datos de Analytics en tiempo real, agregando y cambiando métricas, dimensiones, etc.
Espero que este artículo para consultar Google Analytics desde .NET les sea de utilidad, ya que aunque consumir datos de Google no sea algo complejo, implica conocer varias cosas y, si es la primera vez que vamos a hacerlo, puede confundirnos y hacernos perder mucho tiempo.
¡Suerte!

2 comentarios »

  1. Hola Gustavo, como puedo traer mas de 1000 filas, la consulta por defecto me trae solo 1000 filas.

    En la espera de tus comentarios.

    Slds,

  2. Hola amigo, por defecto me trae la consulta de 1000 filas, como puedo hacer para que me traiga el máximo de filas

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.