Python DNSPod DDNS更新脚本 - ZhangTory's NoteBlog - 张耀誉的笔记博客

Python DNSPod DDNS更新脚本

想在路由器上做DDNS,但是路由器固件不支持DNSPod,百度了一下DNSPod的DDNS脚本,发现之前很多人用的shell脚本的API已经过时了,加上我对shell脚本不熟,所以就根据DNSPod的API文档自己写了一个Python脚本。

首先需要在 账号中心 - API秘钥 - DNSPod Token 中创建秘钥,需要记录下秘钥的ID和Token供后续使用。
根据API文档,在更新DDNS记录时,如果IP没有变化,多次请求后会暂时禁封账号1小时,所以我们希望当IP发生变化时才调用修改接口。那么我们可以首先获取对应记录的IP信息,然后从第三方获取当前的公网IP进行比较,不一致时才调用修改接口。另外每个账号调用API频率也有限制,最低一档是3000次每小时,所以我们在做定时调用时需要考虑到自己的情况。
使用很简单,python脚本如下,只用修改4个常量即可。其中LOGIN_ID和LOGIN_TOKEN是申请得到的,DOMAIN就是你购买的域名,SUB_DOMAIN就是希望做DDNS的子域名,比如我要对www.zhangtory.com做ddns,那么DOMAIN=”zhangtory.com“,SUB_DOMAIN="www"。

import requests
import json
import time


LOGIN_ID = "你的秘钥ID"
LOGIN_TOKEN = "你的秘钥Token"
DOMAIN = "你的域名,如zhangtory.com"
SUB_DOMAIN = "你的子域名,如www"

dns_headers = {
        "UserAgent": "DDNS MODIFY/1.0.0 (i@zhangtory.com)"
    }


def get_ip():
    headers = {
        "accept": "application/json"
    }
    request = requests.get("http://httpbin.org/ip", headers=headers)
    return json.loads(request.text)["origin"]


def get_dns_info():
    data = {
        "domain": DOMAIN,
        "sub_domain": SUB_DOMAIN,
        "login_token": LOGIN_ID + "," + LOGIN_TOKEN,
        "format": "json",
    }
    result = requests.post("https://dnsapi.cn/Record.List", headers=dns_headers, data=data)
    json_data = json.loads(result.text)
    return {
        "record_id": json_data["records"][0]["id"],
        "record_line_id": json_data["records"][0]["line_id"],
        "value": json_data["records"][0]["value"],
    }


def modify_dns(info):
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ": ip changed. Modify.")
    data = {
        "login_token": LOGIN_ID + "," + LOGIN_TOKEN,
        "format": "json",
        "domain": DOMAIN,
        "sub_domain": SUB_DOMAIN,
        "record_id": info["record_id"],
        "record_line_id": info["record_line_id"]
    }
    result = requests.post("https://dnsapi.cn/Record.Ddns", headers=dns_headers, data=data)
    print(result.text)


if __name__ == "__main__":
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ": try to modify ddns.")
    ip_addr = get_ip()
    dns_info = get_dns_info()
    if ip_addr != dns_info["value"]:
        modify_dns(dns_info)

最后是如何调用,linux提供了crontab调度器,可以帮助我们定时执行python脚本。
可惜crontab最小只支持每分钟执行一次,不过也完全足够了,进入cron配置:crontab -e,然后写入配置:*/1 * * * * python3 ~/dnspod_ddns.py >> ~/ddns.log,通过ddns.log我们可以看到执行情况。重启crontab可以更快的开始执行任务:service cron restart
后续可以通过:crontab -l查看定时任务。

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。