Google announced the Analytics Data Export API some days ago, thereby making it much easier to get analytics data for a site. The API debuted with Java and Javascript clients, but no direct .Net support (other than going straight for the XML). It seems the API is similar to the other Google Data APIs though, and there's a .Net client for those. Has anyone tried using the components in that library to get at the analytics data?
I'm in the process of building an ASP.Net MVC site and thought I'd use Google Analytics to generate "Most viewed" lists and stuff like that (since Google is probably better at weeding out spurious requests, robots, etc.). If you have any thoughts on that idea, I'd much appreciate hearing them too.
Check the trunk of Google's .NET library, they have added Analytics support.
Also check their groups post on this:
http://groups.google.com/group/gdata-dotnet-client-library/browse_thread/thread/2d2eec9103b731c6
and
http://groups.google.com/group/gdata-dotnet-client-library/browse_thread/thread/70c6638734823b8d
Check out my post location here:
http://www.akamarketing.com/blog/103-introducing-google-analytics-api-with-aspnet-c.html
It's not using the built in library you mention but it's working pretty well. The whole API is XML/HTTP so it's pretty handy to use. You basically ask Google for a webpage and examine the response for what you need.
//For this you will have to add some dll in your .net project i.e.
using DotNetOpenAuth.OAuth2;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Services;
public ActionResult GetAnalyticsData(string GroupType, string date_from, string date_to)
{
try
{
AnalyticsService gas = AuthenticateUser();
// Creating our query
DataResource.GaResource.GetRequest r = gas.Data.Ga.Get("ga:88028792", date_from, date_to, "ga:visits, ga:pageviews, ga:users, ga:newUsers, ga:sessions");
//Hour,Day,Week,Month
if (GroupType == "Hour") { r.Dimensions = "ga:nthHour"; }
else if (GroupType == "Day") { r.Dimensions = "ga:nthDay"; }
else if (GroupType == "Week") { r.Dimensions = "ga:nthWeek"; }
else if (GroupType == "Month") { r.Dimensions = "ga:nthMonth"; }
//d: Execute and fetch the results of our query
GaData d = r.Execute();
List<TotalsForAllResults> tr = new List<TotalsForAllResults>();
List<CustomeData> cd = new List<CustomeData>();
foreach (var item in d.Rows)
{
CustomeData mydata = new CustomeData();
// mydata.CreatedDate = item[0].ToString();
mydata.visits = Convert.ToInt32(item[1]);
mydata.pageviews = Convert.ToInt32(item[2]);
mydata.users = Convert.ToInt32(item[3]);
mydata.newUsers = Convert.ToInt32(item[4]);
mydata.sessions = Convert.ToInt32(item[5]);
#region Date Conversion
DateTime Now = DateTime.Parse(date_from, CultureInfo.InvariantCulture, DateTimeStyles.None);
DateTime TempDate = new DateTime(Now.Year, Now.Month, Convert.ToInt32(Now.ToString("dd")));
if (GroupType == "Day")
{
TempDate = TempDate.AddDays((Convert.ToInt32(item[0])));
mydata.CreatedDate = TempDate.ToLongDateString();
}
else if (GroupType == "Hour")
{
TempDate = TempDate.AddHours((Convert.ToInt32(item[0])));
mydata.CreatedDate = TempDate.ToString("dddd, MMM dd, yyyy hh:mm tt");
}
else if (GroupType == "Month")
{
TempDate = TempDate.AddMonths((Convert.ToInt32(item[0])));
mydata.CreatedDate = TempDate.ToString("MMMM, yyyy");
}
else
{
//DateTime NewDate = DateTime.Parse(date_from, CultureInfo.InvariantCulture, DateTimeStyles.None);
//NewDate = NewDate.AddDays(((Convert.ToInt32(item[0]) + 1) - 1) * 7);
//string NewDate1 = NewDate.ToLongDateString();
mydata.CreatedDate = item[0].ToString();
}
#endregion
cd.Add(mydata);
}
foreach (var item in d.TotalsForAllResults)
{
TotalsForAllResults tfa = new TotalsForAllResults();
tfa.metrics = item.Key;
tfa.count = Convert.ToInt32(item.Value);
tr.Add(tfa);
}
// At this point, d should contain the number of visitors you got between dates
return Json(new { TotalsForAllResults = tr, LineChartData = cd });
}
catch (Exception ex)
{
return Json(null);
}
}
public AnalyticsService AuthenticateUser()
{
// This is the physical path to the key file you downloaded when you created your Service Account
String key_file = @"E:\be8eab1c9893eac9f9fdac95cd64bcc58c86a158-privatekey.p12";//@"C:\Users\path\XXXXX-privatekey.p12";
// Is the "Email Address", not the "Client ID" one!!!
String client_id = "450122396803-jt0vt4do8ui6ah74iv1idh1pt9jsvqa6@developer.gserviceaccount.com"; //"0000000-xxxxx@developer.gserviceaccount.com";
// Probably the password for all is "notasecret"
String key_pass = "notasecret";
String scope_url = "https://www.googleapis.com/auth/" + Google.Apis.Analytics.v3.AnalyticsService.Scopes.Analytics.ToString().ToLower();
//scope_url = "https://www.googleapis.com/auth/analytics";
//scope_url = "https://www.googleapis.com/auth/analytics.readonly";
AuthorizationServerDescription desc = GoogleAuthenticationServer.Description;
X509Certificate2 key = new X509Certificate2(key_file, key_pass, X509KeyStorageFlags.Exportable);
AssertionFlowClient client = new AssertionFlowClient(desc, key) { ServiceAccountId = client_id, Scope = scope_url };
OAuth2Authenticator<AssertionFlowClient> auth = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState);
//AnalyticsService gas = new AnalyticsService(auth);
AnalyticsService gas = new AnalyticsService(new BaseClientService.Initializer() { Authenticator = auth });
return gas;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace GAExampleMVC.Models
{
public class TotalsForAllResults
{
public string metrics { get; set; }
public int count { get; set; }
public double Percent { get; set; }
public DateTime Time { get; set; }
}
public class CustomeData
{
public string CreatedDate { get; set; }
public int visits { get; set; }
public int pageviews { get; set; }
public int users { get; set; }
public int newUsers { get; set; }
public int sessions { get; set; }
public string avgSessionDuration { get; set; }
public double bounceRate { get; set; }
public double percentNewSessions { get; set; }
public double percentNewVisits { get; set; }
public string Location { get; set; }
public int uniquePageviews { get; set; }
public string pagePath { get; set; }
}
}
Google has release a new breed of Apis which are listed at Google Api Explorer, you can see the entry for Google Analytics. And there is a .Net client which provides .dlls for all of these Apis. This is Google so it is still in Beta but I'm developing off it with no issues.