DDNS for Cloudflare

一、获取Global API Key

点击这里获取Global API Key

  • 本脚本公网IP获取依赖淘宝IP地址库
  • 本脚本依赖jq库用于json解析

二、生成shell脚本

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/bin/bash
Email=[email protected]
Global_API_Key=YourGlobalAPIKey
domain=YourDomain.com
# a_name可以为空
a_name=YourARecord


function getPublicIp()
{
ip=""
info=`curl -s --connect-timeout 10 -m 20 \
-X GET "http://ip.taobao.com/service/getIpInfo.php?ip=myip"`
ip=`echo ${info} | jq .data.ip`
ip=`echo ${ip#*\"}`
ip=`echo ${ip%\"*}`
echo ${ip}
}

function getDomainZoneId()
{
zone_id=""
list_zones=`curl -s --connect-timeout 10 -m 20 \
-X GET "https://api.cloudflare.com/client/v4/zones?name=${domain}" \
-H "X-Auth-Email: ${Email}" \
-H "X-Auth-Key: ${Global_API_Key}" \
-H "Content-Type: application/json"`
count_zone=`echo ${list_zones} | jq .result_info.count`
if [[ ${count_zone} -eq 1 ]];then
zone_id=`echo ${list_zones} | jq .result[0].id`
zone_id=`echo ${zone_id#*\"}`
zone_id=`echo ${zone_id%\"*}`
fi
echo ${zone_id}
}

function getDnsRecord()
{
record=""
list_dns_records=`curl -s --connect-timeout 10 -m 20 \
-X GET "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records?type=A&name=${address}" \
-H "X-Auth-Email: ${Email}" \
-H "X-Auth-Key: ${Global_API_Key}" \
-H "Content-Type: application/json"`
count_dns=`echo ${list_dns_records} | jq .result_info.count`
if [[ ${count_dns} -eq 1 ]];then
record=`echo ${list_dns_records} | jq .result[0]`
fi
echo ${record}
}

function getDnsRecordId()
{
record_id=""
record=$(getDnsRecord)
if [[ ${record}!="" ]];then
record_id=`echo ${record} | jq .id`
record_id=`echo ${record_id#*\"}`
record_id=`echo ${record_id%\"*}`
fi
echo ${record_id}
}

function getDnsRecordContent()
{
record_content=""
record=$(getDnsRecord)
if [[ ${record}!="" ]];then
record_content=`echo ${record} | jq .content`
record_content=`echo ${record_content#*\"}`
record_content=`echo ${record_content%\"*}`
fi
echo ${record_content}
}

function createDnsRecord()
{
create_success=""
create_dns_record=`curl -s --connect-timeout 10 -m 20 \
-X POST "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records" \
-H "X-Auth-Email: ${Email}" \
-H "X-Auth-Key: ${Global_API_Key}" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"${address}\",\"content\":\"${ip}\"}"`
create_success=`echo ${create_dns_record} | jq .success`
echo ${create_success}
}

function updateDnsRecord()
{
update_success=""
update_dns_record=`curl -s --connect-timeout 10 -m 20 \
-X PUT "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id}" \
-H "X-Auth-Email: ${Email}" \
-H "X-Auth-Key: ${Global_API_Key}" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"${address}\",\"content\":\"${ip}\"}"`
update_success=`echo ${update_dns_record} | jq .success`
echo ${update_success}
}


address=${domain}
if [[ ${a_name} != "" ]];then
address=${a_name}.${domain}
fi
echo "当前设置域名:"${address}

ip=""
while [ ip="" ]
do
ip=$(getPublicIp)
if [[ ${ip} != "" ]];then
echo "公网IP:"${ip}

zone_id=""
zone_id=$(getDomainZoneId)
if [[ ${zone_id} != "" ]];then
echo "域名["${domain}"]的Zone ID:"${zone_id}

record_id=""
record_id=$(getDnsRecordId)
record_content=$(getDnsRecordContent)
if [[ ${record_id} != "" && ${record_content} != "" ]];then
echo "地址["${address}"]的Record ID:"${record_id}
echo "地址["${address}"]的Record Content:"${record_content}
if [[ ${ip} = ${record_content} ]];then
echo "地址["${address}"]的Record Content与当前公网IP一致!"
else
echo "地址["${address}"]的Record Content与当前公网IP不一致!"
echo "更新结果:"$(updateDnsRecord)
fi
else
echo "地址["${address}"]的Record没有找到!"
echo "添加结果:"$(createDnsRecord)
fi
else
echo "域名["${domain}"]的Zone ID没有找到!"
fi

break
else
echo "公网IP获取失败!5s后重试..."
sleep 5s
fi
done