Google Tag ManagerのREST APIを使ってみた(curl)

2022.01.15

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、Google Tag ManagerのREST APIをcurlで使う方法を確認してみました。

Google Tag ManagerのAPI

Google Tag ManagerではリソースにAPIでアクセスする方法として、大きく分けて「Web API」、「Mobile API」およに「REST API」の3つが用意されています。

このうち承認されたユーザーがリソースの管理用途で使用するのはREST APIです。今回はREST APIを使用してGoogle Tag Manager APIよりリソースにアクセスしてみます。

やってみた

APIの有効化

まずGoogle Cloud Platform(GCP)でGoogle Tag ManagerのAPIを有効化します。

https://console.cloud.google.com/apis/library にアクセスしてAPIライブラリを開きます。

検索欄でtag manager apiで検索し、ヒットしたTag Manager APIを選択。

[有効にする]をクリック。

有効化できました。

認証情報の作成

続いてAPIを使用するのに必要な認証情報(OAuth クライアント ID)を作成します。

[認証情報の作成]をクリック。

[認証情報の種類]で、次の通り選択し、[次へ]をクリック。

  • APIを選択:Tag Manager API
  • アクセスするデータの種類:ユーザー データ

Tag Manager APIのスコープがすべて既定で指定されています。このまま[保存して次へ]をクリック。

[OAuth クライアント ID]で次の通り選択して、[作成]をクリック。

  • アプリケーションの種類:ウェブ アプリケーション
  • 承認済みのリダイレクトURI - URI:http://localhost

[認証情報]で[ダウンロード]をクリックして認証情報をダウンロードします。[完了]をクリックして作成を完了します。

認証情報としてOAuth クライアント IDが作成できました。

ダウンロードした認証情報は次のようなJSON形式(DL後に整形済み)です。このうちクライアントIDclient_idとクライアントシークレットclient_secretを後ほど使用します。

{
  "web": {
    "client_id": "1234567890-xxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
    "project_id": "cm-cx-wakatsuki-ryuta-XXXXXX",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_secret": "GOCSPX-xxxxxxxxxxxxxxxxxxxxxxxxxx",
    "redirect_uris": ["http://localhost"]
  }
}

認証コードの取得

ここでは認証コードを取得します。

まず下記より実施したい操作のScopeを確認します。

今回はGoogle Tag Managerの情報の読み取りのみ可能なスコープhttps://www.googleapis.com/auth/tagmanager.readonlyを使用してみます。

下記URLをWebブラウザで開きます。

$ REDIRECT_URI=http://localhost
$ CLIENT_ID=<先程控えたクライアントID>
$ SCOPE=https://www.googleapis.com/auth/tagmanager.readonly

//このURLにアクセス
$ echo "https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${REDIRECT_URI}&client_id=${CLIENT_ID}&scope=${SCOPE}&response_type=code&access_type=offline"

するとアプリケーションアカウント選択を求められるので選択します。

先程作成したOAuth クライアントのアプリケーションからアクセスを要求されるので、[許可]をクリック。

するとリダイレクト先URLで認証コードが取得できるので控えます。

アクセストークンの取得

curlでhttps://www.googleapis.com/oauth2/v4/tokenエンドポイントにアクセスし、アクセストークンを取得します。

$ REDIRECT_URI=http://localhost
$ CLIENT_ID=<先程控えたクライアントID>
$ CLIENT_SECRET=<先程控えたクライアントシークレット>
$ AUTHORIZATION_CODE=<先程控えた認証コード>
$ curl --data "redirect_uri=${REDIRECT_URI}" \
     --data "client_id=${CLIENT_ID}" \
     --data "client_secret=${CLIENT_SECRET}" \
     --data "code=${AUTHORIZATION_CODE}" \
     --data "grant_type=authorization_code" \
     --data "access_type=offline" \
     https://www.googleapis.com/oauth2/v4/token

{
  "access_token": "ya29.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "expires_in": 3599,
  "refresh_token": "1//XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "scope": "https://www.googleapis.com/auth/tagmanager.readonly",
  "token_type": "Bearer"
}

実行結果のJsonのaccess_tokenの値がアクセストークンなので控えます。(refresh_tokenも後ほど使います。)

アクセストークンの更新

このアクセストークンですが、有効期限切れ以降の利用ではリフレッシュトークンを使用して更新後のアクセストークンを取得して利用する必要があります。

更新後のアクセストークンの取得は、grant_typerefresh_tokenとしてhttps://www.googleapis.com/oauth2/v4/tokenエンドポイントを叩きます。

$ CLIENT_ID=<先程控えたクライアントID>
$ CLIENT_SECRET=<先程控えたクライアントシークレット>
$ REFRESH_TOKEN=<先程控えたリフレッシュトークン>
$ curl --data "client_id=${CLIENT_ID}"  \
    --data "client_secret=${CLIENT_SECRET}"  \
    --data "refresh_token=${REFRESH_TOKEN}"  \
    --data "grant_type=refresh_token" \
    https://www.googleapis.com/oauth2/v4/token

