[料理佳餚] C# 用 Google Analytics Reporting API 來抓取特定 URL 的 PageView

Google Analytics(簡稱 GA)是 Google 推出的流量分析服務,既免費又強大,做商業網站的我們多少要會一點,通常我們查看流量分析的數據大都是到 GA 的網站,如果我們反過來把 GA 當成是資料來源,那麼我們怎麼從 GA 來取得流量的數據?

我們就從「抓取特定 URL 的 PageView」的這樣一個簡單的範例來切入,來看看我們要怎麼使用 Google Analytics Reporting API 取得我們放在 GA 的流量數據。

建立專案

先前往 https://console.developers.google.com 建立專案(或是用既有的專案也可以)

啟用 API 和服務

將這個專案要使用到的 Google API 新增進來,瀏覽到「資訊主頁」,點擊「啟用 API 和服務」。

在上方搜尋框輸入「analytics」,找到「Google Analytics Reporting API」,點擊進去之後把它啟用。

建立服務帳戶金鑰

接著建立認證用的憑證,我選擇用服務帳戶來跟 Google 做認證,瀏覽到「憑證」,點擊「建立憑證」->「服務帳戶金鑰」。

點選「新增服務帳戶」,輸入「服務帳戶名稱」,角色可以不用選,「金鑰類型」選擇 JSON,「服務帳戶 ID」先抄下來,稍後會用到,沒有抄到沒關係,在待會兒下載的 JSON 檔案裡面也有。

點擊「建立」會下載一個 JSON 檔案,請妥善保存,遺失了就要重新產生金鑰。

新增 GA 使用者

前往 GA 的網站,瀏覽到「管理」畫面,然後我們可以看到有三個區塊可以做使用者管理,我們要將剛剛抄下來的服務帳戶 ID 新增到其中一個去,這三個區塊代表著三種不同的存取範圍,要新增到哪一個區塊去,就看我們自己的需求。

依據最少權限原則,我選擇存取範圍最小的資料檢視區塊,進入畫面之後點擊右上角的新增按鈕,選擇「新增使用者」。

在「電子郵件地址」輸入剛剛抄下來的服務帳戶 ID,勾選「權限」之後,點擊右上角的新增按鈕。

撰寫程式

終於要來寫程式了,先到 NuGet 安裝 Google.Apis.AnalyticsReporting.v4,然後將剛剛下載的 JSON 檔案複製到專案中,把「複製到輸出目錄」的屬性設成「有更新時才複製」。

建立憑證物件

呼叫 GoogleCredential.FromFile() 方法,建立憑證物件。

var googleCredential = GoogleCredential.FromFile("xxx.json").CreateScoped(AnalyticsReportingService.Scope.Analytics);

建立 AnalyticsReportingService 物件

其中 ApplicationName 是用來方便我們識別用的,隨意輸入即可。

var analyticsReporting = new AnalyticsReportingService(
    new BaseClientService.Initializer
    {
        HttpClientInitializer = googleCredential,
        ApplicationName = "GA Lab"
    });

建立 Dimension 物件

Dimension 相當於我們從 GA 網站上看到的「維度」,我這邊指定我的維度為 ga:pagePath

var dimension = new Dimension { Name = "ga:pagePath" };

過濾維度(選擇性)

如果想要對維度做過濾,需要建立 DimensionFilterClauseDimensionFilter,DimensionFilter 的 Expressions 預設是用正則表達式去比對。

var dimension = new Dimension { Name = "ga:pagePath" };

var dimensionFilter = new DimensionFilter
                      {
                          DimensionName = "ga:pagePath",
                          Expressions = new List<string> { "^/supershowwei/2016/01/26/145353$" }
                      };

var dimensionFilterClause = new DimensionFilterClause { Filters = new List<DimensionFilter> { dimensionFilter } };

建立 Metric 物件

Metric 相當於我們從 GA 網站上看到的「指標」,我這邊指定我的指標為 ga:pageviews

var metric = new Metric { Expression = "ga:pageviews" };
額外說明一下,Metric 的 Expression 是可以做四則運算的,比如說我指定 ga:pageviews/ga:sessions 就可以回傳 ga:pageviews 除以 ga:sessions 的結果,另外,維度與指標相關的代碼可以在 Dimensions & Metrics Explorer 查得到。

建立 DateRange 物件

顧名思義,就是指定數據的時間區間。

var january = new DateRange { StartDate = "2019-01-01", EndDate = "2019-01-31" };

指定 ViewId

ViewId 在 GA 網站的管理介面中找得到,我們從資料檢視區塊選定我們想要資料檢視,點擊「資料檢視設定」。

畫面展開之後,就可以看到「資料檢視 ID」,它就是 ViewId,把它複製下來。

最後把上述的 Dimension、DimensionFilterClause、DimensionFilter、Metric、DateRange、ViewId 兜成一個 ReportRequest,丟給 AnalyticsReportingService.Reports.BatchGet() 方法之後,呼叫 Execute(),就可以得到我們要的結果了。

var reportRequest = new ReportRequest
                    {
                        ViewId = "...",
                        Metrics = new List<Metric> { metric },
                        Dimensions = new List<Dimension> { dimension },
                        DimensionFilterClauses = new List<DimensionFilterClause> { dimensionFilterClause },
                        DateRanges = new List<DateRange> { january }
                    };

var reportGetRequest = new GetReportsRequest { ReportRequests = new List<ReportRequest> { reportRequest } };

var response = analyticsReporting.Reports.BatchGet(reportGetRequest).Execute();

完整的原始碼如下:

private GetReportsResponse GetReports()
{
    var googleCredential = GoogleCredential.FromFile("xxx.json").CreateScoped(AnalyticsReportingService.Scope.Analytics);

    var analyticsReporting = new AnalyticsReportingService(
        new BaseClientService.Initializer
        {
            HttpClientInitializer = googleCredential,
            ApplicationName = "GA Lab"
        });

    var dimension = new Dimension { Name = "ga:pagePath" };

    var dimensionFilter = new DimensionFilter
                          {
                              DimensionName = "ga:pagePath",
                              Expressions = new List<string> { "^/supershowwei/2016/01/26/145353$" }
                          };

    var dimensionFilterClause = new DimensionFilterClause { Filters = new List<DimensionFilter> { dimensionFilter } };

    var metric = new Metric { Expression = "ga:pageviews" };

    var january = new DateRange { StartDate = "2019-01-01", EndDate = "2019-01-31" };

    var reportRequest = new ReportRequest
                        {
                            ViewId = "...",
                            Metrics = new List<Metric> { metric },
                            Dimensions = new List<Dimension> { dimension },
                            DimensionFilterClauses = new List<DimensionFilterClause> { dimensionFilterClause },
                            DateRanges = new List<DateRange> { january }
                        };

    var reportGetRequest = new GetReportsRequest { ReportRequests = new List<ReportRequest> { reportRequest } };

    return analyticsReporting.Reports.BatchGet(reportGetRequest).Execute();
}

參考資料