notebook

都内でWEB系エンジニアやってます。

google-api-nodejs-client+GCPサービスアカウントで認証してGoogleAnalyticsReportingAPI(v4)を使う

定期的にやっている気がするけど現時点で良さそうと思えるGoogleAnalyticsAPIをNodeクライアントでたたくための方法

GoogleCloudPlatformを使っているとサービスアカウントを作ってキーのパスを環境変数にセットすればよしなにやってくれるので便利で良いなと思っていました

GoogleAnalyticsAPIも同じような感じで処理できれば楽だなと思い調べてみたもののあんまり出てこなかったので残しておく

結論ソース読んだほうがよいよという話になりそうだけど勉強になったのでどこかの誰かのためになればうれしいです

google-api-nodejs-client

googleapis/google-api-nodejs-client: Google's officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included.

github.com

最初@google-cloudにあるかと思い探してみたがやはり別な模様

AnalyticsAPIは上記moduleから使う

install

npm install --save googleapis

認証に関して

@google-cloud/storageなどのGoogleCloudのモジュールを使用している場合

GOOGLE_APPLICATION_CREDENTIALSにサービスアカウントのcredentialのパスをセットしてあれば認証を通してくれます

googleapisでも同様に認証を通したいと思っていたらちゃんとREADMEに載っていました

下記はcomputeに対して実行しているサンプル

googleapis/google-api-nodejs-client: Google's officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included.

これをAnalyticsReportingでも同じようにできれば良さそう

ReportingAPIを扱うソースコード

ここを見に行くと該当のAPIはanalyticsreportingを持ってくればよい感じですね

google-api-nodejs-client/index.ts at master · googleapis/google-api-nodejs-client

次のソースからanalyticsreporting.reports.batchGetでAPIをたたけそう

google-api-nodejs-client/v4.ts at master · googleapis/google-api-nodejs-client

batchGetに投げるパラメータは下記から探せば良さそう

メソッド: reports.batchGet  |  アナリティクス Reporting API v4  |  Google Developers

ペイロードの渡し方は下記ソースをしっかり追えば分かる

google-api-nodejs-client/v4.ts at master · googleapis/google-api-nodejs-client

TypeScriptで書かれているので型情報がしっかり載っていてわかりやすい

サンプルを書いてみる

ということで情報がそろってきたのでサンプルを書いてみる

  • sample.js
const {google} = require('googleapis');
const analyticsreporting = google.analyticsreporting('v4');

const hoge = async () => {
  const auth = new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/analytics.readonly']
  });
  const authClient = await auth.getClient();

  const res = await analyticsreporting.reports.batchGet({
    auth: authClient,
    requestBody: {
      reportRequests: [
        {
          viewId: 'ga:xxxxxxx',
          dateRanges: [
            {
              startDate: "2020-03-15",
              endDate: "2020-04-15"
            }
          ],
          metrics: [{expression: 'ga:pageViews'}],
          dimensions: [{name: 'ga:pagePath'}],
          pageSize: 5000
        }
      ]
    }
  })
  const json = JSON.stringify(res.data.reports[0])
  console.log(json);
}

hoge()

googleapisの各種メソッドはパラメータにauthを受け付けているよう

で、そのauthにgoogle.auth.GoogleAuthから生成したauthClientを渡してあげればよい

サービスアカウントでgoogleapisを使うときはこの方法で認証通すのが良さそうに思える

スッキリした感!

GCP上での実行に関して

CloudFunctionやGCEなどGCPのサービス上で実行する場合

アクセス制御  |  Google Cloud Functions に関するドキュメント

cloud.google.com

にあるようにCloudFunctionsのデフォルトのサービスアカウントはPROJECT_ID@appspot.gserviceaccount.comなので次のAnalytics管理画面メニューをクリックしユーザーのアドレスを追加してあげればサービスアカウントからAPIをたたけるようになる

f:id:swfz:20200422043241p:plain

まとめ

  • GoogleAnalyticsReportingAPI(v4)をgoogleapis nodeクライアントで使えるようにした
    • google.auth.GoogleAuthを用いてサービスアカウントで認証済みのclientを取得できる
  • 結局READMEちゃんと読め案件だった
  • 他記事を漁ってみた感じanalyticsreportinganalyticsを使うパターンがあったがanalyticsはv3だった
    • レポーティングのみで使用するならanalyticsreportingを使うのが良さそう

実際APIたたいてみた感じレスポンスのフォーマットが面倒そうな感じだったのでそれはまた頑張ってTransformします…