0

誰かがGoogle.Apis.Analytics.v3 APIとサーバー認証を使用して共有できるサンプルのC#コードを持っていますか?自分のWebサイトで現在のユーザー数を取得できますか?Google AnalyticsリアルタイムAPI .Netクライアント

背景: MVCの内部Webサイトにサポートダッシュボードがあります。それはいくつかの有用なデータを照合するために異なるAPIにフックすることができます。 Googleアナリティクスのウェブポータルに表示されているように、私たちのウェブサイトに現在登録されているユーザー数を追加するリクエストがありました。

ユーザーにGoogleアカウントを個別にログインさせたくない場合は、「ServiceCredentials」メソッドを使用できると思っていましたが、迷ってしまいました。

ありがとうございました。

おかげ

答えて

0

アカウントレベルでのGoogle Analyticsのご利用のサービスアカウントへのアクセスを許可していることを確認します。

警告:GoogleアナリティクスAPIのクォータは、ビュー1日あたり10000リクエストです。 1日に10000件以上のリクエストをすると、ロックアウトされます。リアルタイムデータを頻繁にリフレッシュしようとしないでください。分単位でバックグラウンドスクリプトで行うのが理想です。

認証:

/// <summary> 
    /// Authenticating to Google using a Service account 
    /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount 
    /// </summary> 
    /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param> 
    /// <param name="serviceAccountCredentialFilePath">Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com</param> 
    /// <returns>AnalyticsService used to make requests against the Analytics API</returns> 
    public static AnalyticsService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath) 
    { 
     try 
     { 
      if (string.IsNullOrEmpty(serviceAccountCredentialFilePath)) 
       throw new Exception("Path to the service account credentials file is required."); 
      if (!File.Exists(serviceAccountCredentialFilePath)) 
       throw new Exception("The service account credentials file does not exist at: " + serviceAccountCredentialFilePath); 
      if (string.IsNullOrEmpty(serviceAccountEmail)) 
       throw new Exception("ServiceAccountEmail is required."); 

      // These are the scopes of permissions you need. It is best to request only what you need and not all of them 
      string[] scopes = new string[] { AnalyticsReportingService.Scope.Analytics };    // View your Google Analytics data 

      // For Json file 
      if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".json") 
      { 
       GoogleCredential credential; 
       using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read)) 
       { 
        credential = GoogleCredential.FromStream(stream) 
         .CreateScoped(scopes); 
       } 

       // Create the Analytics service. 
       return new AnalyticsService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Analytics Service account Authentication Sample", 
       }); 
      } 
      else if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".p12") 
      { // If its a P12 file 

       var certificate = new X509Certificate2(serviceAccountCredentialFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); 
       var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) 
       { 
        Scopes = scopes 
       }.FromCertificate(certificate)); 

       // Create the Analytics service. 
       return new AnalyticsService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Analytics Authentication Sample", 
       }); 
      } 
      else 
      { 
       throw new Exception("Unsupported Service accounts credentials."); 
      } 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Create service account AnalyticsService failed" + ex.Message); 
      throw new Exception("CreateServiceAccountAnalyticsFailed", ex); 
     } 
    } 
} 

要求:

public static class RealtimeSample 
{ 

    public class RealtimeGetOptionalParms 
    { 
     /// A comma-separated list of real time dimensions. E.g., 'rt:medium,rt:city'. 
     public string Dimensions { get; set; } 
     /// A comma-separated list of dimension or metric filters to be applied to real time data. 
     public string Filters { get; set; } 
     /// The maximum number of entries to include in this feed. 
     public int Max-results { get; set; } 
     /// A comma-separated list of dimensions or metrics that determine the sort order for real time data. 
     public string Sort { get; set; } 

    } 

    /// <summary> 
    /// Returns real time data for a view (profile). 
    /// Documentation https://developers.google.com/analytics/v3/reference/realtime/get 
    /// Generation Note: This does not always build corectly. Google needs to standardise things I need to figuer out which ones are wrong. 
    /// </summary> 
    /// <param name="service">Authenticated analytics service.</param> 
    /// <param name="ids">Unique table ID for retrieving real time data. Table ID is of the form ga:XXXX, where XXXX is the Analytics view (profile) ID.</param> 
    /// <param name="metrics">A comma-separated list of real time metrics. E.g., 'rt:activeUsers'. At least one metric must be specified.</param> 
    /// <param name="optional">Optional paramaters.</param>  /// <returns>RealtimeDataResponse</returns> 
    public static RealtimeData Get(analyticsService service, string ids, string metrics, RealtimeGetOptionalParms optional = null) 
    { 
     try 
     { 
      // Initial validation. 
      if (service == null) 
       throw new ArgumentNullException("service"); 
      if (ids == null) 
       throw new ArgumentNullException(ids); 
      if (metrics == null) 
       throw new ArgumentNullException(metrics); 

      // Building the initial request. 
      var request = service.Realtime.Get(ids, metrics); 

      // Applying optional parameters to the request.     
      request = (RealtimeResource.GetRequest)SampleHelpers.ApplyOptionalParms(request, optional); 

      // Requesting data. 
      return request.Execute(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Request Realtime.Get failed.", ex); 
     } 
    } 


} 
    public static class SampleHelpers 
{ 

    /// <summary> 
    /// Using reflection to apply optional parameters to the request. 
    /// 
    /// If the optonal parameters are null then we will just return the request as is. 
    /// </summary> 
    /// <param name="request">The request. </param> 
    /// <param name="optional">The optional parameters. </param> 
    /// <returns></returns> 
    public static object ApplyOptionalParms(object request, object optional) 
    { 
     if (optional == null) 
      return request; 

     System.Reflection.PropertyInfo[] optionalProperties = (optional.GetType()).GetProperties(); 

     foreach (System.Reflection.PropertyInfo property in optionalProperties) 
     { 
      // Copy value from optional parms to the request. They should have the same names and datatypes. 
      System.Reflection.PropertyInfo piShared = (request.GetType()).GetProperty(property.Name); 
      if (property.GetValue(optional, null) != null) // TODO Test that we do not add values for items that are null 
       piShared.SetValue(request, property.GetValue(optional, null), null); 
     } 

     return request; 
    } 
} 

コードは、私もここにGoogle Analytics Real-Time API with C# – What's happening now!

見つけることができるチュートリアルを持って Google Analytics API v3のための私のサンプルプロジェクトからリッピング
関連する問題