# 讓聊天機器人也能看 Google Analytics (1)

大家好,我是做出「LINE 數位版名片」的 LINE API 專家均民。

在聊天機器人內,難免都會想要追蹤使用者行為,除了自己寫程式追蹤之外,你還可以考慮直接把使用者的行為傳送給 Google Analytics (以下簡稱 GA) 進行追蹤喔!

# 建立 GA 帳戶

請先透過 這篇教學 (opens new window) 來建立一個 GA 帳戶。

請注意在第 2 步的「您想進行什麼評估?」的選項務必選擇「網頁」,如果選錯了就必須要重新建立:

建立完成以後,你就可以成功看到你的追蹤代碼 UA-xxxxxxxxx-1

# User-ID 設定

為了要讓後端送出的 GA 和 LIFF 中透過 gtag.js 送出的 GA 能夠被當成同一個使用者,所以一定要設定 User-ID 的選項,這個設定不溯及既往,所以務必在一開始就設定好。

設定完 User-ID 後,需要建立一個 User-ID 視圖:

接下來的建立 User-ID 視圖畫面,需要確認以下的選項:

  • 這項資料檢視應追蹤哪些資料?「行動應用程式」
  • 顯示 User-ID 報表:「啟用」

等到建立完成以後,你應該就可以成功看到兩個資料檢視,分別為「所有網站資料」以及「跨裝置報表」:

在「跨裝置報表」中,你看到的資料理論上就會是針對同一個使用者的資料囉!

# 如何在後端送出 GA

為了在後端送出 GA,我們需要使用 GA 的 Measurement Protocol (opens new window),要送出使用者的互動資料,只需要對 API 送出 HTTP POST 即可:

在每一筆互動資料 (Hit) 中,有幾個參數是必填欄位如下:

為了方便追蹤使用者,我們將 LINE 所給予的 userId 直接拼裝成 GA 所需的 cid:

以下使用 Node.js 來送出一個畫面瀏覽(screen view):

const axios = require('axios')
const Qs = require('qs')

const PAYLOAD_DEFAULT = {
  aip: 1, // 忽略追蹤發送者 IP
  an: 'My App', // App Name
  av: '1.0.0', // App 版號
  de: 'UTF-8', // 字元編碼
  ds: 'app', // 資料來源,填寫為 app
  tid: 'UA-xxxxxxxxx-1', // GA 追蹤代碼
  ul: 'zh-tw', // locale
  v: 1, // api version
}

const httpBuildQuery = obj => Qs.stringify(obj, { arrayFormat: 'brackets' })

const transformLineId = lineId => ({
  uid: lineId,
  cid: lineId.replace(/^U(\w{8})(\w{4})(\w{4})(\w{4})(\w{12})$/, '$1-$2-$3-$4-$5'),
})

function gaScreenView (lineId, name, overrides = {}) {
  return axios.post('https://www.google-analytics.com/collect', httpBuildQuery({
    ...PAYLOAD_DEFAULT,
    ...overrides,
    ...transformLineId(lineId),
    t: 'screenview',
    cd: name,
  }))
}

以下使用 Node.js 來送出一個事件標籤(event label):

const axios = require('axios')
const Qs = require('qs')

const PAYLOAD_DEFAULT = {
  aip: 1, // 忽略追蹤發送者 IP
  an: 'My App', // App Name
  av: '1.0.0', // App 版號
  de: 'UTF-8', // 字元編碼
  ds: 'app', // 資料來源,填寫為 app
  tid: 'UA-xxxxxxxxx-1', // GA 追蹤代碼
  ul: 'zh-tw', // locale
  v: 1, // api version
}

const httpBuildQuery = obj => Qs.stringify(obj, { arrayFormat: 'brackets' })

const transformLineId = lineId => ({
  uid: lineId,
  cid: lineId.replace(/^U(\w{8})(\w{4})(\w{4})(\w{4})(\w{12})$/, '$1-$2-$3-$4-$5'),
})

function gaEventLabel (lineId, category, action, label, overrides = {}) {
  return axios.post('https://www.google-analytics.com/collect', httpBuildQuery({
    ...PAYLOAD_DEFAULT,
    ...overrides,
    ...transformLineId(lineId),
    t: 'event',
    ec: category,
    ea: action,
    el: label,
  }))
}

如果你想要知道每個參數的詳細內容的話,你可以看 參數文件 (opens new window)

# 預告

這系列的下一篇文章,我預計將會分享如何使用 Node.js 批次送出資料,敬請期待!

# 原始碼及參考連結

TIP

本文範例程式的原始碼授權為 MIT License。