如何批量删除 Cloudflare Pages 的旧部署(Python 脚本)

如何批量删除 Cloudflare Pages 的旧部署(Python 脚本)

Zarijaden

每次 Git 推送都会自动触发 Cloudflare Pages 部署,几个月下来积攒了几百个旧版本,手动删除能点到手抽筋。本文教你用 Python + Cloudflare API 一键清空所有历史部署,只保留当前正在使用的那个。

1. 准备工作

你需要准备三样东西:

  • Account ID
    登录 Cloudflare 仪表盘,在 Pages 项目概览页面的右下角可以找到,或者从 URL 中提取(https://dash.cloudflare.com/xxxxxx/... 中的那一串)。

  • Project Name
    就是你的 Pages 项目名称,例如 my-blog。

  • API Token
    在 Cloudflare 仪表盘侧栏 → 管理账户 → 账户API 令牌 → 创建令牌。
    选用Edit Cloudflare Workers模板 。
    生成后复制您的API令牌保存,只显示一次。
    img
    img
    img
    img
    img

2. 脚本说明

下面的 Python 脚本会:

  • 自动翻页拉取该项目下的所有部署记录(Cloudflare API 默认每页 20 条);
  • 逐个调用删除接口,跳过当前正在使用的部署(生产或预览环境会返回 400,不影响);
  • 输出每个部署 ID 和删除状态码。

为什么需要翻页?

Cloudflare API 默认只返回第一页(最多 20~25 条)。如果你的部署数量超过这个数,必须通过 page 参数循环取完所有数据。本例通过 result_info.total_pages 判断是否还有下一页。

3. 完整脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import subprocess
import sys
import importlib.util

def install_package(package):
print(f"正在安装缺失的库: {package} ...")
try:
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
print(f"{package} 安装成功")
return True
except Exception as e:
print(f"安装 {package} 失败: {e}")
print("请手动执行: pip install requests")
return False

if importlib.util.find_spec("requests") is None:
if not install_package("requests"):
sys.exit(1)

import requests
import getpass

print("\n" + "="*50)
print(" Cloudflare Pages 批量删除旧部署工具")
print("="*50)

account_id = input("请输入 Cloudflare Account ID: ").strip()
api_key = getpass.getpass("请输入 Cloudflare API Token(输入时不显示): ").strip()
project_names_input = input("请输入项目名称(多个用英文逗号分隔,如 zari-blog,my-site): ").strip()
project_names = [p.strip() for p in project_names_input.split(",") if p.strip()]
if not account_id or not api_key or not project_names:
print("错误:Account ID、API Token 和项目名称都不能为空!")
exit(1)
total_deleted = 0
total_failed = 0
error_details = []

for project_name in project_names:
print(f"\n 正在处理项目: {project_name}")

base_url = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/pages/projects/{project_name}/deployments"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}

all_deployment_ids = []
page = 1

while True:
params = {"page": page}
try:
response = requests.get(base_url, headers=headers, params=params)
data = response.json()
except Exception as e:
print(f"请求第 {page} 页时出错: {e}")
break

if not data.get("success"):
print("API 返回错误:", data)
break

result = data.get("result", [])
if not result:
break

for entry in result:
all_deployment_ids.append(entry["id"])

result_info = data.get("result_info", {})
total_pages = result_info.get("total_pages")
if total_pages is not None and page >= total_pages:
break
page += 1

print(f"共找到 {len(all_deployment_ids)} 个部署,开始删除...")

for deployment_id in all_deployment_ids:
delete_url = f"{base_url}/{deployment_id}"
try:
del_response = requests.delete(delete_url, headers=headers)
status = del_response.status_code
print(f"Deleted {deployment_id}: {status}")
if status == 200:
total_deleted += 1
else:
total_failed += 1
error_details.append(f"{project_name}/{deployment_id} -> {status}")
except Exception as e:
print(f"删除 {deployment_id} 时异常: {e}")
total_failed += 1
error_details.append(f"{project_name}/{deployment_id} -> Exception: {e}")

print("\n" + "="*40)
print("所有项目处理完毕!")
print(f"成功删除: {total_deleted} 个部署")
print(f"失败/跳过: {total_failed} 个部署(含正在使用的保护部署和异常)")
if error_details:
print("\n失败详情(前 20 条):")
for err in error_details[:20]:
print(f" - {err}")
if len(error_details) > 20:
print(f" ... 还有 {len(error_details)-20} 条未显示")
print("="*40)

4. 运行方法

  1. 保存文件,比如 clean_pages.py。

  2. 打开终端(CMD / PowerShell / Terminal),切换到文件所在目录。

  3. 直接运行:

    1
    python clean_pages.py
  4. 根据提示依次输入:

  • Cloudflare Account ID(一串字母数字)
  • Cloudflare API Token(你的密钥)
  • 项目名称(多个用英文逗号隔开,比如 zari-blog,my-site)
  1. 等待脚本执行,它会自动翻页拉取全部部署,然后逐个删除。

  2. 查看最终统计:

  • 成功删除数量
  • 失败/跳过数量(其中必然包括当前正在使用的部署,状态码 400,属于正常)
  • 如果有异常,会显示前 20 条错误详情。

5. 执行结果说明

运行后会输出类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\Users\13794\Desktop>python dsv.py
Commencing zari-blog:
共找到 424 个部署,开始删除...
Deleted c3a18249-c3ba-4690-a65c-8d56f195aa5b: 400
Deleted 85bb2e50-9f28-4812-ac78-efb21674ecdd: 200
......
Deleted ddee7304-a551-4d4e-8b6a-b4ee2d508dce: 200
Deleted f2ab2180-3d41-4b77-a8ea-2958ce12a1d7: 200
Deleted 91ca4c44-46bf-4b82-ad35-c3eeb4332354: 200
Deleted c63716e6-6923-453a-b4fa-82d15f06de11: 400
......
Deleted 9c773389-8f01-4e20-99cf-cd49fa3a2f77: 200
Deleted 3aa1e966-9a64-4a9b-bfbb-097aaedd4c02: 200
Deleted 38b24c04-e9df-4930-b496-c3a3e8d335fa: 200

这里我删着删着卡住不动了。。。

  • 状态码 200:删除成功。
  • 状态码 400:该部署当前被用作生产环境或预览环境,Cloudflare 禁止删除,这是正常的保护机制,你的网站不会受影响。

最终,你的 Pages 项目只会留下当前正在运行的部署,其他所有历史版本都会消失。

6. 注意事项

  • 确保 API Token 权限正确:至少要有 Pages: Edit 权限,否则会返回 403 或 10000 错误。
  • 删除不可恢复:请确认你真的不需要那些旧部署(通常它们只是历史存档,不影响当前站点)。
  • 限流:Cloudflare API 有速率限制,但删除几十上百个部署一般不会触发,脚本可放心运行。
  • 多项目支持:脚本中的 project_names 列表支持多个项目,会依次处理。

7. 结语

通过以上方法,你可以轻松清理积压的 Pages 部署记录,让项目列表变得清爽。如果你有更高级的需求(比如只保留最近 N 个版本),也可以在丢给AI,把脚本稍作修改。

希望这篇教程对你有所帮助!如果遇到其他问题,欢迎在评论区交流。


参考文献:
快速删除 Cloudflare Pages 的旧部署丨化猫の幻

  • 标题: 如何批量删除 Cloudflare Pages 的旧部署(Python 脚本)
  • 作者: Zarijaden
  • 创建于 : 2026-08-29 00:00:00
  • 更新于 : 2026-10-03 05:09:07
  • 链接: https://zarijaden.cc.cd/2026/08/28/2026-08-29-删cf旧部署/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论