首先,需要安装 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