
如何批量删除 Cloudflare Pages 的旧部署(Python 脚本)
每次 Git 推送都会自动触发 Cloudflare Pages 部署,几个月下来积攒了几百个旧版本,手动删除能点到手抽筋。本文教你用 Python + Cloudflare API 一键清空所有历史部署,只保留当前正在使用的那个。
1. 准备工作
你需要准备三样东西:
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. 运行方法
保存文件,比如 clean_pages.py。
打开终端(CMD / PowerShell / Terminal),切换到文件所在目录。
直接运行:
根据提示依次输入:
- Cloudflare Account ID(一串字母数字)
- Cloudflare API Token(你的密钥)
- 项目名称(多个用英文逗号隔开,比如
zari-blog,my-site)
等待脚本执行,它会自动翻页拉取全部部署,然后逐个删除。
查看最终统计:
- 成功删除数量
- 失败/跳过数量(其中必然包括当前正在使用的部署,状态码 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 的旧部署丨化猫の幻