Analytics API Beispiel (C#/CSharp/ASP.NET)

Dieses CSharp (C#) bzw. ASP.NET Code Snippet zeigt, wie man mit Hilfe der von Google zur Verfügung gestellten Analytics API Client Bibliothek auf die entsprechenden Analytics Statistiken zugreift.

Da die Anayltics API mittlerweile keinen Zugriff mehr über Login/Passwort erlaubt, kommt das OAuth Verfahren zur Authentifizierung zum Einsatz. Hierbei wird der Nutzer, sofern noch keine Authentifizierung vorliegt, auf eine Google eigene Seite umgeleitet, auf welcher er sich authentifizieren und dann den Zugriff freigeben Kann. Nach der Freigabe des Zugriffs auf die Analytics Daten, gelangt der Nutzer wieder zurück auf die ASP.NET Anwendung, wobei über einen Parameter ein Authentifizierungs-Code übergeben wird.

Um die Analytics API nutzen zu können, muss man als Entwickler zunächst die geplante Anwendung bei Google registieren. Hierbei müssen folgende Schritte durchgeführt werden:

  • Anmeldung unter der Google API Console https://code.google.com/apis/console/
  • Aktivierung der Analytics API unter dem Menüpunkt Services
  • Anlegen einer Web Application Client ID unter dem Menüpunkt API Access, wobei als Redirect URI die URL der eigenen Web Applikation eingetragen werden muss, von der aus der Authentifizierungsprozess gestartet wird (auf diese URL wird dann von Goolge nach der erfolgten Authentifizierung zurück umgeleitet, wobei der Authentifizierungscode als Parameter übergeben wird).
  • Notieren des Client ID und Client Secret Wertes für die spätere Verwendung im eignen Programmcode
  • Laden Sie die Google APIs Client Library für .NET herunter und extrahieren Sie das ZIP-Archiv
  • Kopieren Sie alle DLL Dateien aus dem /lib/ Unterverzeichnis in das /bin/ Unterverzeichnis Ihrer ASP.NET Web-Applikation
  • Kopieren Sie die Google.Apis.Analytics.v3.dll aus dem /Services/AnalyticsService/ Unterverzeichnis in das /bin/ Unterverzeichnis Ihrer ASP.NET Web-Applikation


Anschließend kann man direkt den unten aufgeführte Beispiel-Code nutzen, um über die Analytics API auf Statistiken zuzugreifen.

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Globalization;
using DotNetOpenAuth.OAuth2;
using DotNetOpenAuth.Messaging;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis;
using Google.Apis.Util;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;


public partial class _Report : System.Web.UI.Page
{
    private string ClientID = "<your-client-id>";
    private string ClientSecret = "<your-client-secret>";

    private AnalyticsService _service;
    private OAuth2Authenticator<WebServerClient> _authenticator;
    private IAuthorizationState _state;

    protected void Page_Load(object sender, EventArgs e)
    {
      if (_service == null)
      {
          _service = new AnalyticsService(_authenticator = CreateAuthenticator());
      }

      // check if OAuth2 authentication code was passed
      if (HttpContext.Current.Request["code"] != null)
      {
          _authenticator.LoadAccessToken();
      }

      if (!IsPostBack)
      {
        // get analytics profiles in account
        Profiles myProfiles = _service.Management.Profiles.List("~all", "~all").Fetch();

          if (myProfiles.Items.Count > 0)
          {
              // get sample statistics for first profile found
              var request = _service.Data.Ga.Get(
                  "ga:" + myProfiles.Items[0].Id, 
                  "2012-06-01", // start date 
                  "2012-06-30", // end date
                  "ga:visitors,ga:pageviews" // metrics to include in report 
                  );

              request.Dimensions = "ga:date";
              //request.Filters = "";
              request.Sort = "ga:date";
              request.StartIndex = 1;
              request.MaxResults = 500;

              GaData results = request.Fetch();

              // do whatever you like with the report data
          }
      }
    }

    private IAuthorizationState AuthState
    {
        get
        {
            return _state ?? HttpContext.Current.Session["AUTH_STATE"] 
                as IAuthorizationState;
        }
    }

    private OAuth2Authenticator<WebServerClient> CreateAuthenticator()
    {
        WebServerClient myWebServerClient = 
            new WebServerClient(GoogleAuthenticationServer.Description);
        
        myWebServerClient.ClientIdentifier = this.ClientID;
        myWebServerClient.ClientSecret = this.ClientSecret;

        OAuth2Authenticator<WebServerClient> myOAuth2Authenticator = 
            new OAuth2Authenticator<WebServerClient>(myWebServerClient, GetAuthorization);
        
        return myOAuth2Authenticator;
    }

    private IAuthorizationState GetAuthorization(WebServerClient myWebServerClient)
    {
        // if user already authenticated => return state
        IAuthorizationState state = AuthState;
        
        if (state != null)
        {
            return state;
        }

        // if authorization request already in progress
        state = myWebServerClient.ProcessUserAuthorization(
            new HttpRequestInfo(HttpContext.Current.Request)
        );
        
        if (state != null && (!string.IsNullOrEmpty(state.AccessToken) 
            || !string.IsNullOrEmpty(state.RefreshToken)))
        {
            HttpContext.Current.Session["AUTH_STATE"] = _state = state;
            return state;
        }

        // otherwise start new authorization request for analytics scope
        string[] scopes = new string[] { 
            "https://www.google.com/analytics/feeds/", 
            "https://www.googleapis.com/auth/analytics.readonly" };

        OutgoingWebResponse response = 
            myWebServerClient.PrepareRequestUserAuthorization(scopes);
        
        response.Send();
        
        return null;
    }
}