¿Cómo uso una cuenta de servicio para acceder a la API V3 de Google Analytics con .NET C #?

Me di cuenta de que esta pregunta ya se había formulado anteriormente, pero con muy poco código de ejemplo, así que vuelvo a preguntar, pero con un poco de dirección.

Después de horas de búsqueda, he llegado a la siguiente implementación parcial.

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 = "nnnnnnnnnnn@developer.gserviceaccount.com"; 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(); } } } 

Tengo un par de problemas. La llamada a AssertionFlowClient.GetState(client) da como resultado una respuesta de “invalid_scope” como se ve en el registro DotNetOpenAuth de

2012-10-19 13: 27: 36,272 (GMT-4) [8] INFO DotNetOpenAuth – DotNetOpenAuth, Versión = 4.0.0.11165, Cultura = neutral, PublicKeyToken = 2780ccd10d57b246 (oficial) 2012-10-19 13: 27: 36,284 ( GMT-4) [8] DEPURAR DotNetOpenAuth.Messaging.Channel – Preparación para enviar el mensaje AssertionFlowMessage (2.0). 2012-10-19 13: 27: 36,294 (GMT-4) [8] INFO DotNetOpenAuth.Messaging.Channel: Mensaje saliente AssertionFlowMessage (2.0) preparado para https://accounts.google.com/o/oauth2/token : grant_type : assertion assertion_type: http://oauth.net/grant_type/jwt/1.0/bearer assertion: (aquí van un grupo de caracteres codificados)

2012-10-19 13: 27: 36,296 (GMT-4) [8] DEPURACIÓN DotNetOpenAuth.Messaging.Channel – Envío de la solicitud AssertionFlowMessage. 2012-10-19 13: 27: 36,830 (GMT-4) [8] DEPURACIÓN 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 de https://accounts.google.com/o/oauth2/token : {“error”: “invalid_scope”}

He intentado especificar uno o ambos de ServiceAccountId y ServiceAccountUser sin suerte.

En segundo lugar, incluso si obtengo un IAuthorizationState, no estoy seguro de cómo obtengo un IAuthenticator que se puede pasar al constructor de AnalyticsService.

El siguiente es el web.config que uso para habilitar el registro DotNetOpenAuth.

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

El siguiente código, corregido de mi pregunta original, se basa en el ejemplo proporcionado por Ian Fraser en:

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

Su código aborda tres cuestiones:

  1. Parece que AnalyticsService.Scopes.AnalyticsReadonly no funciona, al menos no para mí o para la forma en que lo estoy haciendo.
  2. Por algún motivo, ServiceAccountUser debe asignarse a la propiedad ServiceAccountId de la instancia AssertionFlowClient.
  3. OAuth2Authenticator proporciona el IAuthenticator que estaba buscando.

En su proyecto, incluya referencias a:

  • Lib \ DotNetOpenAuth.dll
  • Lib \ Google.Apis.dll
  • Lib \ Google.Apis.Authentication.OAuth2.dll
  • Servicios \ 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 = "nnnnnnnnnnn@developer.gserviceaccount.com"; 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(); } } } 

Estaba revisando ayer la API de análisis y noté cuán indocumentado estaba y no había muestras, etc.

De todos modos, he creado una biblioteca que podría usar para acceder a análisis fácilmente con un par de líneas y hacer un enlace de datos directo a DataTables para los datos devueltos, es de código abierto en el github, así que no dude en contribuir 🙂

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); 

Hay un mapeo de código directo para todos los comandos de informes API de Google categorizados de la misma manera que la API, incluso sin leer la documentación de la API, ya que todas las características están documentadas en los atributos, escribí el código que analizó la documentación api completa y dotó de recursos las Métricas, las Dimensiones, las Características Calculadas en un XML que generé a partir de clases físicas que podría usar directamente como en el ejemplo anterior. Es divertido jugar con 🙂 disfrutar

https://github.com/rmostafa/DotNetAnalyticsAPI

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

Aquí está mi ejemplo de trabajo publicado aquí [1]: Uso automatizado de google-api-dotnet-client con OAuth 2.0 Puse mucha investigación para encontrar y unir el código, espero que esto le ahorre algo de tiempo.

Con respecto a la respuesta de Richard Collette, tenga cuidado de usar su método si desea usar la API de Analytics en modo READONLY, la forma correcta de usarlo es:

 string Scope = "analytics.readonly" 

y no

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

como parece decir que hay un error. De hecho, el error es que el método .toString() devuelve analyticsreadonly y NOT analytics.readonly que es la forma que le gusta a Google. Eso es.