想实现一个类似于DDNS的功能,用的Cloudflare的服务,需要频繁更新我的某个二级域名的A记录值,每次都登陆一下Cloudflare网页感觉比较麻烦,于是实现了一个自动更新的工具型脚本。
首先在Cloudflare的DNS管理页面创建二级域名A记录,因为我想让我这个二级域名都取值内网的IP,不想让它代理我的流量,所以把我下图画红框的地方改成“仅限 DNS - reserved IP”。
然后去下图这里按照序号顺序,找到“查看"按钮,在你输入你得账户密码并通过图片验证码以后
,你就能得到你的账户token,一会脚本里边要用到。
接下来使用我写好的如下脚本,把你的Cloudflare的账户登录邮箱和刚才找到的账户token填入脚本对应变量中,把你要更新的二级域名和你想更新成新记录值填入到脚本最后一行2个入参里。
import requests
import json
class CloudFlareDDNSUpdater:
def __init__(self, Auth_Email, Auth_Key):
self.headers = {
"X-Auth-Email": Auth_Email,
"X-Auth-Key": Auth_Key,
"Content-Type": "application/json",
}
self.loginVerify()
def loginVerify(self):
url = "https://api.cloudflare.com/client/v4/user/"
res = requests.get(url=url, headers=self.headers)
data = json.loads(res.text)
if not data["success"]:
print(data["errors"])
exit()
print(f"[+] User {data['result']['username']} verified successfully")
def list_zone_identifier(self):
url = "https://api.cloudflare.com/client/v4/zones"
res = requests.get(url=url, headers=self.headers)
data = json.loads(res.text)
# print(f"[i] get {data['result_info']['count']} domains")
return data["result"]
def list_zone_record(self, domain_id):
url = f"https://api.cloudflare.com/client/v4/zones/{domain_id}/dns_records?page=1&per_page=20&order=type&direction=asc"
res = requests.get(url=url, headers=self.headers)
data = json.loads(res.text)
# print(f"[i] get {data['result_info']['count']} records")
return data["result"]
def updateARecord(self, domain_name, ip):
print(f"[i] Obtaining the necessary information")
domains = self.list_zone_identifier()
target_domain = list(filter(lambda x:x["name"] in domain_name, domains))[0]
records = self.list_zone_record(target_domain["id"])
target_record = list(filter(lambda x:x["name"]==domain_name, records))[0]
domain_id, record_id = target_domain["id"], target_record["id"]
url = f"https://api.cloudflare.com/client/v4/zones/{domain_id}/dns_records/{record_id}"
data = {
"type": "A",
"name": domain_name,
"content": ip,
"ttl": 120,
"proxied": False,
}
res = requests.put(url=url, headers=self.headers, data=json.dumps(data))
data = json.loads(res.text)
if data["success"]:
print(f"[+] Now {data['result']['name']} {data['result']['type']} record is {data['result']['content']}")
print(f"[i] May will take effect in {int(data['result']['ttl']/60)} minutes")
else:
print(data["errors"])
exit()
return data["result"]
if __name__ == "__main__":
Auth_Email = "your_email@xxx.com"
Auth_Key = "axxxxxxxxxxxxxxxxxxxxxx6"
updater = CloudFlareDDNSUpdater(Auth_Email, Auth_Key)
updater.updateARecord("lan.yourdomain.com", "10.92.11.77")
运行脚本,看到如下结果则自动更新成功。
检查一下,发现DNS记录值已经更新。