我用 Cloudflare 的 API 写了一个脚本

建议阅读本文之前顺带打开鲁迅的小说《孔乙己》

正文

某日,Leao 在 Leao 和他的朋友们 群里一上线,群里所有的人便都看着他笑,有的叫道,“Leao ,你的新脚本又剽窃了!”他不回答,对群主 krau 说,“整两个脚本,要一个能写文章的。”便排出九张涩图。他们又故意的高声嚷道,“你一定又(白)嫖了人家的东西了!”Leao 睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你嫖了 yulewang 的脚本。” Leao 便涨红了脸,额上的青筋条条绽出,争辩道,“嫖脚本不能算剽窃……脚本!……博客人的事,能算剽窃么?”接连便是难懂的话,什么“改脚本不能算嫖”,什么“作者没声明就是MIT(”之类,引得众人都哄笑起来;群内外充满了快活的空气。

真·正文

好了,玩梗结束,说点正经的。这个脚本是我在去年基于 yulewang/cloudflare-api-v4-ddns 项目 改写的,就算是上个月也是去年了
因为我当时需要用到 IPv6 的 DDNS,所以就看到了这个脚本。但由于其作者已经很久没更新了,所以导致使用时只能使用 Global Key。

两年前了(

但众所周知,Cloudflare 的 Global Key 是有 ROOT 权限的,对于有 ROOT 权限的 API,一般使用时都需要极为谨慎,一个不小心就有可能导致出现不可预料的后果。
因此,我 Fork 了原作者的项目,并对其进行了小修小改之后提交了一个 Pull requests (见 https://github.com/yulewang/cloudflare-api-v4-ddns/pull/18
我修改后的项目

具体的修改内容如下:

  1. 在原脚本的基础上,增加了一个 -a ${API Token Key},实现既兼容原脚本的 Global Key 又能使用 API Token
  2. 修复了原脚本在设置记录类型为 AAAA 时因一个逻辑错误导致无法实现 IPv6 的 DDNS 的 BUG

使用方法

下载脚本

下载脚本并保存到 /usr/local/bin 目录下

  • GitHub
1
curl https://raw.githubusercontent.com/Leao9203/cloudflare-api-v4-ddns/dev/cf-v4-ddns.sh > /usr/local/bin/cf-ddns.sh && chmod +x /usr/local/bin/cf-ddns.sh
  • Gitee
1
curl https://gitee.com/Leao9203/cloudflare-api-v4-ddns/raw/dev/cf-v4-ddns.sh > /usr/local/bin/cf-ddns.sh && chmod +x /usr/local/bin/cf-ddns.sh

验证方式

打开并登陆 https://dash.cloudflare.com/profile/api-tokens
下面的两种方式二选一即可

创建 API Token

点击 Create Token,用 Edit zone DNS 的模板(Use template)

Zone Resources 设置为 Include - All zones,其他的看需求改(不改也没事

然后点 Continue to summary,将生成的 Token 复制下来

获取 Global API Key

点击 Global API Key 右边的 View

输入密码再点击一次 View,会出现 API Key,复制下来

设置脚本脚本自动更新

运行 crontab -e,在最下面加入一行

1
*/1 * * * * /usr/local/bin/cf-ddns.sh $Auth -u example@example.com -h ep.example.com -z example.com -t A > /var/log/cf-ddns.log 2>&1

其中需要修改的内容

$Auth 修改为

  • 使用 API Token:-a Token,Token 改为上一步中生成的 API Token。
  • 使用 Global API Key:-k Key,Key 改为上一步中获取的 Global API Key。

example@example.com 修改为 Cloudflare 的登录邮箱
ep.example.com 修改为要更新的完整域名
example.com 修改为要更新的顶级域名
A 修改为更新的方式,IPv4 就是 A,IPv6 就是 AAAA
(可选)/var/log/cf-ddns.log 修改为 /dev/null,不记录日志

后记

本文正文部分大量玩梗,切勿当真。
该脚本 Fork 自 yulewang/cloudflare-api-v4-ddns项目,我在原项目的内容上做了一些小修改,将 LICENSE 设为 Unlicense。

接下来是写一个 DNSPod 的 DDNS(本来说是写脚本的,但是腾讯云需要做鉴权,不得已转成了 Golang)

引用内容

  1. 孔乙己,引自萌娘百科
  2. yulewang/cloudflare-api-v4-ddns
  3. Cloudflare API v4 Documentation