首先,需要安装 tencentcloud-sdk-python 包,这是腾讯云的官方 Python SDK

pip install tencentcloud-sdk-python

创建一个 Python 脚本,例如 dynamic_dns_update.py

import time,json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.dnspod.v20210323 import dnspod_client, models

# 配置你的腾讯云 API 密钥和域名信息
secret_id = "xxxxxxx"
secret_key = "xxxxxxxxx"
domain = "jiazone.cn"  # 要更新的域名
subdomain = "pve"  # 子域名(可选,如果要更新主域名,请设为 "")

# 初始化腾讯云 API 客户端
cred = credential.Credential(secret_id, secret_key)
httpProfile = HttpProfile()
httpProfile.endpoint = "dnspod.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = dnspod_client.DnspodClient(cred, "", clientProfile)

# 查询域名信息   #参数默认值
def get_domain_info(domain, subdomain=""):
    # 实例化一个请求对象,每个接口都会对应一个request对象
    req = models.DescribeRecordListRequest()
    params = {
        "Domain": domain,
        "Subdomain": subdomain
    }
    req.from_json_string(json.dumps(params))
    # 返回的resp是一个DescribeRecordListResponse的实例,与请求对象对应
    resp = client.DescribeRecordList(req)
    # print(resp.to_json_string())
    return resp  #.to_json_string()

# 更新域名记录
def update_dns_record(domain_info, new_ip):
    record = domain_info.RecordList[0]
    if record.Name == subdomain:
        # 实例化一个请求对象,每个接口都会对应一个request对象
        # req = models.ModifyRecordRequest()
        # params = {
        #     "Domain": "jiazone.cn",
        #     "RecordType": "A",
        #     "RecordLine": "默认",
        #     "Value": "113.87.3.115",
        #     "RecordId": 1481864300
        # }
        # req.from_json_string(json.dumps(params))
        # # 返回的resp是一个ModifyRecordResponse的实例,与请求对象对应
        # resp = client.ModifyRecord(req)

        req = models.ModifyRecordRequest()
        req.Domain = domain
        req.SubDomain = subdomain
        req.RecordId = record.RecordId
        req.RecordType = record.Type
        req.RecordLine = record.Line
        req.Value = new_ip
        resp = client.ModifyRecord(req)
        print(f"更新记录 {subdomain}.{domain} 的 IP 为 {new_ip},结果:{resp.to_json_string()}")

# 获取当前主机的公网 IP
def get_public_ip():
    import requests
    response = requests.get("https://api64.ipify.org?format=json")
    ip_data = response.json()
    return ip_data["ip"]

if __name__ == "__main__":
    try:
        while True:
            # 获取当前主机的公网 IP
            new_ip = get_public_ip()
            # 查询域名信息
            domain_info = get_domain_info(domain, subdomain)
            # 更新域名记录
            update_dns_record(domain_info, new_ip)
            # 等待一段时间后再次检查,例如每隔一小时
            time.sleep(3600)  # 单位为秒,这里是一小时
    except Exception as e:
        print(f"发生错误:{str(e)}")

创建一个systemd服务单元文件,比如dynamic-dns-update.service

[Unit]
Description=Dynamic DNS Update Script
After=network.target

[Service]
Type=simple
User=your_username
ExecStart=/usr/bin/python3 /path/to/dynamic_dns_update.py
WorkingDirectory=/path/to/script_directory
Restart=always
RestartSec=60
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

在上面的服务单元文件中,你需要进行以下替换:

  • Description:服务的描述。
  • User:执行脚本的用户名(替换为实际的用户名)。
  • ExecStart:指定脚本的执行命令,确保替换为正确的Python解释器路径和脚本文件路径。
  • WorkingDirectory:脚本的工作目录。
  • Restart:如果脚本意外退出,系统将尝试自动重启。
  • RestartSec:重启尝试之间的间隔(秒)。
  • StandardOutput和StandardError:将脚本的标准输出和标准错误记录到syslog。

将服务单元文件保存在/etc/systemd/system/目录中(或者你系统的systemd服务单元目录中),然后运行以下命令启动服务:

sudo systemctl daemon-reload
sudo systemctl enable dynamic-dns-update.service  --now
sudo systemctl start dynamic-dns-update.service
最后修改:2023 年 09 月 14 日
如果觉得我的文章对您有用,请随意赞赏!