6

Tenemos una aplicación web que consta de varias páginas. Registramos nuestro dominio de aplicación web en Google Analytics y el seguimiento de visitas funciona como se esperaba (en el panel de Analytics podemos ver páginas vistas para cada página). Ahora queremos que esta información de vistas de página se almacene en el back-end dentro de nuestro DB. Por lo tanto, queremos crear un proceso de fondo que se ejecutará una vez por día y obtener las vistas de la página desde la API de Analytics.API de Google Analytics: obtenga de forma programada vistas de página en el lado del servidor

Esto, por supuesto, debe hacerse en el código. De la investigación inicial parece que para acceder a la API de Analytics debe tener lugar un proceso de autenticación, lo que significa que un usuario humano debe escribir una identificación y una contraseña.

La pregunta es, ¿se puede hacer con código solo?

Respuesta

9
//-------------- Get Auth Token ------------------- 

    WebClient webClient = new WebClient(); 
    NameValueCollection data = new NameValueCollection(); 
    data.Add("accountType", "GOOGLE"); 
    data.Add("Email", "[email protected]"); 
    data.Add("Passwd", "xxxx");//Passwd, not a misspell. 
    data.Add("service", "analytics"); 
    data.Add("source", "xxxx-xxxx-xx");//Could be anything. 

    byte[] bytes = webClient.UploadValues("https://www.google.com/accounts/ClientLogin", "POST", data); 
    string tokens = Encoding.UTF8.GetString(bytes); 
    string authToken = extractAuthToken(tokens); 

    //-------------- Get page views ------------------- 

    string feed = "https://www.google.com/analytics/feeds/data"; 

    //Required: 
    string ids = "ga:xxxx"; 
    string metrics = "ga:pageviews"; 
    string startDate = "2011-06-25"; 
    string endDate = "2011-07-25"; 

    //Optional: 
    string dimensions = "ga:pagePath"; 
    string sort = "-ga:pageviews";    

    string feedUrl = string.Format("{0}?ids={1}&dimensions={2}&metrics={3}&sort={4}&start-date={5}&end-date={6}", 
     feed, ids, dimensions, metrics, sort, startDate, endDate); 

    webClient.Headers.Add("Authorization", "GoogleLogin " + authToken); 
    string result = webClient.DownloadString(feedUrl); 

    //-------------- Extract data from xml ------------------- 

    XDocument xml = XDocument.Parse(result); 
    var ns1 = "{http://www.w3.org/2005/Atom}"; 
    var ns2 = "{http://schemas.google.com/analytics/2009}"; 

    var q = from entry in xml.Descendants() 
      where entry.Name == ns1 + "entry" 
      select new 
      { 
       PagePath = entry.Element(ns2 + "dimension").Attribute("value").Value, 
       Views = entry.Element(ns2 + "metric").Attribute("value").Value 
      }; 

    //-------------- Do something with data ------------------- 
    foreach (var page in q) 
    { 
     Debug.WriteLine(page.PagePath + " " + page.Views);     
    } 

    //-------------- Help Method ------------------- 
    private string extractAuthToken(string data) 
    {   
     var tokens = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);    
     return tokens.Where(token => token.StartsWith("Auth=")).Single(); 
    } 
+0

Es importante que escriba 0 principales en los parámetros de fecha. 2011-07-01 FUNCIONARÁ pero 2011-07-1 NO. Si no se utilizan los 0 iniciales, se producirá un error de 400 solicitudes erróneas. – Thijs

+0

@Thijs Sí, me estaba golpeando la cabeza con esto. Estaba usando este código y establecí endDate en DateTime.Now. Pero de repente un día dejó de funcionar. Me tomó algunas horas resolver esto. Usar DateTime.Now.ToString ("aaaa-MM-dd"); resuelto esto –

+0

¿cómo se obtiene la vista de página de una sola página o todas las páginas que coinciden con una expresión? – VinnyG

Cuestiones relacionadas