Teruhiro Komaki's Blog (Temporary)

Cloudflare Web Analyticsの設定をREST APIで行う方法

こんにちは。

Cloudflare PagesWeb Analyticsを有効にしているプロジェクトがいくつかあり、Web Analyticsを無効化しようと、プロジェクトのページにアクセスしました。 しかし、今まで設定画面に表示されていたWeb Analyticsの設定ボタンがなくなっていました。

これは困った…

といことで、CloudflareのREST APIを確認し、API経由でWeb Analyticsを無効化することにしました。

以下は、作業メモです。

ドキュメント

以下のAPIを使います。

APIトークンの準備

APIトークンを作成し、検証します。

アクセス許可には Clodflare Pages 読み取り(read)Clodflare Pages 編集(edit) を追加します。

APIトークンを作成

APIトークン 1

APIトークンの作成完了

APIトークン 2

APIトークンのテスト

画面に表示されたので、まずはAPIトークンのテストをします。

1curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
2     -H "Authorization: Bearer TOKEN_123456789" \
3     -H "Content-Type:application/json" | jq -r . | tee "$(date +"%Y%m%d_%H%M%S").json"

レスポンス

 1{
 2  "result": {
 3    "id": "MY_ID_123456789",
 4    "status": "active"
 5  },
 6  "success": true,
 7  "errors": [],
 8  "messages": [
 9    {
10      "code": 10000,
11      "message": "This API Token is valid and active",
12      "type": null
13    }
14  ]
15}

APIトークンの準備ができました。

プロジェクトの詳細情報を取得

Web Analyticsを無効化したいプロジェクトの情報を取得します。ドキュメントには、以下のcurlのサンプルがあります。

1curl --request GET \
2  --url https://api.cloudflare.com/client/v4/accounts/account_id/pages/projects/project_name \
3  --header 'Content-Type: application/json' \
4  --header 'X-Auth-Email: '

以下のように修正し、実行しました。

1account_id="your_account_id"
2project_name="your_project_name"
3token="TOKEN_123456789"
4curl --request GET \
5  --url "https://api.cloudflare.com/client/v4/accounts/${account_id}/pages/projects/${project_name}" \
6  --header "Authorization: Bearer ${token}" \
7  --header 'Content-Type: application/json' | jq -r . | tee "$(date +"%Y%m%d_%H%M%S").json"

