0

有沒有人可以使用Google.Apis.Analytics.v3 API和服務器身份驗證來分享他們可以共享的任何示例c#代碼,以獲取我網站上的當前用戶數量。Google Analytics實時API .Net客戶端

背景: 我有一個MVC內部網站,有一個支持儀表板。它可以鉤入不同的API來整理一些有用的數據。 我要求添加Google Analytics門戶網站上顯示的當前用戶數量。

我不想讓用戶單獨使用Google帳戶登錄,我希望可以使用「ServiceCredentials」方法,但我迷路了。

感謝任何幫助。

感謝

回答

0

確保您授予在帳戶級別在谷歌分析您的服務帳戶訪問。

警告:Google Analytics API中的配額是每天每個視圖10000個請求。如果您在一天內提出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 API v3我也有可以在這裏找到Google Analytics Real-Time API with C# – What's happening now!

教程