# https://github.com/xhdndmm/ddnsall # src/ddnsall-aliyun.py import logging import time import http.client from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest # 配置区 ##只需要配置这里## access_key_id = "" access_key_secret = "" record_id = "" dns_type = "A" ttl = 3600 name = "" last_name = "" ################ logger = logging.getLogger(__name__) logging.basicConfig(filename='ddnsall.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO) client = AcsClient(access_key_id, access_key_secret, 'cn-hangzhou') # 获取IP(V4) def get_ip_v4(): conn = http.client.HTTPSConnection("api-ipv4.ip.sb") conn.request("GET", "/ip") response = conn.getresponse() return response.read().decode().strip() # 获取IP(v6) def get_ip_v6(): conn = http.client.HTTPSConnection("api-ipv6.ip.sb") conn.request("GET", "/ip") response = conn.getresponse() return response.read().decode().strip() # 更新DNS记录 def update_dns_record(ip, record_type): request = CommonRequest() request.set_accept_format('json') request.set_domain('dns.aliyuncs.com') request.set_action_name('UpdateDomainRecord') request.add_query_param('DomainName', name) request.add_query_param('RecordId', record_id) request.add_query_param('RR', last_name) # 子域名,例如:'www' request.add_query_param('Type', record_type) request.add_query_param('Value', ip) request.add_query_param('TTL', ttl) try: response = client.do_action_with_exception(request) logger.info("DNS记录更新成功: %s", response) except Exception as e: logger.error("DNS记录更新失败: %s", e) def main(): if dns_type == "A": ip = get_ip_v4() logger.info("获取IP:%s", ip) for i in range(5): try: update_dns_record(ip, "A") logger.info("A记录更新成功") break except Exception as e: logger.error("A记录更新失败:%s", e) elif dns_type == "AAAA": ip = get_ip_v6() logger.info("获取IP:%s", ip) for i in range(5): try: update_dns_record(ip, "AAAA") logger.info("AAAA记录更新成功") break except Exception as e: logger.error("AAAA记录更新失败:%s", e) else: logger.error("解析类型不正确") if __name__ == "__main__": while True: main() time.sleep(3600) # 每小时更新一次