以下は、ドキュメントのレスポンスです。

  1{
  2  "errors": [],
  3  "messages": [],
  4  "success": true,
  5  "result": {
  6    "build_config": {
  7      "build_caching": true,
  8      "build_command": "npm run build",
  9      "destination_dir": "build",
 10      "root_dir": "/",
 11      "web_analytics_tag": "cee1c73f6e4743d0b5e6bb1a0bcaabcc",
 12      "web_analytics_token": "021e1057c18547eca7b79f2516f06o7x"
 13    },
 14    "canonical_deployment": {
 15      "aliases": [
 16        "https://branchname.projectname.pages.dev"
 17      ],
 18      "build_config": {
 19        "build_caching": true,
 20        "build_command": "npm run build",
 21        "destination_dir": "build",
 22        "root_dir": "/",
 23        "web_analytics_tag": "cee1c73f6e4743d0b5e6bb1a0bcaabcc",
 24        "web_analytics_token": "021e1057c18547eca7b79f2516f06o7x"
 25      },
 26      "created_on": "2021-03-09T00:55:03.923456Z",
 27      "deployment_trigger": {
 28        "metadata": {
 29          "branch": "main",
 30          "commit_hash": "ad9ccd918a81025731e10e40267e11273a263421",
 31          "commit_message": "Update index.html"
 32        },
 33        "type": "ad_hoc"
 34      },
 35      "env_vars": {
 36        "BUILD_VERSION": {
 37          "value": "3.3"
 38        },
 39        "ENV": {
 40          "value": "STAGING"
 41        }
 42      },
 43      "environment": "preview",
 44      "id": "f64788e9-fccd-4d4a-a28a-cb84f88f6",
 45      "is_skipped": true,
 46      "latest_stage": {
 47        "ended_on": "2021-03-09T00:58:59.045655",
 48        "name": "deploy",
 49        "started_on": "2021-03-09T00:55:03.923456Z",
 50        "status": "success"
 51      },
 52      "modified_on": "2021-03-09T00:58:59.045655",
 53      "project_id": "7b162ea7-7367-4d67-bcde-1160995d5",
 54      "project_name": "ninjakittens",
 55      "short_id": "f64788e9",
 56      "source": {
 57        "config": {
 58          "deployments_enabled": true,
 59          "owner": "string",
 60          "path_excludes": [
 61            "string"
 62          ],
 63          "path_includes": [
 64            "string"
 65          ],
 66          "pr_comments_enabled": true,
 67          "preview_branch_excludes": [
 68            "string"
 69          ],
 70          "preview_branch_includes": [
 71            "string"
 72          ],
 73          "preview_deployment_setting": "all",
 74          "production_branch": "string",
 75          "production_deployments_enabled": true,
 76          "repo_name": "string"
 77        },
 78        "type": "string"
 79      },
 80      "stages": [
 81        {
 82          "ended_on": "2021-06-03T15:39:03.134378Z",
 83          "name": "queued",
 84          "started_on": "2021-06-03T15:38:15.608194Z",
 85          "status": "active"
 86        },
 87        {
 88          "ended_on": null,
 89          "name": "initialize",
 90          "started_on": null,
 91          "status": "idle"
 92        },
 93        {
 94          "ended_on": null,
 95          "name": "clone_repo",
 96          "started_on": null,
 97          "status": "idle"
 98        },
 99        {
100          "ended_on": null,
101          "name": "build",
102          "started_on": null,
103          "status": "idle"
104        },
105        {
106          "ended_on": null,
107          "name": "deploy",
108          "started_on": null,
109          "status": "idle"
110        }
111      ],
112      "url": "https://f64788e9.ninjakittens.pages.dev"
113    },
114    "created_on": "2017-01-01T00:00:00Z",
115    "deployment_configs": {
116      "preview": {
117        "ai_bindings": {
118          "AI_BINDING": {
119            "project_id": "some-project-id"
120          }
121        },
122        "analytics_engine_datasets": {
123          "ANALYTICS_ENGINE_BINDING": {
124            "dataset": "api_analytics"
125          }
126        },
127        "browsers": {
128          "BROWSER": {}
129        },
130        "compatibility_date": "2022-01-01",
131        "compatibility_flags": [
132          "url_standard"
133        ],
134        "d1_databases": {
135          "D1_BINDING": {
136            "id": "445e2955-951a-43f8-a35b-a4d0c8138f63"
137          }
138        },
139        "durable_object_namespaces": {
140          "DO_BINDING": {
141            "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
142          }
143        },
144        "env_vars": {
145          "property1": {
146            "type": "plain_text",
147            "value": "hello world"
148          },
149          "property2": {
150            "type": "plain_text",
151            "value": "hello world"
152          }
153        },
154        "hyperdrive_bindings": {
155          "HYPERDRIVE": {
156            "id": "a76a99bc342644deb02c38d66082262a"
157          }
158        },
159        "kv_namespaces": {
160          "KV_BINDING": {
161            "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
162          }
163        },
164        "mtls_certificates": {
165          "MTLS": {
166            "certificate_id": "d7cdd17c-916f-4cb7-aabe-585eb382ec4e"
167          }
168        },
169        "placement": {
170          "mode": "smart"
171        },
172        "queue_producers": {
173          "QUEUE_PRODUCER_BINDING": {
174            "name": "some-queue"
175          }
176        },
177        "r2_buckets": {
178          "R2_BINDING": {
179            "name": "some-bucket"
180          }
181        },
182        "services": {
183          "SERVICE_BINDING": {
184            "entrypoint": "MyHandler",
185            "environment": "production",
186            "service": "example-worker"
187          }
188        },
189        "vectorize_bindings": {
190          "VECTORIZE": {
191            "index_name": "my_index"
192          }
193        }
194      },
195      "production": {
196        "ai_bindings": {
197          "AI_BINDING": {
198            "project_id": "some-project-id"
199          }
200        },
201        "analytics_engine_datasets": {
202          "ANALYTICS_ENGINE_BINDING": {
203            "dataset": "api_analytics"
204          }
205        },
206        "browsers": {
207          "BROWSER": {}
208        },
209        "compatibility_date": "2022-01-01",
210        "compatibility_flags": [
211          "url_standard"
212        ],
213        "d1_databases": {
214          "D1_BINDING": {
215            "id": "445e2955-951a-43f8-a35b-a4d0c8138f63"
216          }
217        },
218        "durable_object_namespaces": {
219          "DO_BINDING": {
220            "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
221          }
222        },
223        "env_vars": {
224          "property1": {
225            "type": "plain_text",
226            "value": "hello world"
227          },
228          "property2": {
229            "type": "plain_text",
230            "value": "hello world"
231          }
232        },
233        "hyperdrive_bindings": {
234          "HYPERDRIVE": {
235            "id": "a76a99bc342644deb02c38d66082262a"
236          }
237        },
238        "kv_namespaces": {
239          "KV_BINDING": {
240            "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
241          }
242        },
243        "mtls_certificates": {
244          "MTLS": {
245            "certificate_id": "d7cdd17c-916f-4cb7-aabe-585eb382ec4e"
246          }
247        },
248        "placement": {
249          "mode": "smart"
250        },
251        "queue_producers": {
252          "QUEUE_PRODUCER_BINDING": {
253            "name": "some-queue"
254          }
255        },
256        "r2_buckets": {
257          "R2_BINDING": {
258            "name": "some-bucket"
259          }
260        },
261        "services": {
262          "SERVICE_BINDING": {
263            "entrypoint": "MyHandler",
264            "environment": "production",
265            "service": "example-worker"
266          }
267        },
268        "vectorize_bindings": {
269          "VECTORIZE": {
270            "index_name": "my_index"
271          }
272        }
273      }
274    },
275    "domains": [
276      "customdomain.com",
277      "customdomain.org"
278    ],
279    "id": "7b162ea7-7367-4d67-bcde-1160995d5",
280    "latest_deployment": {
281      "aliases": [
282        "https://branchname.projectname.pages.dev"
283      ],
284      "build_config": {
285        "build_caching": true,
286        "build_command": "npm run build",
287        "destination_dir": "build",
288        "root_dir": "/",
289        "web_analytics_tag": "cee1c73f6e4743d0b5e6bb1a0bcaabcc",
290        "web_analytics_token": "021e1057c18547eca7b79f2516f06o7x"
291      },
292      "created_on": "2021-03-09T00:55:03.923456Z",
293      "deployment_trigger": {
294        "metadata": {
295          "branch": "main",
296          "commit_hash": "ad9ccd918a81025731e10e40267e11273a263421",
297          "commit_message": "Update index.html"
298        },
299        "type": "ad_hoc"
300      },
301      "env_vars": {
302        "BUILD_VERSION": {
303          "value": "3.3"
304        },
305        "ENV": {
306          "value": "STAGING"
307        }
308      },
309      "environment": "preview",
310      "id": "f64788e9-fccd-4d4a-a28a-cb84f88f6",
311      "is_skipped": true,
312      "latest_stage": {
313        "ended_on": "2021-03-09T00:58:59.045655",
314        "name": "deploy",
315        "started_on": "2021-03-09T00:55:03.923456Z",
316        "status": "success"
317      },
318      "modified_on": "2021-03-09T00:58:59.045655",
319      "project_id": "7b162ea7-7367-4d67-bcde-1160995d5",
320      "project_name": "ninjakittens",
321      "short_id": "f64788e9",
322      "source": {
323        "config": {
324          "deployments_enabled": true,
325          "owner": "string",
326          "path_excludes": [
327            "string"
328          ],
329          "path_includes": [
330            "string"
331          ],
332          "pr_comments_enabled": true,
333          "preview_branch_excludes": [
334            "string"
335          ],
336          "preview_branch_includes": [
337            "string"
338          ],
339          "preview_deployment_setting": "all",
340          "production_branch": "string",
341          "production_deployments_enabled": true,
342          "repo_name": "string"
343        },
344        "type": "string"
345      },
346      "stages": [
347        {
348          "ended_on": "2021-06-03T15:39:03.134378Z",
349          "name": "queued",
350          "started_on": "2021-06-03T15:38:15.608194Z",
351          "status": "active"
352        },
353        {
354          "ended_on": null,
355          "name": "initialize",
356          "started_on": null,
357          "status": "idle"
358        },
359        {
360          "ended_on": null,
361          "name": "clone_repo",
362          "started_on": null,
363          "status": "idle"
364        },
365        {
366          "ended_on": null,
367          "name": "build",
368          "started_on": null,
369          "status": "idle"
370        },
371        {
372          "ended_on": null,
373          "name": "deploy",
374          "started_on": null,
375          "status": "idle"
376        }
377      ],
378      "url": "https://f64788e9.ninjakittens.pages.dev"
379    },
380    "name": "NextJS Blog",
381    "production_branch": "main",
382    "source": {
383      "config": {
384        "deployments_enabled": true,
385        "owner": "string",
386        "path_excludes": [
387          "string"
388        ],
389        "path_includes": [
390          "string"
391        ],
392        "pr_comments_enabled": true,
393        "preview_branch_excludes": [
394          "string"
395        ],
396        "preview_branch_includes": [
397          "string"
398        ],
399        "preview_deployment_setting": "all",
400        "production_branch": "string",
401        "production_deployments_enabled": true,
402        "repo_name": "string"
403      },
404      "type": "string"
405    },
406    "subdomain": "helloworld.pages.dev"
407  }
408}

