Come utilizzo un account di servizio per accedere all’API di Google Analytics V3 con .NET C #?

Mi sono reso conto che questa domanda è stata già posta in precedenza, ma con un po ‘di codice di esempio, quindi mi sto chiedendo di nuovo, ma con almeno un po’ di direzione.

Dopo ore di ricerche, ho realizzato la seguente implementazione parziale.

namespace GoogleAnalyticsAPITest.Console { using System.Security.Cryptography.X509Certificates; using DotNetOpenAuth.OAuth2; using Google.Apis.Analytics.v3; using Google.Apis.Analytics.v3.Data; using Google.Apis.Authentication.OAuth2; using Google.Apis.Authentication.OAuth2.DotNetOpenAuth; class Program { static void Main(string[] args) { log4net.Config.XmlConfigurator.Configure(); string Scope = Google.Apis.Analytics.v3.AnalyticsService.Scopes.Analytics.ToString().ToLower(); string scopeUrl = "https://www.googleapis.com/auth/" + Scope; const string ServiceAccountId = "nnnnnnnnnnn.apps.googleusercontent.com"; const string ServiceAccountUser = "[email protected]"; AssertionFlowClient client = new AssertionFlowClient( GoogleAuthenticationServer.Description, new X509Certificate2(@"7039572692013fc5deada350904f55bad2588a2a-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable)) { Scope = scopeUrl, ServiceAccountId = ServiceAccountId//,ServiceAccountUser = ServiceAccountUser }; IAuthorizationState state = AssertionFlowClient.GetState(client); AnalyticsService service = new AnalyticsService(authenticator); string profileId = "ga:xxxxxxxx"; string startDate = "2010-10-01"; string endDate = "2010-10-18"; string metrics = "ga:visits"; DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics); request.Dimensions = "ga:date"; GaData data = request.Fetch(); } } } 

Ho un paio di problemi. La chiamata a AssertionFlowClient.GetState(client) produce una risposta “invalid_scope” come si vede nel registro DotNetOpenAuth di

2012-10-19 13: 27: 36,272 (GMT-4) [8] INFO DotNetOpenAuth – DotNetOpenAuth, Versione = 4.0.0.11165, Cultura = neutro, PublicKeyToken = 2780ccd10d57b246 (ufficiale) 2012-10-19 13: 27: 36,284 ( GMT-4) [8] DEBUG DotNetOpenAuth.Messaging.Channel – Preparazione per l’invio del messaggio AssertionFlowMessage (2.0). 2012-10-19 13: 27: 36,294 (GMT-4) [8] INFO DotNetOpenAuth.Messaging.Channel – Messaggio in uscita AssertionFlowMessage (2.0) pronto per https://accounts.google.com/o/oauth2/token : grant_type : assertion assertion_type: http://oauth.net/grant_type/jwt/1.0/bearer assertion: (un gruppo di caratteri codificati va qui)

2012-10-19 13: 27: 36,296 (GMT-4) [8] DEBUG DotNetOpenAuth.Messaging.Channel – Invio di AssertionFlowMessage request. 2012-10-19 13: 27: 36,830 (GMT-4) [8] DEBUG DotNetOpenAuth.Http – HTTP POST https://accounts.google.com/o/oauth2/token 2012-10-19 13: 27: 36,954 (GMT-4) [8] ERROR DotNetOpenAuth.Http – WebException da https://accounts.google.com/o/oauth2/token : {“error”: “invalid_scope”}

Ho provato a specificare uno o entrambi ServiceAccountId e ServiceAccountUser senza fortuna.

In secondo luogo, anche se ottengo uno IAuthorizationState, non sono sicuro di come ottengo un IAuthenticator che può essere passato al costruttore di AnalyticsService.

Quello che segue è il web.config che uso per abilitare la registrazione DotNetOpenAuth.

    
<!--
-->
<!----> <!-- --> <!-- --> <!---->

Il seguente codice, corretto dalla mia domanda originale, si basa sull’esempio fornito da Ian Fraser in:

https://groups.google.com/forum/#!msg/google-search-api-for-shopping/4uUGirzH4Rw/__c0e4hj0ekJ

Il suo codice ha affrontato tre problemi:

  1. Sembra che AnalyticsService.Scopes.AnalyticsReadonly non funzioni, almeno non per me o il modo in cui lo sto facendo.
  2. Per qualche motivo, ServiceAccountUser deve essere assegnato alla proprietà ServiceAccountId dell’istanza AssertionFlowClient.
  3. OAuth2Authenticator fornisce l’IAuthenticator che stavo cercando.

Nel tuo progetto, includi riferimenti a:

  • Lib \ DotNetOpenAuth.dll
  • Lib \ Google.Apis.dll
  • Lib \ Google.Apis.Authentication.OAuth2.dll
  • Services \ AnalyticsService \ Google.Apis.Analytics.v3.dll

 namespace GoogleAnalyticsAPITest.Console { using System.Security.Cryptography.X509Certificates; using Google.Apis.Analytics.v3; using Google.Apis.Analytics.v3.Data; using Google.Apis.Authentication.OAuth2; using Google.Apis.Authentication.OAuth2.DotNetOpenAuth; using Google.Apis.Util; class Program { static void Main(string[] args) { log4net.Config.XmlConfigurator.Configure(); const string ServiceAccountId = "nnnnnnnnnnn.apps.googleusercontent.com"; const string ServiceAccountUser = "[email protected]"; AssertionFlowClient client = new AssertionFlowClient( GoogleAuthenticationServer.Description, new X509Certificate2(@"value-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable)) { Scope = AnalyticsService.Scopes.AnalyticsReadonly.GetStringValue(), ServiceAccountId = ServiceAccountUser //Bug, why does ServiceAccountUser have to be assigned to ServiceAccountId //,ServiceAccountUser = ServiceAccountUser }; OAuth2Authenticator authenticator = new OAuth2Authenticator(client, AssertionFlowClient.GetState); AnalyticsService service = new AnalyticsService(authenticator); string profileId = "ga:64968920"; string startDate = "2010-10-01"; string endDate = "2010-10-31"; string metrics = "ga:visits"; DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics); request.Dimensions = "ga:date"; GaData data = request.Fetch(); } } } 

Ieri stavo verificando l’API di analisi e ho notato quanto non documentato e nessun campione, ecc.

In ogni caso, ho creato una libreria che è ansible utilizzare per accedere facilmente all’analisi con un paio di righe e creare un collegamento diretto a DataTable per i dati restituiti è open source sul github quindi sentiti libero di contribuire 🙂

https://github.com/rmostafa/DotNetAnalyticsAPI

uso

 Analytics.AnalyticsManager manager = new Analytics.AnalyticsManager(Server.MapPath("~/bin/privatekey.p12"), "YOUR_EMAIL"); manager.LoadAnalyticsProfiles(); List metrics = new List(); metrics.Add(Analytics.Data.Visitor.Metrics.visitors); metrics.Add(Analytics.Data.Session.Metrics.visits); List dimensions = new List(); dimensions.Add(Analytics.Data.GeoNetwork.Dimensions.country); dimensions.Add(Analytics.Data.GeoNetwork.Dimensions.city); System.Data.DataTable table = manager.GetGaDataTable(DateTime.Today.AddDays(-3), DateTime.Today, metrics, dimensions, null, metrics); 

Esiste una mapping diretta del codice per tutti i comandi di segnalazione dell’API di Google suddivisi in categorie allo stesso modo dell’API, quindi è ansible farlo anche senza leggere la documentazione dell’API poiché tutte le funzionalità sono documentate negli attributi, ho scritto codice che ha analizzato la documentazione completa dell’API e risorse di Metriche, Dimensioni, Funzionalità calcolate in un XML che ho generato da classi fisiche che potresti utilizzare direttamente come nell’esempio precedente è divertente da giocare 🙂

https://github.com/rmostafa/DotNetAnalyticsAPI

 string scope = Google.Apis.Util.Utilities.GetStringValue(AnalyticsService.Scopes.AnalyticsReadonly); 

Ecco il mio esempio di lavoro pubblicato qui [1]: Uso automatizzato di google-api-dotnet-client con OAuth 2.0 Ho messo molte ricerche per trovare e mettere insieme il codice sperando che questo ti risparmi un po ‘di tempo.

Per quanto riguarda la risposta di Richard Collette, fai attenzione a usare il suo metodo se vuoi utilizzare l’API di Analytics in modalità READONLY, il modo corretto per usarlo è:

 string Scope = "analytics.readonly" 

e non

 string Scope = AnalyticsService.Scopes.AnalyticsReadOnly.ToString().ToLower() 

come sembra dire che c’è un bug. In effetti, il bug è che il metodo .toString() restituisce analyticsreadonly e NOT analytics.readonly che è il modo che piace a Google. Questo è tutto.