自动更新 Cloudflare 中的域名解析记录为最快 IP(Windows/Linux 脚本+手动教程)

一、获取 API 令牌

任何 API 操作都需要提供账号邮箱和 API 令牌用来验证身份。

  1. 前往 Cloudflare API 令牌页面。
  2. 点击 Global API Key 后面的 [查看] 按钮。
  3. 输入 Cloudflare 账号的 密码 ,并通过人机验证。
  4. 点击复制 API 令牌并保存好。

二、准备依赖

我比较习惯用 cURL 来 POST 提交数据,所以以下用的都是 cURL 命令。

Linux 系统

虽然大部分的 Linux 系统都自带了 cURL,但是还是提前检查一下是否已安装:

curl --help

如果提示没找到命令,那么就需要手动安装了:

# CentOS 系统
yum install -y curl

# Debian/Ubuntu 系统
apt-get install -y curl

三、获取域名 ID

域名 ID 指的是你在 Cloudflare 中托管一级/顶级域名的 ID(如 xxx.yyy,而不是子域名)。

注意 :以下的 命令都是一个整体 ,修改后要 一起粘贴、运行\^ 符号是命令分行用的,这样写方便大家理解。

Linux 系统

curl -X GET "https://api.cloudflare.com/client/v4/zones" \
-H "X-Auth-Email: 账号邮箱" \
-H "X-Auth-Key: 前面获取的 API 令牌" \
-H "Content-Type: application/json"

四、查找域名 ID

运行命令后,会输出一大串 JSON 内容,因为没有经过格式化,所以看起毫无可读性,可以随便找个在线 JSON 格式化网站,复制 JSON 内容到左边输入框中即可在右边看到格式化后的 JSON 内容,然后 找到以下内容

注意 :复制 JSON 内容去格式化的时候,别复制错了,JSON 是以 { 开头,以 } 结尾的。

"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"name": "yyy.zzz",
"status": "active",
id 域名 ID
name 托管在 Cloudflare 的(顶级/一级)域名
保存好这个域名 ID ,后面还需要用到。

五、获取域名解析记录 ID

域名解析记录 ID 指的是域名解析的完整子域名的 ID(完整子域名如 xxx.yyy.zzz,而不是 yyy.zzz)。

注意 :以下的 命令都是一个整体 ,修改后要 一起粘贴、运行\^ 符号是命令分行用的,这样写方便大家理解。

## Linux 系统

curl -X GET "https://api.cloudflare.com/client/v4/zones/域名ID/dns_records?page=1&per_page=20&order=type&direction=asc" \
-H "X-Auth-Email: 账号邮箱" \
-H "X-Auth-Key: 前面获取的 API 令牌" \
-H "Content-Type: application/json"

六、查找域名的解析记录 ID

运行命令后,会输出一大串 JSON 内容,因为没有经过格式化,所以看起毫无可读性,可以随便找个在线 JSON 格式化网站,复制 JSON 内容到左边输入框中即可在右边看到格式化后的 JSON 内容,然后 找到以下内容

注意 :复制 JSON 内容去格式化的时候,别复制错了,JSON 是以 { 开头,以 } 结尾的。

"id":"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
"zone_id":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"zone_name":"yyy.zzz",
"name":"xxx.yyy.zzz",
"type":"A",
"content":"X.X.X.X",
"proxied":true,
"ttl":1,
id 域名解析记录 ID
zone_id 所属的域名 ID
zone_name 所属的(顶级/一级)域名
name 完整(子)域名
type 解析记录类型
content 解析 IP 地址
proxied 是否走 CDN 代理,是:true,否:false
ttl 解析记录生存时间,值为 1 则是自动,单位:秒
保存好这些信息,后面还需要用到。

七、更新域名解析记录

即修改指定子域名的解析记录信息。

注意 :以下的 命令都是一个整体 ,修改后要 一起粘贴、运行\^ 符号是命令分行用的,这样写方便大家理解。

## Linux 系统

curl -X PUT "https://api.cloudflare.com/client/v4/zones/域名ID/dns_records/解析记录ID" \
-H "X-Auth-Email: 账号邮箱" \
-H "X-Auth-Key: 前面获取的 API 令牌" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"xxx.yyy.zzz","content":"最快 IP","ttl":1,"proxied":true}'

# 如果你只需要更新该域名解析记录中单独 “一个” 信息(上面那个只能同时设置域名解析记录的所有信息),那么可以改成这样:

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/域名ID/dns_records/解析记录ID" \
-H "X-Auth-Email: 账号邮箱" \
-H "X-Auth-Key: 前面获取的 API 令牌" \
-H "Content-Type: application/json" \
--data '{"content":"最快 IP"}'