私が取得したプロジェクトのレスポンスは以下のようなJSONでした。 キーは、最低限のみ表示しています。

 1{
 2  "result": {
 3    "id": "id-123456789",
 4    "name": "your_project_name",
 5    "subdomain": "your-subdomain.pages.dev",
 6    "build_config": {
 7      "build_command": "hugo",
 8      "destination_dir": "public",
 9      "root_dir": "my_blog",
10      "web_analytics_tag": "your_web_analytics_tag_value",
11      "web_analytics_token": "your_web_analytics_token_value"
12    }
13  },
14  "success": true,
15  "errors": [],
16  "messages": []
17}

Web Analyticsを無効化するには web_analytics_tagweb_analytics_token を nullにすれば良いので "" でアップデートすれば完了です。

Web Analyticsを無効化する

ドキュメントには、以下のcurlのサンプルがあります。

  1curl --request PATCH \
  2  --url https://api.cloudflare.com/client/v4/accounts/account_id/pages/projects/project_name \
  3  --header 'Content-Type: application/json' \
  4  --header 'X-Auth-Email: ' \
  5  --data '{
  6  "build_config": {
  7    "build_caching": true,
  8    "build_command": "npm run build",
  9    "destination_dir": "build",
 10    "root_dir": "/",
 11    "web_analytics_tag": "cee1c73f6e4743d0b5e6bb1a0bcaabcc",
 12    "web_analytics_token": "021e1057c18547eca7b79f2516f06o7x"
 13  },
 14  "deployment_configs": {
 15    "preview": {
 16      "ai_bindings": {
 17        "AI_BINDING": {
 18          "project_id": "some-project-id"
 19        }
 20      },
 21      "analytics_engine_datasets": {
 22        "ANALYTICS_ENGINE_BINDING": {
 23          "dataset": "api_analytics"
 24        }
 25      },
 26      "browsers": {
 27        "BROWSER": {}
 28      },
 29      "compatibility_date": "2022-01-01",
 30      "compatibility_flags": [
 31        "url_standard"
 32      ],
 33      "d1_databases": {
 34        "D1_BINDING": {
 35          "id": "445e2955-951a-43f8-a35b-a4d0c8138f63"
 36        }
 37      },
 38      "durable_object_namespaces": {
 39        "DO_BINDING": {
 40          "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
 41        }
 42      },
 43      "env_vars": {
 44        "property1": {
 45          "type": "plain_text",
 46          "value": "hello world"
 47        },
 48        "property2": {
 49          "type": "plain_text",
 50          "value": "hello world"
 51        }
 52      },
 53      "hyperdrive_bindings": {
 54        "HYPERDRIVE": {
 55          "id": "a76a99bc342644deb02c38d66082262a"
 56        }
 57      },
 58      "kv_namespaces": {
 59        "KV_BINDING": {
 60          "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
 61        }
 62      },
 63      "mtls_certificates": {
 64        "MTLS": {
 65          "certificate_id": "d7cdd17c-916f-4cb7-aabe-585eb382ec4e"
 66        }
 67      },
 68      "placement": {
 69        "mode": "smart"
 70      },
 71      "queue_producers": {
 72        "QUEUE_PRODUCER_BINDING": {
 73          "name": "some-queue"
 74        }
 75      },
 76      "r2_buckets": {
 77        "R2_BINDING": {
 78          "name": "some-bucket"
 79        }
 80      },
 81      "services": {
 82        "SERVICE_BINDING": {
 83          "entrypoint": "MyHandler",
 84          "environment": "production",
 85          "service": "example-worker"
 86        }
 87      },
 88      "vectorize_bindings": {
 89        "VECTORIZE": {
 90          "index_name": "my_index"
 91        }
 92      }
 93    },
 94    "production": {
 95      "ai_bindings": {
 96        "AI_BINDING": {
 97          "project_id": "some-project-id"
 98        }
 99      },
100      "analytics_engine_datasets": {
101        "ANALYTICS_ENGINE_BINDING": {
102          "dataset": "api_analytics"
103        }
104      },
105      "browsers": {
106        "BROWSER": {}
107      },
108      "compatibility_date": "2022-01-01",
109      "compatibility_flags": [
110        "url_standard"
111      ],
112      "d1_databases": {
113        "D1_BINDING": {
114          "id": "445e2955-951a-43f8-a35b-a4d0c8138f63"
115        }
116      },
117      "durable_object_namespaces": {
118        "DO_BINDING": {
119          "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
120        }
121      },
122      "env_vars": {
123        "property1": {
124          "type": "plain_text",
125          "value": "hello world"
126        },
127        "property2": {
128          "type": "plain_text",
129          "value": "hello world"
130        },
131        "BUILD_VERSION": {
132          "value": "3.3"
133        },
134        "delete_this_env_var": null,
135        "secret_var": {
136          "type": "secret_text",
137          "value": "A_CMS_API_TOKEN"
138        }
139      },
140      "hyperdrive_bindings": {
141        "HYPERDRIVE": {
142          "id": "a76a99bc342644deb02c38d66082262a"
143        }
144      },
145      "kv_namespaces": {
146        "KV_BINDING": {
147          "namespace_id": "5eb63bbbe01eeed093cb22bb8f5acdc3"
148        }
149      },
150      "mtls_certificates": {
151        "MTLS": {
152          "certificate_id": "d7cdd17c-916f-4cb7-aabe-585eb382ec4e"
153        }
154      },
155      "placement": {
156        "mode": "smart"
157      },
158      "queue_producers": {
159        "QUEUE_PRODUCER_BINDING": {
160          "name": "some-queue"
161        }
162      },
163      "r2_buckets": {
164        "R2_BINDING": {
165          "name": "some-bucket"
166        }
167      },
168      "services": {
169        "SERVICE_BINDING": {
170          "entrypoint": "MyHandler",
171          "environment": "production",
172          "service": "example-worker"
173        }
174      },
175      "vectorize_bindings": {
176        "VECTORIZE": {
177          "index_name": "my_index"
178        }
179      }
180    }
181  },
182  "name": "NextJS Blog",
183  "production_branch": "main"
184}'