{
  "access_token": "ya29....",
  "expires_in": 3600,
  "scope": "https://www.googleapis.com/auth/devstorage.read_write",
  "token_type": "Bearer"
}

次回期限(3600秒)まで有効なアクセストークンを取得できました。

Google Tag Manager API(REST API)を使用する

準備がとても長くなりました。ようやくですが、Google Tag Manager APIをREST APIで使ってみます。

下記のAPI Referenceを参考にします。

アカウント一覧の取得

アカウント一覧を取得してみます。エンドポイントは下記となります。

GET https://www.googleapis.com/tagmanager/v2/accounts

curlでアクセスすると、アカウント一覧が取得できました。

$ ACCESS_TOKEN=<先程控えたアクセストークン>
$ curl -X GET \
    -H "Authorization: Bearer ${ACCESS_TOKEN}" \
    "https://www.googleapis.com/tagmanager/v2/accounts"

{
  "account": [
    {
      "path": "accounts/xxxxxxxx",
      "accountId": "xxxxxxxx",
      "name": "クラスメソッド"
    },
    {
      "path": "accounts/xxxxxxxx",
      "accountId": "xxxxxxxx",
      "name": "クラスメソッド_テスト"
    }
  ]
}

コンテナ一覧の取得

指定のアカウントのコンテナ一覧を取得してみます。

GET https://www.googleapis.com/tagmanager/v2/+parent/containers

curlでアクセスすると、コンテナ一覧が取得できました。

$ ACCESS_TOKEN=<先程控えたアクセストークン>
$ ACCOUNT_ID=<アカウントID>
$ curl -X GET \
    -H "Authorization: Bearer ${ACCESS_TOKEN}" \
    "https://www.googleapis.com/tagmanager/v2/accounts/${ACCOUNT_ID}/containers"

{
  "container": [
    {
      "path": "accounts/XXXXXXXXXX/containers/57033405",
      "accountId": "XXXXXXXXXX",
      "containerId": "57033405",
      "name": "my-server -tag-test",
      "publicId": "GTM-5VBHWKD",
      "usageContext": [
        "server"
      ],
      "fingerprint": "1641465887180",
      "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/XXXXXXXXXX/containers/57033405/workspaces?apiLink=container"
    },
    {
      "path": "accounts/XXXXXXXXXX/containers/57033643",
      "accountId": "XXXXXXXXXX",
      "containerId": "57033643",
      "name": "classmethod.jp",
      "publicId": "GTM-5HH7NPK",
      "usageContext": [
        "web"
      ],
      "fingerprint": "1641463359676",
      "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/XXXXXXXXXX/containers/57033643/workspaces?apiLink=container"
    },
    {
      "path": "accounts/XXXXXXXXXX/containers/57131876",
      "accountId": "XXXXXXXXXX",
      "containerId": "57131876",
      "name": "server-sideテスト",
      "publicId": "GTM-MK7N7SM",
      "usageContext": [
        "server"
      ],
      "fingerprint": "1641645485905",
      "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/XXXXXXXXXX/containers/57131876/workspaces?apiLink=container"
    }
  ]
}

認証方法について

今回認証方法としてOAuth クライアント IDを使用しましたが、その他にAPI キーサービスアカウントによる方法もあります。

APIキーによる認証はできないのか?

試した結果できませんでした。

APIキーを作成してREST APIエンドポイントにアクセスを試したところ、「APIキーはサポートしておらず、OAuth2アクセストークンやその他認証方法を使う必要がある」というエラーとなりました。

$  curl  -X GET \      
      https://www.googleapis.com/tagmanager/v2/accounts?key=AIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{
  "error": {
    "code": 401,
    "message": "API keys are not supported by this API. Expected OAuth2 access token or other authentication credentials that assert a principal. See https://cloud.google.com/docs/authentication",
    "errors": [
      {
        "message": "Login Required.",
        "domain": "global",
        "reason": "required",
        "location": "Authorization",
        "locationType": "header"
      }
    ],
    "status": "UNAUTHENTICATED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "CREDENTIALS_MISSING",
        "domain": "googleapis.com",
        "metadata": {
          "method": "container_tag.apiary_v2.TagManagerServiceV2.ListAccounts",
          "service": "tagmanager.googleapis.com"
        }
      }
    ]
  }
}

サービスアカウントによる認証はできないのか?

試していませんができるようです。鍵情報をPython、PHP、Javaなどの言語で利用することになります。

OAuth クライアント IDによる方法は、3年前の自分に助けられた

今回使用したOAuth クライアント IDによる認証方法は次のドキュメントに記載がありますが、最初はここにたどり着けませんでした。

参考になったのは下記の3年前に自分が書いた記事でした。昔にやったことにめぐりめぐって助けられるものですね。

おわりに

Google Tag ManagerのREST APIをcurlで使う方法を確認してみました。

認証方法の確認がいささか大変でしたが、これでGoogle Tag Managerの管理の自動化やコード化もできそうですね。

以上