前提条件:1.自家的公网IP。2.腾讯云域名
云解析DNS页面,创建一条记录,记录值先随便填

pip install tencentcloud-sdk-python-dnspod

执行python脚本,其中需要修改的变量有:Your_PathSecretIdSecretKeyhome.xxxxxx.com

DDNS_DEMO.py
import json
import types
import requests
import datetime
import logging
from logging.handlers import RotatingFileHandler
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

# 配置日志记录器
def setup_logger():
    # 创建一个logger
    logger = logging.getLogger('DDNS')
    # 设置日志记录等级
    logger.setLevel(logging.DEBUG)  
    # 创建一个handler,用于写入日志文件,
    # 最多备份5个日志文件,每个日志文件最大10MB
    handler = RotatingFileHandler(
        'C:\\Your_Path\\DDNS.log', maxBytes=10*1024*1024, backupCount=5)
    handler.setLevel(logging.DEBUG)
    # 创建一个formatter,定义日志的格式
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    # 给logger添加handler
    logger.addHandler(handler)
    return logger

# 设置日志记录器
logger = setup_logger()

try:
    # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
    # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,
    # 并威胁账号下所有资源的安全性。以下代码示例仅供参考,
    # 建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
    # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
    cred = credential.Credential(
        "SecretId", "SecretKey")
    # 实例化一个http选项,可选的,没有特殊需求可以跳过
    httpProfile = HttpProfile()
    httpProfile.endpoint = "dnspod.tencentcloudapi.com"
    # 实例化一个client选项,可选的,没有特殊需求可以跳过
    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    # 实例化要请求产品的client对象,clientProfile是可选的
    client = dnspod_client.DnspodClient(cred, "", clientProfile)
    # 实例化一个请求对象,每个接口都会对应一个request对象
    # 获取记录
    req = models.DescribeRecordFilterListRequest()
    params = {
        "Domain": "home.xxxxxx.com",
        "RecordType": ["A"] #ipv4
    }
    req.from_json_string(json.dumps(params))
    # 返回的resp是一个DescribeRecordResponse的实例,与请求对象对应
    resp = client.DescribeRecordFilterList(req)
    if resp.RecordList is not None and resp.RecordList:
        ip = resp.RecordList[0].Value
        recordId = resp.RecordList[0].RecordId
    # 输出json格式的字符串回包
    logger.info('remote ip: %s', ip)
    # 获取公网IP
    response = requests.get('https://httpbin.org/ip')
    response.raise_for_status()  # 检查请求是否成功
    ipCurrent = response.json()['origin']
    logger.info('current local ip: %s', ipCurrent)
    if ipCurrent is not None and ipCurrent != ip:
        logger.info('start update remote ip...')
        # 实例化一个请求对象,每个接口都会对应一个request对象
        req = models.ModifyRecordRequest()
        params = {
            "Domain": "home.xxxxxx.com",
            "RecordType": "A",
            "RecordLine": "默认",
            "Value": ipCurrent,
            "RecordId": recordId
        }
        req.from_json_string(json.dumps(params))
        # 返回的resp是一个ModifyRecordResponse的实例,与请求对象对应
        resp = client.ModifyRecord(req)
        # 输出json格式的字符串回包
        logger.info(resp.to_json_string())
        logger.info('end update remote ip')
    else:
        logger.info('no need update remote ip')

except Exception as err:
    logger.error(err)

云解析DNS页面,检查记录值是否被更新

创建定时任务,执行python脚本

日志查看