以下のように修正し、実行しました。

 1account_id="your_account_id"
 2project_name="your_project_name"
 3token="TOKEN_123456789"
 4curl --request PATCH \
 5  --url "https://api.cloudflare.com/client/v4/accounts/${account_id}/pages/projects/${project_name}" \
 6  --header "Authorization: Bearer ${token}" \
 7  --header 'Content-Type: application/json' \
 8  --data '{
 9    "build_config": {
10      "web_analytics_tag": "",
11      "web_analytics_token": ""
12    }
13  }' | jq -r . | tee "$(date +"%Y%m%d_%H%M%S").json"

このリクエストが成功すると、設定画面からWeb Analyticsの表示が消えますが、この時点では、HTMLに自動的に挿入されたコードは消えていません。

再ビルドする

再ビルドすることで、挿入されたコードは消えます。

再ビルド後に、Web Analytics用のコードがないことを確認してください。

Analytics コード 無効化前のスクショ

Analytics コード 無効化後のスクショ

分析とログ > Web Analytics から削除する

HTMLからコードは消えましたが、分析とログ > Web Analyticsメニューの一覧からは追加したサイトは消えないようです。 そのため、こちらのリストからも削除します。

分析とログ > Web Analytics 1

APIトークンを更新する

先ほど作成したトークンのアクセス許可を修正して、更新します。

