Cloudflare Web Analyticsの設定をREST APIで行う方法
こんにちは。
Cloudflare PagesのWeb Analyticsを有効にしているプロジェクトがいくつかあり、Web Analyticsを無効化しようと、プロジェクトのページにアクセスしました。 しかし、今まで設定画面に表示されていたWeb Analyticsの設定ボタンがなくなっていました。
これは困った…
といことで、CloudflareのREST APIを確認し、API経由でWeb Analyticsを無効化することにしました。
以下は、作業メモです。
ドキュメント
以下のAPIを使います。
- https://developers.cloudflare.com/api/operations/pages-project-get-project
- https://developers.cloudflare.com/api/operations/pages-project-update-project
APIトークンの準備
APIトークンを作成し、検証します。
アクセス許可には Clodflare Pages 読み取り(read)
と Clodflare Pages 編集(edit)
を追加します。
APIトークンを作成
APIトークンの作成完了
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_tag
と web_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用のコードがないことを確認してください。
分析とログ > Web Analytics から削除する
HTMLからコードは消えましたが、分析とログ > Web Analytics
メニューの一覧からは追加したサイトは消えないようです。
そのため、こちらのリストからも削除します。
APIトークンを更新する
先ほど作成したトークンのアクセス許可を修正して、更新します。
分析とログ > Web Analytics
を編集するには、アクセス許可に アカウント 設定 読み取り(read)
と アカウント 設定 読み取り(edit)
を追加します。
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 から削除されていることを確認する
リストから削除されていることを確認しました。
APIトークンを削除する
不要になったら、APIトークンを削除します。
おわり
もし、間違っている部分がありましたら、コメント頂けると大変助かります。 よろしくお願いいたします。