はじめてのGoogle Analytics Reporting APIをNode.jsでちょっとだけ使ってみる

以前の投稿でGoogle AnalyticsGoogle Cloud Platformを設定してGoogle Analytics Reporting APIを使えるようにしました。

ponsuke-tarou.hatenablog.com

今回は、自分のQiitaのページにアナリティクスを設定、Qiitaページ用のサービスアカウントを作ったので、その情報をNode.jsを使ってAPIで取得してみたいと思います。 ちなみに、Node.jsは未経験です、ずぶのど素人です。

準備する

環境 : Windows10 Pro バージョン1909

  1. Node.jsをインストールする
  2. yarnをインストールする
  3. 作業用のディレクトリを作成する(ここ以降は下記のコードを参照)
  4. yarnの初期化する
  5. GoogleAPIのNode.js用ライブラリgoogle-api-nodejs-clientをインストールする
  6. Google Cloud Platformで作成したサービスアカウントの鍵ファイル(json)を格納するためのディレクトリを作成する
  7. 鍵ファイル(json)を格納する
# 作業用のディレクトリを作成する
$ mkdir google-analytics-api
$ cd google-analytics-api/

# yarnの初期化する
$ yarn init
...省略...
Done in 93.28s.

# GoogleAPIのNode.js用ライブラリgoogle-api-nodejs-clientをインストールする
$ yarn add googleapis
yarn add v1.22.10
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 31 new dependencies.
info Direct dependencies
└─ googleapis@68.0.0
info All dependencies
├─ abort-controller@3.0.0
...省略...
Done in 7.96s.

# Google Cloud Platformで作成したサービスアカウントの鍵ファイル(json)を格納するためのディレクトリを作成する
$ mkdir config

# 鍵ファイル(json)を格納する
$ ls config/
client_secrets.json

コードを書く

Google APIでの認証については、Analytics Reporting API - 承認  |  アナリティクス Reporting API v4が参考になります。

analytics.jsというファイルを作って以下のコードを書きました。

リクエストの内容についてはメソッド: reports.batchGet  |  アナリティクス Reporting API v4  |  Google Developersを見ながらしてする値を決めました。

const { google } = require('googleapis')

const KEY_FILE = './config/client_secrets.json' // 鍵ファイルのパスを指定する
const VIEW_ID = 'GoogleアナリティクスのViewID'

/**
 * Auth2.0認証をしてクライアントを取得する
 * @returns クライアント
 */
async function getAnalyticsreportingClient() {
  const client = await google.auth.getClient({
    keyFile: KEY_FILE,
    scopes: 'https://www.googleapis.com/auth/analytics.readonly'
  })
  const analyticsreporting = google.analyticsreporting({
    version: 'v4',
    auth: client
  })
  return analyticsreporting
}

/** Google Analyticsから情報を取得する */
async function getReporting() {
  const client = await getAnalyticsreportingClient()
  // 取得期間をyyyy-MM-dd形式で指定
  let dateRanges = [{startDate: '2021-03-19', endDate: '2021-03-30'}]
  const res = await client.reports.batchGet({
    requestBody: {
      reportRequests: [
        // 指定期間でのPV数TOP3のページを取得するリクエスト
        {
          viewId: VIEW_ID,
          dateRanges: dateRanges,
          dimensions: [{name: 'ga:pagePath'}], // ページ単位の情報を取得する
          metrics: [{expression: 'ga:pageviews'}, {expression: 'ga:avgTimeOnPage'}], // PV数と平均ページ滞在時間を取得する
          orderBys: {fieldName: 'ga:pageviews', sortOrder: 'DESCENDING'}, // PV数の降順でソートする
          pageSize: 3 // 3件分取得する
        },
        // 直近1週間での平均ページ滞在時間TOP3のページを取得するリクエスト
        {
          viewId: VIEW_ID,
          dateRanges: dateRanges,
          dimensions: [{name: 'ga:sourceMedium'}], // ページ単位の情報を取得する
          metrics: [{expression: 'ga:bounceRate'}, {expression: 'ga:avgTimeOnPage'}], // 直帰率と平均ページ滞在時間を取得する
          orderBys: {fieldName: 'ga:avgTimeOnPage', sortOrder: 'DESCENDING'}, // 平均ページ滞在時間の降順でソートする
          pageSize: 3 // 3件分取得する
        }
      ]
    }
  })
  // コンソールに取得内容を表示
  console.log(JSON.stringify(res.data))
}

getReporting()

Reporting APIを呼び出す

早速、ターミナルから実行してみます。本当はレスポンスが1行なのですが、見にくいので改行などを入れています。

$ node analytics.js
{"reports":[
  {
    "columnHeader":{"dimensions":["ga:pagePath"],"metricHeader":{"metricHeaderEntries":[{"name":"ga:pageviews","type":"INTEGER"},{"name":"ga:avgTimeOnPage","type":"TIME"}]}},
    "data":{"rows":[
      {"dimensions":["/ponsuke0531/items/4629626a3e84bcd9398f"],"metrics":[{"values":["1631","387.46666666666664"]}]},
      {"dimensions":["/ponsuke0531/items/df51a784b5ff48c97ac7"],"metrics":[{"values":["1160","601.5056179775281"]}]},
      {"dimensions":["/ponsuke0531/items/edf2eee638202aa7f61f"],"metrics":[{"values":["999","401.8253968253968"]}]}
    ],
    "totals":[{"values":["35429","382.3464974141984"]}],
    "rowCount":499,
    "minimums":[{"values":["1","0.0"]}],
    "maximums":[{"values":["1631","1679.0"]}]},
    "nextPageToken":"3"
  },
  {
    "columnHeader":{"dimensions":["ga:sourceMedium"],"metricHeader":{"metricHeaderEntries":[{"name":"ga:bounceRate","type":"PERCENT"},{"name":"ga:avgTimeOnPage","type":"TIME"}]}},
    "data":{"rows":[
      {"dimensions":["27.94.140.223:8080 / referral"],"metrics":[{"values":["0.0","1335.0"]}]},
      {"dimensions":["nekorokkekun.hatenablog.com / referral"],"metrics":[{"values":["0.0","996.0"]}]},
      {"dimensions":["zenn.dev / referral"],"metrics":[{"values":["0.0","909.0"]}]}
    ],
    "totals":[{"values":["86.22115384615384","382.3464974141984"]}],
    "rowCount":69,
    "minimums":[{"values":["0.0","0.0"]}],
    "maximums":[{"values":["100.0","1335.0"]}]},
    "nextPageToken":"3"
  }
]}