分析とログ > Web Analyticsを編集するには、アクセス許可に アカウント 設定 読み取り(read)アカウント 設定 読み取り(edit) を追加します。

API トークン 3

Web Analyticsの一覧を取得する

以下を参考に、リクエストします。

ドキュメントのサンプル

1curl --request GET \
2  --url https://api.cloudflare.com/client/v4/accounts/account_id/rum/site_info/list \
3  --header 'Content-Type: application/json' \
4  --header 'X-Auth-Email: '

修正したコマンド

1account_id="your_account_id"
2token="TOKEN_123456789"
3curl --request GET \
4  --url "https://api.cloudflare.com/client/v4/accounts/${account_id}/rum/site_info/list" \
5  --header "Authorization: Bearer ${token}" \
6  --header 'Content-Type: application/json' | jq -r . | tee "$(date +"%Y%m%d_%H%M%S").json"

レスポンス

 1{
 2  "result": [
 3    {
 4      "site_tag": "your_site_tag",
 5      "site_token": "your_site_token",
 6      "host": "(komaki-dev.pages.dev|komaki.dev|www.komaki.dev)$",
 7      "created": "2024-09-02T03:53:43.805572Z",
 8      "snippet": "<!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{\"token\": \"token\"}'></script><!-- End Cloudflare Web Analytics -->",
 9      "is_host_regex": true,
10      "auto_install": false
11    }
12  ],
13  "success": true,
14  "errors": null,
15  "messages": null,
16  "result_info": {
17    "page": 1,
18    "per_page": 10,
19    "count": 5,
20    "total_count": 5,
21    "total_pages": 1
22  }
23}

