この記事は公開されてから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_type
をrefresh_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などの言語で利用することになります。
- REST API にアクセスする | Google Pay for Passes | Google Developers
- サービスアカウントを使ってGoogle Cloud APIのREST APIを叩くには
OAuth クライアント IDによる方法は、3年前の自分に助けられた
今回使用したOAuth クライアント IDによる認証方法は次のドキュメントに記載がありますが、最初はここにたどり着けませんでした。
参考になったのは下記の3年前に自分が書いた記事でした。昔にやったことにめぐりめぐって助けられるものですね。
おわりに
Google Tag ManagerのREST APIをcurlで使う方法を確認してみました。
認証方法の確認がいささか大変でしたが、これでGoogle Tag Managerの管理の自動化やコード化もできそうですね。
以上