/

使用Node.js與Google Analytics API互動

使用Node.js與Google Analytics API互動

學習如何使用官方的googleapis套件,在Node.js應用程式中與Google Analytics API互動。我們將使用JSON Web Token並看一些範例。

注意:uBlock Origin封鎖這篇文章中的圖片,因為路徑中含有「analytics」這個詞。所以請確保在此頁面上禁用它,以便看到圖片。🖼

在這篇文章中,我將展示如何使用Node.js和Google Analytics API的一些範例。

Google提供了一個很棒的npm套件:googleapis。我們將使用它作為我們API互動的基礎建構塊。

驗證是與API互動的重要部分。請查看這篇關於如何驗證Google API的文章。在本文中,我假設您已經閱讀了那篇文章,並且知道如何執行JWT驗證。

環境變數

一旦從Google下載了JSON金鑰文件,將client_emailprivate_key值設定為環境變數,以便通過以下方式存取:

  • process.env.CLIENT_EMAIL
  • process.env.PRIVATE_KEY

將使用者新增至Google Analytics

由於在這些範例中使用了服務對服務API,您需要將client_email值添加到您的Google Analytics配置文件中。轉到「管理」面板,然後在屬性或視圖中點擊「使用者管理」。

Google Analytics設置

然後新增您在JSON文件中找到的client_email鍵中的電子郵件:

新增新使用者

匯入Google庫

1
const { google } = require('googleapis')

請記住將{}放在google物件周圍,因為我們需要從googleapis庫中解構出它(否則我們需要調用google.google,這樣看起來並不漂亮)。

定義範圍

以下代碼行設置了範圍:

1
const scopes = 'https://www.googleapis.com/auth/analytics.readonly'

Google Analytics API定義了多個範圍:

  • https://www.googleapis.com/auth/analytics.readonly:查看數據
  • https://www.googleapis.com/auth/analytics:查看和管理數據
  • https://www.googleapis.com/auth/analytics.edit:編輯管理實體
  • https://www.googleapis.com/auth/analytics.manage.users:管理帳戶使用者和權限
  • https://www.googleapis.com/auth/analytics.manage.users.readonly:查看使用者及其權限
  • https://www.googleapis.com/auth/analytics.provision:創建新的Google Analytics帳戶

您應該始終選擇授予最少權限的範圍。

由於我們希望僅查看報告,所以這裡選擇了https://www.googleapis.com/auth/analytics.readonly,而不是https://www.googleapis.com/auth/analytics

Google Analytics報告API

注意:您也可以使用“Google Analytics報告API”來訪問這些權限。

這是Google Analytics API的簡化版本,僅提供範圍https://www.googleapis.com/auth/analytics.readonlyhttps://www.googleapis.com/auth/analytics

然而,有關如何使用它以及它提供的方法的使用方式與Analytics API稍有不同,所以我們將跳過該部分。

建立JWT

1
const jwt = new google.auth.JWT(process.env.CLIENT_EMAIL, null, process.env.PRIVATE_KEY, scopes)

執行請求

檢查以下程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const { google } = require('googleapis')
const scopes = 'https://www.googleapis.com/auth/analytics.readonly'
const jwt = new google.auth.JWT(process.env.CLIENT_EMAIL, null, process.env.PRIVATE_KEY, scopes)

const view_id = 'XXXXX'

async function getData() {
const response = await jwt.authorize()
const result = await google.analytics('v3').data.ga.get({
'auth': jwt,
'ids': 'ga:' + view_id,
'start-date': '30daysAgo',
'end-date': 'today',
'metrics': 'ga:pageviews'
})

console.dir(result)
}

getData()

它向Google Analytics API發出請求,以獲取過去30天內的頁面視圖數。

view_id包含檢視的ID。不是您的Google Analytics代碼,而是檢視ID。您可以從管理面板中獲取它,方法是點擊要訪問的視圖上的查看設定

視圖ID

您將這個物件傳遞到請求中:

1
2
3
4
5
6
7
{
'auth': jwt,
'ids': 'ga:' + view_id,
'start-date': '30daysAgo',
'end-date': 'today',
'metrics': 'ga:pageviews'
}

除了jwt物件和檢視ID之外,我們還有3個參數。

  • metrics:告訴API我們要獲取什麼。
  • start-date:定義報告的起始日期。
  • end-date:定義報告的結束日期。

這個請求非常簡單,返回在指定時間段內發生的頁面視圖數。

返回的結果將類似於:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
status: 200,
statusText: 'OK',
headers: {...},
config: {...},
request: {...},
data: {
kind: 'analytics#gaData',
id: 'https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXXXXXXXXXXXXXXXX&metrics=ga:pageviews&start-date=30daysAgo&end-date=today',
query: {
'start-date': '30daysAgo',
'end-date': 'today',
ids: 'ga:XXXXXXXXXXXXXXXXXX',
metrics: [ 'ga:pageviews' ],
'start-index': 1,
'max-results': 1000
},
itemsPerPage: 1000,
totalResults: 1,
selfLink: 'https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXXXXXXXXXXXXXXXX&metrics=ga:pageviews&start-date=30daysAgo&end-date=today',
profileInfo: {
profileId: 'XXXXXXXXXXXXXXXXXX',
accountId: 'XXXXXXXXXXXXXXXXXX',
webPropertyId: 'UA-XXXXXXXXXXX--XX',
internalWebPropertyId: 'XXXXXXXXXXXXXXXXXX',
profileName: 'XXXXXXXXXXXXXXXXXX',
tableId: 'ga:XXXXXXXXXXXXXXXXXX'
},
containsSampledData: false,
columnHeaders: [
{
name: 'ga:pageviews',
columnType: 'METRIC',
dataType: 'INTEGER'
}
],
totalsForAllResults: { 'ga:pageviews': '3000' },
rows: [ [ '114426' ] ]
}
}