Web Analyticsの一覧から削除する

以下を参考に、リクエストします。

ドキュメントのサンプル

1curl --request DELETE \
2  --url https://api.cloudflare.com/client/v4/accounts/account_id/rum/site_info/site_id \
3  --header 'Content-Type: application/json' \
4  --header 'X-Auth-Email: '

修正したコマンド

1account_id="your_account_id"
2site_id="your_site_tag_value"
3token="TOKEN_123456789"
4curl --request DELETE \
5  --url "https://api.cloudflare.com/client/v4/accounts/${account_id}/rum/site_info/${site_id}" \
6  --header "Authorization: Bearer ${token}" \
7  --header 'Content-Type: application/json' | jq -r . | tee "$(date +"%Y%m%d_%H%M%S").json"

レスポンス

1{
2  "result": {
3    "site_tag": "your_site_tag"
4  },
5  "success": true,
6  "errors": [],
7  "messages": []
8}

分析とログ > Web Analytics から削除されていることを確認する

リストから削除されていることを確認しました。

分析とログ &gt; Web Analytics 2

APIトークンを削除する

不要になったら、APIトークンを削除します。

おわり

もし、間違っている部分がありましたら、コメント頂けると大変助かります。 よろしくお願いいたします。

Tags:
comments powered by Disqus