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

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

Clock Icon2022.01.15 14:53

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、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の管理の自動化やコード化もできそうですね。

以上

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.