您可以通過response.data.rows[0][0]訪問頁面視圖計數。

指標

這個例子很簡單。我們只是要求以下數據:

1
2
3
4
5
{
'start-date': '30daysAgo',
'end-date': 'today',
'metrics': 'ga:pageviews'
}

有許多數據可以使用。

Dimensions & Metrics Explorer是一個很棒的工具,可以發現所有選項。

這些術語是Google Analytics的兩個概念。

Dimensions是屬性,例如城市、國家或頁面、引薦路徑或會話持續時間。

Metrics是定量測量,例如使用者數或會話數。

一些指標的例子:

  • 獲取頁面視圖 ga:pageviews
  • 獲取獨立使用者 ga:users
  • 獲取會話數 ga:sessions
  • 獲取有機搜索 ga:organicSearches

讓我們使用這些指標來構建一些範例。

常見程式碼

以下是在下面的範例中使用的常見程式碼。將此片段放在「authorize()」的回調中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'use strict'

const { google } = require('googleapis')

const scopes = 'https://www.googleapis.com/auth/analytics.readonly'
const jwt = new google.auth.JWT(process.env.CLIENT_EMAIL, null, process.env.PRIVATE_KEY, scopes)

async function getData() {
const defaults = {
'auth': jwt,
'ids': 'ga:' + process.env.VIEW_ID,
}
const response = await jwt.authorize()

/* 添加自定義程式碼,使用`response` */
}

getData()

defaults物件將在以下幾個範例中使用展開運算符,這是JavaScript中處理默認值的方便方式。

取得今日會話數

1
2
3
4
5
6
7
8
const result = await google.analytics('v3').data.ga.get({
...defaults,
'start-date': 'today',
'end-date': 'today',
'metrics': 'ga:sessions'
})

console.dir(result.data.rows[0][0])

取得來自有機來源(搜尋引擎)的今日會話數

添加filters屬性:

1
2
3
4
5
6
7
const result = await google.analytics('v3').data.ga.get({
...defaults,
'start-date': 'today',
'end-date': 'today',
'metrics': 'ga:sessions',
'filters': 'ga:medium==organic',
})

取得昨日會話數

1
2
3
4
5
6
7
8
const result = await google.analytics('v3').data.ga.get({
...defaults,
'start-date': 'yesterday',
'end-date': 'yesterday',
'metrics': 'ga:sessions'
})

console.dir(result.data.rows[0][0])

取得過去30天的會話數

1
2
3
4
5
6
7
8
const result = await google.analytics('v3').data.ga.get({
...defaults,
'start-date': '30daysAgo',
'end-date': 'today',
'metrics': 'ga:sessions'
})

console.dir(result.data.rows[0][0])

取得過去30天內使用的瀏覽器

1
2
3
4
5
6
7
8
9
const result = await google.analytics('v3').data.ga.get({
...defaults,
'start-date': '30daysAgo',
'end-date': 'today',
'dimensions': 'ga:browser',
'metrics': 'ga:sessions'
})

console.dir(result.data.rows.sort((a, b) => b[1] - a[1]))
1
2
3
4
5
6
7
8
9
10
[
[ 'Chrome', '994' ],
[ 'Safari', '548' ],
[ 'Firefox', '442' ],
[ 'Android Webview', '113' ],
[ 'Opera', '56' ],
[ 'Safari (in-app)', '41' ],
[ 'Edge', '36' ],
[ 'Internet Explorer', '4' ]
]

取得使用Chrome的訪客數

1
2
3
4
5
6
7
8
9
10
const result = await google.analytics('v3').data.ga.get({
...defaults,
'start-date': '30daysAgo',
'end-date': 'today',
'dimensions': 'ga:browser',
'metrics': 'ga:sessions',
'filters': 'ga:browser==Chrome',
})

console.dir(result.data.rows[0][1])

按流量來源取得會話數

1
2
3
4
5
6
7
8
9
const result = await google.analytics('v3').data.ga.get({
...defaults,
'start-date': '30daysAgo',
'end-date': 'today',
'dimensions': 'ga:source',
'metrics': 'ga:sessions'
})

console.dir(result.data.rows.sort((a, b) => b[1] - a[1]))
1
2
3
4
5
6
7
[
[ 'google', '1343' ],
[ '(direct)', '731' ],
[ 'medium.com', '624' ],
[ 't.co', '987' ],
[ 'reddit.com', '65' ]
]

Google Analytics即時API

Google Analytics即時API目前(2018年5月)處於私有測試階段,並且無法公開訪問。請參閱此頁