I've been trying to retrieve Google analytics reports using their provided .NET api and have really been scratching my head over how I actually retrieve anything using the newest version, v3, which is available here: http://code.google.com/apis/analytics/docs/gdata/v3/gdataLibraries.html
For example, I'd like to retrieve a report query like this one: https://www.google.com/analytics/feeds/data?dimensions=ga:browser&end-date=2012-01-25&ids=ga:ACCOUNTID&metrics=ga:visits&start-date=2011-12-25
I'm able to return reports just fine using version 2 which uses GData, but was hoping to get version 3 going in case version 2 was deprecated, but having a lot of trouble seeing as meaningful documentation seems to be outdated or non-existant and I haven't been able to find any examples.
We've just updated our analytics service to use v3.0 of the API as v2.3 is now deprecated, there is a migration guide on google https://developers.google.com/analytics/resources/articles/gdata-migration-guide which might help.
I tried using the google dotnet API http://code.google.com/p/google-api-dotnet-client/ which supports v3 but gave up as there is a lack of documentation and samples. We're calling the api through a net.httpwebrequest which was easier than trying to work out what's going on in the API.
For v3 your call should be to
https://www.googleapis.com/analytics/v3/data/ga?dimensions=ga:browser&end-date=2012-01-25&ids=ga:ACCOUNTID&metrics=ga:visits&start-date=2011-12-25
This is now possible and easy to do with the latest release of the .NET API (v1.3.0.15233). There is no example though that has been released but you can use the Task sample as a pattern to query GA data.
Here's what you need to add/change to make that sample project work for GA.
Declare an instance of the AnalyticsService
private static AnalyticsService _analyticsService;
Change the scope to Scopes.Analytics
There is a variable scope
declared inside the method GetAuthorization
. Change it from
string scope = TasksService.Scopes.TasksReadonly.GetStringValue();
to
string scope = AnalyticsService.Scopes.Analytics.GetStringValue();
Initialize your GA service
if (_analyticsService == null)
{
_analyticsService = new AnalyticsService(new BaseClientService.Initializer()
{
Authenticator = _authenticator = CreateAuthenticator();
});
}
Making a Query
This is how you can query a GA profile
// make a request
var request = _analyticsService.Data.Ga.Get(
"ga:12345678",
"2013-01-01",
"2013-05-08",
"ga:visits,ga:bounces,ga:timeOnSite,ga:avgTimeOnSite");
// run the request and get the data
var data = request.Fetch();
You will notice that there are four required arguments for the GetRequest
similar to what is defined in the API Doc. You can visit the query explorer to know the valid metrics to use with the .NET API.
After several days of searching achieve access Analitycs, is a console project framework 3.5.
* Must you have a google APIs Console project with Analytics API service activated.
* In Simple API Access must generate a new key for Client ID for installed applications.
* Download and add reference to Google.Apis.Analytics.v3.dll
* Download and add reference to Google.Apis.Authentication.OAuth2.dll
* Download and add reference to Google.Apis.dll
* Download and add reference to Newtonsoft.Json.Net35.dll
* Download and add reference to DotNetOpenAuth.dll
And finally implement the following code:
private const string Scope = "https://www.googleapis.com/auth/analytics.readonly";
static void Main(string[] args)
{
try
{
var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description);
provider.ClientIdentifier = "Your_Client_ID";
provider.ClientSecret = "Your_Client_Secret";
var auth = new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthentication);
var asv = new AnalyticsService(auth);
var request = asv.Data.Ga.Get("ga:Your_TrackingID", "2013-08-05", "2013-08-05", "ga:visitors");
request.Dimensions = "ga:visitorType";
var report = request.Fetch();
var rows = report.Rows;
var newVisitors = rows[0];
var returnVisitors = rows[1];
Console.WriteLine(newVisitors[0] + ": " + newVisitors[1]);
Console.WriteLine(returnVisitors[0] + ": " + returnVisitors[1]);
int newV = Int32.Parse(newVisitors[1]);
int retV = Int32.Parse(returnVisitors[1]);
int sum = newV + retV;
Console.WriteLine("Total: " + sum);
}
catch(Exception ex){
Console.WriteLine("\n Error: \n" + ex);
Console.ReadLine();
}
}
private static IAuthorizationState GetAuthentication(NativeApplicationClient arg)
{
IAuthorizationState state = new AuthorizationState(new[] { Scope });
state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
Uri authUri = arg.RequestUserAuthorization(state);
System.Diagnostics.Process.Start(authUri.ToString());
Console.Write("Paste authorization code: ");
string authCode = Console.ReadLine();
return arg.ProcessUserAuthorization(authCode, state);
}
Hope this helps.
I posted step by step instructions on how to do this here: Google V3 Beta API How To
Additional full example with service account.
Install nuget package Google.Apis.Analytics.v3.
//based on https://github.com/LindaLawton/Google-Dotnet-Samples/tree/master/Google-Analytics
using System;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util;
using System.Collections.Generic;
using Google.Apis.Services;
namespace GAImport
{
class Program
{
static void Main(string[] args)
{
string[] scopes = new string[] { AnalyticsService.Scope.AnalyticsReadonly };
var keyFilePath = @"path\to\key.p12";
var serviceAccountEmail = "someuser@....gserviceaccount.com";
//loading the Key file
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = scopes
}.FromCertificate(certificate));
var service = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Analytics API Sample",
});
var request = service.Data.Ga.Get("ga:1234567", "30daysAgo", "yesterday", "ga:sessions");
request.MaxResults = 1000;
var result = request.Execute();
foreach (var headers in result.ColumnHeaders)
{
Console.WriteLine(String.Format("{0} - {1} - {2}", headers.Name, headers.ColumnType, headers.DataType));
}
foreach (List<string> row in result.Rows)
{
foreach (string col in row)
{
Console.Write(col + " ");
}
Console.Write("\r\n");
}
Console.ReadLine();
}
}
}