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" };
過濾維度(選擇性)
如果想要對維度做過濾,需要建立 DimensionFilterClause
及 DimensionFilter
,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" };
建立 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();
}