5

Sto provando a scrivere un'applicazione online per accedere ai miei dati di Google Analytics tramite un account di servizio di Google. Ecco il mio codice:Errore di risposta non valido durante il recupero dei dati di Google Analytics con un account di servizio in C# .NET

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace GA_server2server_POC.Models 
{ 
    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; 
    using Google.Apis.Services; 
    using Google.Apis.Requests; 

    public class Oauth_With_API 
    { 
     public static void ApiTest() 
     { 
      log4net.Config.XmlConfigurator.Configure(); 
      const string ServiceAccountId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"; 
      const string ServiceAccountUser = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdeveloper.gserviceaccount.com"; 
      AssertionFlowClient client = new AssertionFlowClient(
       GoogleAuthenticationServer.Description, new X509Certificate2("C:\\Users\\rcarter\\Downloads\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable)) 
      { 
       Scope = "https://www.googleapis.com/auth/analytics.readonly", 
       ServiceAccountId = ServiceAccountUser 
      }; 



      OAuth2Authenticator<AssertionFlowClient> authenticator = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState); 

      AnalyticsService service = new AnalyticsService(new BaseClientService.Initializer() 
      { 
       Authenticator = authenticator 
      }); 

      string profileId = "ga:xxxxxxxx"; 
      string startDate = "2013-07-01"; 
      string endDate = "2013-07-15"; 
      string metrics = "ga:visits"; 
      DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics); 
      request.Dimensions = "ga:date"; 
      GaData data = request.Execute(); //error occurs here. After this, thread exits. 

      Console.WriteLine(data.TotalResults); 

     } 
    } 
} 

Finora il mio codice viene eseguito, ma ottengo il seguente output:

WebDev.WebServer40.exe Information: 0 : DotNetOpenAuth, Version=4.0.0.11165, Culture=neutral, PublicKeyToken=2780ccd10d57b246 (official) 
WebDev.WebServer40.exe Information: 0 : Preparing to send AssertionFlowMessage (2.0) message. 
WebDev.WebServer40.exe Information: 0 : Sending AssertionFlowMessage request. 
WebDev.WebServer40.exe Information: 0 : HTTP POST https://accounts.google.com/o/oauth2/token 
WebDev.WebServer40.exe Information: 0 : The following required parameters were missing from the DotNetOpenAuth.OAuth2.Messages.AccessTokenFailedResponse message: {error, 
} 
WebDev.WebServer40.exe Information: 0 : Received UnauthorizedResponse response. 

Dopo questo, il thread, e il programma si rifiuta di stampare qualsiasi dei dati. Il problema sembra verificarsi a request.Execute();. La parte che trovo particolarmente confusa è che se metto un breakpoint su Console.WriteLine(data.TotalResults);, posso vedere i dati che voglio nella variabile locale data. Contiene tutto ciò che voglio stampare, ma non riesco a identificare la causa dell'errore impedendogli di fare qualcosa dopo request.Execute();. Dopo molte ricerche, non ho trovato molto sull'errore sopra elencato.

Il codice che sto utilizzando si basa sulla risposta fornita a questa domanda here. Alcune cose sono cambiate nelle librerie di google analytics dato che la domanda è stata risolta, ma gran parte del mio codice è la stessa.

Ho controllato e ricontrollato tutte le variabili specifiche dell'account. Per verificarlo, lo sto eseguendo sul mio computer locale come applicazione Web ASP.NET MVC 4.

Qualsiasi aiuto o consiglio su come risolvere questo problema è apprezzato. Per favore fatemi sapere se posso fornire ulteriori informazioni che potrebbero aiutare. Grazie per aver letto.

+0

E 'abbastanza easy.Problem è che non c'è molta documentazione/campioni sono disponibili qui. Ho persino convertito un po 'di codice java in .net equivalente poiché il campione era solo in java. Sto condividendo qualche codice che ho a disposizione localmente sul mio altro sistema. Faccio sapere se è d'aiuto o no. Altrimenti saprò inviarti un campione funzionante completo Grazie –

risposta

0

prova a seguire una

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; 
using Google.Apis.Services; 


     private void TestMethod() 
     { 
      try 
      { 
       string scope_url = "https://www.googleapis.com/auth/analytics.readonly"; 

       //client_id: This is the "Email Address" one, not the "Client ID" one... oddly... 
       string client_id = "************-***********************@developer.gserviceaccount.com"; 

       //key_file: This is the physical path to the key file you downloaded when you created your Service Account 
       string key_file = @"***************************************-privatekey.p12"; 

       //key_pass: This is probably the password for all key files, but if you're given a different one, use that. 
       string key_pass = "notasecret"; 


       AuthorizationServerDescription desc = GoogleAuthenticationServer.Description; 

       //key: Load up and decrypt the key 
       X509Certificate2 key = new X509Certificate2(key_file, key_pass, X509KeyStorageFlags.Exportable); 

       //client: we're using the AssertionFlowClient, because we're logging in with our certificate 
       AssertionFlowClient client = new AssertionFlowClient(desc, key) { ServiceAccountId = client_id, Scope = scope_url }; 
       OAuth2Authenticator<AssertionFlowClient> auth = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState); 

       //gas: An instance of the AnalyticsService we can query 
       // AnalyticsService gas = null;// new AnalyticsService(auth); 

       var gas = new AnalyticsService(new BaseClientService.Initializer() 
       { 
        Authenticator = auth 
       }); 
       //r: Creating our query 
       DataResource.GaResource.GetRequest r = gas.Data.Ga.Get("ga:*******", "2012-09-26", "2012-10-10", "ga:visitors"); 

       //d: Execute and fetch the results of our query 
       GaData d = r.Fetch(); 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 
     } 
+0

Ricorda che devi registrare l'email di client_id come utente amministratore nel tuo google analytics account –

Problemi correlati