使用 NET.Core 串接 Google Analytics API 來顯示即時分析數據

當我們建立服務型網站時,通常希望能夠獲得來訪者的相關資訊,一種常見的土炮方法是在網頁上自行開發程式以取得使用者的相關資訊,但我們所能取得的資訊有限,很多數據可能需要後續處理,例如使用者的國家別,甚至可能沒辦法取得,因此分析起來可能相對不夠完整,身為開發者應該都知道不要重複造輪子,而且現有的分析工具眾多,基於站在巨人的肩膀上的原則,當然很自然的選擇 Google 提供的服務。

Google Analytics(GA) 是由 Google 提供的網站流量統計服務,只要在想要監控的網頁加入 GA 提供的一小段 JavaScript 代碼,每當用戶訪問該頁面時,就會將相關資訊如使用者所在國家、進入該頁面的關鍵字等傳送至 GA 伺服器,並整合成易讀的報表供網站擁有者查看。

另外,GA4 還提供了多種預設的分析報表,並且還可以自訂不同的分析維度,下圖展示了登入後可見的其中一個數據畫面,網路上有許多專家分享如何使用 GA4,這裡就不再贅述,建議自行查找相關資料以了解如何使用 GA4。

因為本身有開發 寶貝評論+ 的分享平台,因此我也不例外會需要查看使用者的分析數據,但作為一名熱愛程式開發的軟體開發者,當然會希望在自己的管理後台看到我需要的數據,如下圖是整合後的其中一個畫面。

幸運的是,GA4 提供了 API 可供串接,雖然有呼叫頻率限制,詳細資訊可參考官方的限制與配合,除非你是每分鐘都在查看分析數據的重度使用者,否則應該是足夠使用的。接下來這篇文章,我要記錄一下如何使用 NET.Core 來呼叫 Google Analytics Data API。


建立服務的步驟

在開始之前,必須先建立 Google Cloud 專案並啟用相關設定。官方的 API 快速入門導覽課程 紀錄得非常清楚,這裡只列出幾個重要的步驟。

  • 建立 Google Cloud 專案,若已有存在的專案可跳過此步驟。

  • 啟用 Google Analytics Data API。

  • 建立憑證->服務帳戶。

  • 服務帳戶 -> 新增金鑰 -> 建立新的金鑰 -> JSON,下載產出的 JSON 檔案。


  • 將 JSON 檔內的 email 加入到 GA 檢視者的角色,並取得 PropertyId 後即可進行串接的開發。
    • 新增權限。

    • 查看 PropertyId。


程式開發的步驟

  • 本文使用 Google.Analytics.Data.V1Beta 套件進行開發,但該套件目前尚未有 NET.Core Release 版本,不過我實際使用上並無太大問題,若要使用 NuGet 安裝該套件,請記得勾選包含搶鮮版,否則可能會找不到。

  • 定義類別,底下的範例僅列出取得過去 N 天的使用者統計數據的方法,其它需求都可以參考官方的文件內找到對應事件,這裡就不一一列出了。
    using Google.Analytics.Data.V1Beta;
    
    namespace PrimeEagleX.Lib.Google;
    
    public class Analytics
    {
        public Analytics(string credentialPath)
        {
            // 1. 請先將設定檔內的 client_email 邀請到 GA 內的檢視者當中 
            Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", credentialPath);
        }
    
        /// 
        /// 取得過去 N 天的使用者統計數據
        /// 
        /// 屬性識別碼 YOUR-GA4-PROPERTY-ID
        /// 過去天數(不包含今日) 
        public UserStatisticsViewModel GetUserStatisticsForPastDays(string propertyId, int numberOfDays = 7)
        {
            var client = BetaAnalyticsDataClient.Create();
    
            var requestRealTime = new RunReportRequest
            {
                Property = "properties/" + propertyId,
                Metrics = {
                    new Metric { Name = "activeUsers" },
                    new Metric{ Name = "newUsers" }
                },
                Dimensions = { },
                DateRanges = { }
            };
    
            var today = DateTime.Now;
    
            var dateRange = new DateRange();
            dateRange.StartDate = today.AddDays(numberOfDays * -1).ToString("yyyy-MM-dd");
            dateRange.EndDate = today.AddDays(-1).ToString("yyyy-MM-dd");
            requestRealTime.DateRanges.Add(dateRange);
    
            var response = client.RunReport(requestRealTime);
    
            return new UserStatisticsViewModel
            {
                ActiveUsers = int.Parse(response.Rows[0].MetricValues[0].Value),
                NewUsers = int.Parse(response.Rows[0].MetricValues[1].Value)
            };
        }
    }
    
  • 使用方式如下。
    var analytics = new Analytics("請調整成 ga4-api-config.json 下載後的實際路徑");
    var result = new GoogleAnalyticsHistoryReportViewModel
    {
    	Days_7 = analytics.GetUserStatisticsForPastDays("上文提到的 PropertiyId", numberOfDays: 7),
    	Days_30 = analytics.GetUserStatisticsForPastDays("上文提到的 PropertiyId", numberOfDays: 30),
    };
    


參考網站

Coding4Fun - 用 C# 寫 Google Analytics 即時報表

Google Cloud Libraries for .NET


留言