八、成功?失败?

运行命令后,会输出的一大串 JSON 内容,在其末尾看到,

  • 如果写的是 "success":true 则说明 成功
  • 如果写的是 "success":false 则说明 失败 ,原因会在后面的 messages 中说明。

九、关于命令中的 JSON 数据说明

指的就是更新解析记录命令中的这段内容:

{"type":"A","name":"xxx.yyy.zzz","content":"最快 IP","ttl":1,"proxied":true}

名称 示例 说明
type A 解析记录类型 ,如:A, AAAA, CNAME, HTTPS, TXT, SRV, LOC, MX, NS, SPF, CERT, DNSKEY…
name xxx.yyy.zzz 完整的域名 ,不能只写子域名名称,最长 255 个字符
content 127.0.0.1 解析 IP 地址 ,IPv4、IPv6
ttl 1 解析记录生存时间 ,值为 1 则是自动,单位:秒
proxied true 是否走 CDN 代理 ,是:true,否:false

十、自动更新脚本

因为时间优先,我就先简单的写了两个脚本,可能比较简陋。。。所以有什么建议可以跟我说。

## Linux 系统

脚本以内置到压缩包内了,只需要赋予其执行权限即可:

chomd +x cfst_ddns.sh

然后复制以下内容修改后, 一起粘贴运行 ,即可生成配置文件 cfst_ddns.conf

echo -e "FOLDER=/root/CloudflareST
ZONE_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DNS_RECORDS_ID=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
EMAIL=xxx@yyy.com
KEY=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
TYPE=A
NAME=xxx.yyy.zzz
TTL=1
PROXIED=true" > cfst_ddns.conf

配置文件说明:

变量名
FOLDER CloudflareST 测速程序所在路径
ZONE_ID 域名 ID
DNS_RECORDS_ID 域名解析记录 ID
EMAIL 账号邮箱
KEY API 令牌
TYPE 解析记录类型
NAME 完整域名
TTL 解析记录生存时间,值为 1 代表自动,单位:秒
PROXIED 是否走 CDN 代理,是:true,否:false
然后运行脚本试试看:
bash cfst_ddns.sh

## 其他说明

  • 以上脚本只是一个示例,大家可以按需修改,比如在 ./CloudflareST 后面添加其他参数。
  • 如果是在路由器上面跑该脚本(如 OpenWrt),请先 关闭路由器内的代理 ,否则测速结果会不准确。

十一、定时任务

## Linux 系统

Linux 自然要用 Cron 来定时执行脚本。

### 安装 Cron

一般各 Linux 系统都自带了 Cron,执行 crontab -l 命令,如果提示 命令不存在 ,说明没有安装, 反之则跳过该步骤

# 确认你是哪个系统,然后选择对应的命令安装 Cron 程序。

# CentOS 系统:
yum install vixie-cron
yum install crontabs

# Debian/Ubuntu 系统:
apt-get install cron

### 配置 Cron

开始编辑定时任务,

crontab -e

首次使用可能会提示你如下内容:

# 这就是让你选一个文本编辑器,新手建议用默认的 nano,直接回车即可。

Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed

然后就会看到一大片的文本,不用管,那些只是注释(井号 # 开头的都是注释),写的是使用方法。

  • 如果你选的是 nano 编辑器,那么可以直接开始编辑了。
  • 如果你选的是 vim 编辑器,则需要按下 I 键 进入编辑模式。
    定时任务格式其实很简单:
*    *   *    *   * cd /xxx && ./cfst_ddns.sh
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 7) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

还是看不懂?没关系,我直接给你几个示例(脚本下载):

# 假设脚本位于 /root 目录下(其他位置自己改下面示例),那么:

# 每天凌晨 5 点 0 分,执行一次脚本
0 5 * * * cd /root && ./cfst_ddns.sh

# 每天凌晨 5 点 30 分,执行一次脚本
30 5 * * * cd /root && ./cfst_ddns.sh

# 每 6 个小时(0 分时),执行一次脚本
0 */6 * * * cd /root && ./cfst_ddns.sh

# 每小时 0 分,执行一次脚本
0 * * * * cd /root && ./cfst_ddns.sh

写入后,保存定时任务:

  • nano :按下 Ctrl+X 键、按下 Y 键、按下回车键,即可保存。
  • vim :按下 Esc 键退出编辑模式,直接输入 :wq 并回车(英文模式下),即可保存。
    这时候再去查看定时任务,看看是否保存成功:
crontab -l