前言
-
通過阿里雲的SDK來添加修改域名解析,檢查本機IP與解析的IP是否一致,若不同則自動修改解析,達到動態解析的目的,主要用於家庭寬帶這些動態IP的地方。
首先
-
IP必須為公網ip
-
阿里域名
詳細步驟
-
獲取accessKeyId和accessSecret
可以在阿里雲控制台個人中心直接獲取。建議使用RAM角色來進行權限控制,這樣的話安全風險較小。
-
安裝對應的依賴包
pip3 install aliyun-python-sdk-core-v3
pip3 install aliyun-python-sdk-domain
pip3 install aliyun-python-sdk-alidns
pip3 install requests
//本人使用的是Python3 -
使用腳本
from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest import requests from urllib.request import urlopen import json ipv4_flag = 1 # 是否開啟ipv4 ddns解析,1為開啟,0為關閉 ipv6_flag = 0 # 是否開啟ipv6 ddns解析,1為開啟,0為關閉 accessKeyId = "accessKeyId" # 將accessKeyId改成自己的accessKeyId accessSecret = "accessSecret" # 將accessSecret改成自己的accessSecret domain = "baidu.com" # 你的主域名 name_ipv4 = "www" # 要進行ipv4 ddns解析的子域名 name_ipv6 = "ipv6.test" # 要進行ipv6 ddns解析的子域名 client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou') def update(RecordId, RR, Type, Value): # 修改域名解析記錄 from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest request = UpdateDomainRecordRequest() request.set_accept_format('json') request.set_RecordId(RecordId) request.set_RR(RR) request.set_Type(Type) request.set_Value(Value) response = client.do_action_with_exception(request) def add(DomainName, RR, Type, Value): # 添加新的域名解析記錄 from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest request = AddDomainRecordRequest() request.set_accept_format('json') request.set_DomainName(DomainName) request.set_RR(RR) request.set_Type(Type) request.set_Value(Value) response = client.do_action_with_exception(request) if ipv4_flag == 1: request = DescribeSubDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName(domain) request.set_SubDomain(name_ipv4 + '.' + domain) response = client.do_action_with_exception(request) # 獲取域名解析記錄列表 domain_list = json.loads(response) # 將返回的JSON數據轉化為Python能識別的 ip = urlopen('https://api-ipv4.ip.sb/ip').read() # 使用IP.SB的接口獲取ipv4地址 ipv4 = str(ip, encoding='utf-8') print("獲取到IPv4地址:%s" % ipv4) if domain_list['TotalCount'] == 0: add(domain, name_ipv4, "A", ipv4) print("新建域名解析成功") elif domain_list['TotalCount'] == 1: if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ipv4.strip(): update(domain_list['DomainRecords']['Record'][0]['RecordId'], name_ipv4, "A", ipv4) print("修改域名解析成功") else: print("IPv4地址沒變") elif domain_list['TotalCount'] > 1: from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest request = DeleteSubDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName(domain) request.set_RR(name_ipv4) response = client.do_action_with_exception(request) add(domain, name_ipv4, "A", ipv4) print("修改域名解析成功") if ipv6_flag == 1: request = DescribeSubDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName(domain) request.set_SubDomain(name_ipv6 + '.' + domain) response = client.do_action_with_exception(request) # 獲取域名解析記錄列表 domain_list = json.loads(response) # 將返回的JSON數據轉化為Python能識別的 ip = urlopen('https://api-ipv6.ip.sb/ip').read() # 使用IP.SB的接口獲取ipv6地址 ipv6 = str(ip, encoding='utf-8') print("獲取到IPv6地址:%s" % ipv6) if domain_list['TotalCount'] == 0: add(domain, name_ipv6, "AAAA", ipv6) print("新建域名解析成功") elif domain_list['TotalCount'] == 1: if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ipv6.strip(): update(domain_list['DomainRecords']['Record'][0]['RecordId'], name_ipv6, "AAAA", ipv6) print("修改域名解析成功") else: print("IPv6地址沒變") elif domain_list['TotalCount'] > 1: from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest request = DeleteSubDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName(domain) request.set_RR(name_ipv6) response = client.do_action_with_exception(request) add(domain, name_ipv6, "AAAA", ipv6) print("修改域名解析成功")
復制代碼,然后使用編輯器打開,按照注釋提示修改並保存。
-
運行代碼
運行代碼
-
設置定時運行代碼
設置定時運行,方法自行百度(主要是自己百度出來的沒有成功)
本人安裝了寶塔面板於是直接在寶塔面板設置定時即可
編輯於:2020-10-22