學習如何使用官方的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庫

const { google } = require('googleapis')

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

定義範圍

以下代碼行設置了範圍:

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

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

執行請求

檢查以下程式碼:

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

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

{
  'auth': jwt,
  'ids': 'ga:' + view_id,
  'start-date': '30daysAgo',
  'end-date': 'today',
  'metrics': 'ga:pageviews'
}

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

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

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

返回的結果將類似於:

{
  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]訪問頁面視圖計數。

指標

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

{
  '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()」的回調中。

'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中處理默認值的方便方式。

取得今日會話數

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屬性:

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

取得昨日會話數

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天的會話數

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天內使用的瀏覽器

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]))
[
  [ 'Chrome', '994' ],
  [ 'Safari', '548' ],
  [ 'Firefox', '442' ],
  [ 'Android Webview', '113' ],
  [ 'Opera', '56' ],
  [ 'Safari (in-app)', '41' ],
  [ 'Edge', '36' ],
  [ 'Internet Explorer', '4' ]
]

取得使用Chrome的訪客數

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])

按流量來源取得會話數

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]))
[
  [ 'google', '1343' ],
  [ '(direct)', '731' ],
  [ 'medium.com', '624' ],
  [ 't.co', '987' ],
  [ 'reddit.com', '65' ]
]

Google Analytics即時API

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