一个程序员因为搬家,被迫折腾了一个下午,最后写了个工具才解决问题的故事。
起因:搬了个家,差点崩溃
前不久搬了家,新地址、新邮编,一切都好。直到我想起来——我在 Cloudflare 注册了一堆域名,每个域名的 WHOIS 联系人信息(Registrant、Technical、Administrator、Billing,四个角色)都还是老地址。
好,打开 Cloudflare Dashboard,准备批量改一下。
然后我就傻眼了。
吐槽一:Dashboard 根本没有"批量修改"
Cloudflare 的域名注册管理页面,你点进每一个域名,可以看到联系人信息,可以一个一个地改。
但就是没有批量操作。
你有 5 个域名?那你要重复填 5 次表。有 20 个域名?20 次。每次都要填:名、姓、地址、城市、州、邮编、国家、电话、邮箱……
我不是没耐心的人,但这个体验,说句不好听的,连 GoDaddy 2010 年的水平都没达到。
吐槽二:有 API,但对普通用户来说等于没有
Cloudflare 的开发者 API 其实很完整。注册商相关的接口也有:
PUT /accounts/{account_id}/registrar/domains/{domain}/contacts
PUT /accounts/{account_id}/registrar/address_book/{address_id}但你得:
自己去申请一个 API Token(权限还要配置正确)
从 Dashboard URL 里手动扒出那个 32 位十六进制的
account_id先查你默认地址的
address_id,再拿它去更新对每个域名,分别调用 contacts 接口,而且 registrant/technical/administrator/billing 四个角色的 body 要自己组装
这不是人干的。普通用户根本不可能走这条路。
吐槽三:CORS 把你堵死在门口
好,我是程序员,我想写个小页面,直接从浏览器调 Cloudflare API,省点事。
结果发现:api.cloudflare.com 的 CORS 策略,不允许从任意第三方页面发请求——即使你在浏览器里已经登录了 Cloudflare,即使有有效的 session cookie。
所以最直接的方案——写个静态页面调 API——直接被封死。
我们的解决过程(以及走过的弯路)
第一版:PHP 后端代理
既然客户端不能直接调 API,那就绕开 CORS,上服务端。
第一版写了一个单文件 PHP 应用,功能挺完整的:
输入 API Token,自动检测账号
拉取所有域名(支持分页)
更新默认地址簿
批量更新所选域名的联系人
更新后自动回读验证,字段级别 diff 对比
功能完善,UI 也不错。但问题来了:要跑 PHP,你得有个服务器。这对大部分想解决问题的普通用户来说,门槛又回来了。而且,把 API Token 输入到一个陌生网站上,安全感很差。
第二版:彻底静态,脚本注入
换了个思路。
既然 CORS 只拦第三方页面,但不拦 dash.cloudflare.com 自己的 Console——那就生成一段 JS 脚本,让用户直接粘贴到浏览器 DevTools 的 Console 里执行。
脚本在 Cloudflare 自己的域下运行,天然有 session 权限,不需要 API Token,CORS 也不是问题。
这个思路解决了所有问题:
零后端:纯静态页面,直接托管在 Cloudflare Pages
零 API Token:用已有的 session cookie 鉴权
零信任风险:生成的脚本你可以自己读,透明可审计
批量更新:一次性并发处理所有域名
工具分三个功能 Tab:
构建体系
工具本身用纯原生 HTML/CSS/JS 写,没有框架。为了部署方便,用 Vite + vite-plugin-singlefile 把所有资源(CSS、JS、SVG 图标、favicon)打包成一个自包含的 HTML 文件。
pnpm build → dist/index.html(所有资源内联)
pnpm ship → 自动部署到 Cloudflare Pages用起来就三步
打开 cf.ropean.org 填好你的联系信息
点"Generate Script",复制生成的脚本
打开 dash.cloudflare.com → F12 → Console → 粘贴 → 回车
搞定。搬家地址更新,5 分钟以内。
最后说两句
Cloudflare 是个很优秀的公司,CDN、DNS、Workers 都做得很好。但在域名注册这个产品上,联系人批量管理这个基础功能的缺失,对于持有多个域名的用户来说,真的是一个很明显的痛点。
官方 API 存在但门槛高,Dashboard 功能缺失,CORS 策略又把自助方案堵死——这一连串的设计决策,逼得我们用"往 DevTools 粘贴脚本"这种方式来绕过去。
如果你也有同样的烦恼,欢迎直接用我们的工具:
开源在 GitHub:ropean/cloudflare-address-updater
代码完全透明,生成的脚本可以自己审计,不存任何数据。
如果 Cloudflare 哪天出了官方批量联系人更新功能,我会很高兴这个工具退休的。