Closed2

Next App Router x GA4で人気記事を取得したい

takky94takky94

npm install @google-analytics/data実行したら下記コードをどこか適当なとこに配置

/**
 * TODO(developer): Uncomment this variable and replace with your
 *   Google Analytics 4 property ID before running the sample.
 */
// propertyId = 'YOUR-GA4-PROPERTY-ID';

// Imports the Google Analytics Data API client library.
const {BetaAnalyticsDataClient} = require('@google-analytics/data');

// Using a default constructor instructs the client to use the credentials
// specified in GOOGLE_APPLICATION_CREDENTIALS environment variable.
const analyticsDataClient = new BetaAnalyticsDataClient();

// Runs a simple report.
async function runReport() {
  const [response] = await analyticsDataClient.runReport({
    property: `properties/${propertyId}`,
    dateRanges: [
      {
        startDate: '2020-03-31',
        endDate: 'today',
      },
    ],
    dimensions: [
      {
        name: 'city',
      },
    ],
    metrics: [
      {
        name: 'activeUsers',
      },
    ],
  });

  console.log('Report result:');
  response.rows.forEach(row => {
    console.log(row.dimensionValues[0], row.metricValues[0]);
  });
}

runReport();

https://googleapis.dev/nodejs/analytics-data/latest/index.html

ほぼこれで終わり
GCP上での操作やAnalytics上での操作はググればたくさん出てくる

ただ、1つ気になるエラーが出たのでメモしておく

- warn ./node_modules/retry-request/index.js
Module not found: Can't resolve 'request' in '/Users/hoge/fuga/frontend/node_modules/retry-request'

retry-requestというモジュール内で使用されるrequestがないと言われるもの

https://github.com/googleapis/retry-request/issues/39

確かにnpm i requestで終わる問題ではあるものの、そのrequestがdeprecatedとなっている

https://github.com/request/request/issues/3142

takky94takky94

あと関連するところで、GCP上でサービスアカウントのPRIVATE_KEYを取得するが、

# こういうやつ
-----BEGIN PRIVATE KEY-----
hogehoge
-----END PRIVATE KEY-----

こいつの取り扱いがやや面倒で、

new BetaAnalyticsDataClient({
    credentials: {
      client_email: process.env.GA4_DATA_API_CLIENT_EMAIL,
      private_key: process.env.GA4_DATA_API_PRIVATE_KEY,
    },
});

みたいに愚直に使うとエラーが出る
改行を考慮し、

new BetaAnalyticsDataClient({
    credentials: {
      client_email: process.env.GA4_DATA_API_CLIENT_EMAIL,
+     private_key: process.env.GA4_DATA_API_PRIVATE_KEY.split(String.raw`\n`).join('\n'),
    },
});

のようにしてやらないといけない

あとデプロイ先がAWSだったりするとさらに注意が必要で、環境変数の値のバックスラッシュをエスケープする必要がある

環境プロパティ値の一部の文字で囲う値はエスケープする必要があります。バックスラッシュ文字 () を使用して、いくつかの特殊文字と制御文字を表します。次のリストには、エスケープする必要があるいくつかの文字を表す例が含まれています。
バックスラッシュ () — \ の使用を表す
一重引用符 (') — ' の使用を表す
二重引用符 (") — " の使用を表す

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html#environments-cfg-softwaresettings-console

# .env.local
GA4_DATA_API_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nHOGEHOGEHOGE...
                                                    ^^^
# .env.production
GA4_DATA_API_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\\nHOGEHOGEHOGE...
                                                    ^^^
このスクラップは2023/07/13にクローズされました