Cloudflare DNS A记录自动更新脚本

想实现一个类似于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记录值已经更新。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值