Comment puis-je utiliser un Compte de Service pour Accéder à l'API de Google Analytics V3 .NET C#?
J'ai réalisé cette question a déjà été posée mais avec peu de la manière de l'exemple de code, donc, je demande à nouveau, mais avec au moins un peu de direction.
Après des heures de recherche, j'en suis venu à la suite de la mise en œuvre partielle.
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();
}
}
}
J'ai quelques questions. L'appel à AssertionFlowClient.GetState(client)
résultats dans un "invalid_scope" réponse comme on le voit dans le DotNetOpenAuth journal de
2012-10-19 13:27:36,272 (GMT-4) [8] INFO DotNetOpenAuth - DotNetOpenAuth, Version=4.0.0.11165, Culture=neutral, PublicKeyToken=2780ccd10d57b246 (officiel)
2012-10-19 13:27:36,284 (GMT-4) [8] DEBUG DotNetOpenAuth.De messagerie.Canal - Préparation à envoyer AssertionFlowMessage (2.0) message.
2012-10-19 13:27:36,294 (GMT-4) [8] INFO DotNetOpenAuth.De messagerie.Canal - sortant Préparé AssertionFlowMessage (2.0) message pour https://accounts.google.com/o/oauth2/token:
grant_type: affirmation
assertion_type: http://oauth.net/grant_type/jwt/1.0/bearer
affirmation: (un tas de caractères codés rendez-vous ici)2012-10-19 13:27:36,296 (GMT-4) [8] DEBUG DotNetOpenAuth.De messagerie.Canal - Envoi AssertionFlowMessage demande.
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] ERREUR DotNetOpenAuth.Http - WebException de https://accounts.google.com/o/oauth2/token:
{
"erreur" : "invalid_scope"
}
J'ai essayé de préciser une ou deux ServiceAccountId et ServiceAccountUser avec pas de chance.
Deuxième, même si je suis un IAuthorizationState, je ne suis pas sûr de savoir comment j'obtiens une IAuthenticator qui peut être transmis à la AnalyticsService constructeur.
Suivant est le web.config je utiliser pour activer DotNetOpenAuth de journalisation.
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.10.0, Culture=neutral, publicKeyToken=1b44e1d426115821" />
<!--<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" requirePermission="false"/>-->
<sectionGroup name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection, DotNetOpenAuth">
<section name="openid" type="DotNetOpenAuth.Configuration.OpenIdElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
<section name="oauth" type="DotNetOpenAuth.Configuration.OAuthElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
<section name="messaging" type="DotNetOpenAuth.Configuration.MessagingElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
<section name="reporting" type="DotNetOpenAuth.Configuration.ReportingElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
</sectionGroup>
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="DotNetOpenAuth.log"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="100KB"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date (GMT%date{%z}) [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<appender name="TracePageAppender" type="OpenIdProviderWebForms.Code.TracePageAppender, OpenIdProviderWebForms">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date (GMT%date{%z}) [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="ALL"/>
<appender-ref ref="RollingFileAppender"/>
<appender-ref ref="TracePageAppender"/>
</root>
<!-- Specify the level for some specific categories -->
<logger name="DotNetOpenAuth">
<level value="ALL"/>
</logger>
</log4net>
<dotNetOpenAuth>
<!-- This is an optional configuration section where aspects of dotnetopenauth can be customized. -->
<!-- For a complete set of configuration options see http://www.dotnetopenauth.net/developers/code-snippets/configuration-options/-->
<!--<messaging clockSkew="00:10:00" lifetime="00:03:00" strict="true">-->
<!--<messaging>
<untrustedWebRequest timeout="00:00:30" readWriteTimeout="00:00:01.500" maximumBytesToRead="1048576" maximumRedirections="10">
<whitelistHosts>
-->
<!-- Uncomment to enable communication with localhost (should generally not activate in production!) -->
<!--
<add name="localhost"/>
</whitelistHosts>
</untrustedWebRequest>
</messaging>-->
<!-- Allow DotNetOpenAuth to publish usage statistics to library authors to improve the library. -->
<reporting enabled="false"/>
</dotNetOpenAuth>
<appSettings>
<!--<add key="log4net.Internal.Debug" value="true" />-->
</appSettings>
<runtime>
</runtime>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
OriginalL'auteur Richard Collette | 2012-10-19
Vous devez vous connecter pour publier un commentaire.
Le code suivant, corrigée de ma question initiale, est basée sur l'exemple fourni par Ian Fraser:
https://groups.google.com/forum/#!msg/google-search-api-pour-achat/4uUGirzH4Rw/__c0e4hj0ekJ
Son code est penché sur trois questions:
Dans votre projet, inclure des références à:
-
pouvez-vous préciser comment vous êtes authentifié? Je devine que vous dites que vous définissez la ServiceAccountId à un nnnnnnnnnnn.apps.googleusercontent.com valeur mais je ne suis pas sûr que ce soit ce que tu veux dire. J'ai édité le code pour définir la portée de "l'analytique.readonly" puisque c'est probablement le principal moyen que les gens vont l'utiliser.
Je suis désolé, vous avez été correct. J'ai mis le ServiceAccountId à [email protected]. Je n'ai pas besoin de considérer nnnnnnnnnnn.apps.googleusercontent.com en aucune façon.
Dans l'espace de noms de Google.Les api.Util il est une extension de la méthode de récupération de la chaîne de valeur de la AnalyticsService.Les étendues enum, AnalyticsService.Étendues.AnalyticsReadonly.GetStringValue().
peut-être vous devriez envisager d'ajouter le drapeau X509KeyStorageFlags.MachineKeySet trop? Sinon, l'identité du pool d'applications a besoin d'un profil où il peut stocker le certificat. nouveau X509Certificate2(@"valeur-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet)
OriginalL'auteur Richard Collette
Je vérifiais l'analytics API hier et remarqué comment les sans-papiers, il est et pas des échantillons, etc.
Toute façons, j'ai créé une bibliothèque que vous pouvez utiliser pour accéder à google analytics facilement avec un couple de lignes et de faire directement de liaison de données pour les tables de données pour les données renvoyées il est open source sur github, donc n'hésitez pas à contribuer 🙂
https://github.com/rmostafa/DotNetAnalyticsAPI
Utilisation
Il y a des codes de la cartographie pour Tous les API de Google de Déclaration des commandes classés de la même manière que l'API de sorte que vous pourrait-il même sans lire la Documentation de l'API du tout, car toutes les fonctions sont documentés dans les attributs, j'ai écrit le code qui analysé la documentation complète de l'api et de financer les mesures, les Dimensions, Calculés en Fonctions dans un fichier XML que j'ai généré à partir de physique des classes que vous pouvez utiliser directement comme dans l'exemple ci-dessus, il est amusant de jouer avec 🙂 enjoy
https://github.com/rmostafa/DotNetAnalyticsAPI
OriginalL'auteur Ramy Mostafa
OriginalL'auteur nemaroller
Voici mon exemple de travail posté ici [1]: Utilisation automatique de google-api-dotnet-client OAuth 2.0 j'ai mis beaucoup de recherche pour trouver et assembler le code espère que cela vous fait gagner du temps.
OriginalL'auteur ChiefSoaringSQL
Concernant Richard Collette réponse, veillez à ce que l'aide de sa méthode si vous souhaitez utiliser google Analytics API en mode READONLY, la bonne façon de l'utiliser est:
et pas
comme il semble dire qu'il y a un bug. En fait, le bug est que le
.toString()
méthode renvoieanalyticsreadonly
et PASanalytics.readonly
qui est la façon dont Google aime. C'est tout.Dans l'espace de noms de Google.Les api.Util il est une extension de la méthode de récupération de la chaîne de valeur de la AnalyticsService.Les étendues enum, AnalyticsService.Étendues.AnalyticsReadonly.GetStringValue().
OriginalL'auteur Julian Xhokaxhiu