Python实现阿里云域名DDNS
时间:2020-10-22 19:29:50
收藏:0
阅读:52
前言
-
通过阿里云的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 -
使用脚本
1 from aliyunsdkcore.client import AcsClient 2 from aliyunsdkcore.acs_exception.exceptions import ClientException 3 from aliyunsdkcore.acs_exception.exceptions import ServerException 4 from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest 5 from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest 6 import requests 7 from urllib.request import urlopen 8 import json 9 10 ipv4_flag = 1 # 是否开启ipv4 ddns解析,1为开启,0为关闭 11 ipv6_flag = 0 # 是否开启ipv6 ddns解析,1为开启,0为关闭 12 accessKeyId = "accessKeyId" # 将accessKeyId改成自己的accessKeyId 13 accessSecret = "accessSecret" # 将accessSecret改成自己的accessSecret 14 domain = "baidu.com" # 你的主域名 15 name_ipv4 = "www" # 要进行ipv4 ddns解析的子域名 16 name_ipv6 = "ipv6.test" # 要进行ipv6 ddns解析的子域名 17 18 19 client = AcsClient(accessKeyId, accessSecret, ‘cn-hangzhou‘) 20 21 def update(RecordId, RR, Type, Value): # 修改域名解析记录 22 from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest 23 request = UpdateDomainRecordRequest() 24 request.set_accept_format(‘json‘) 25 request.set_RecordId(RecordId) 26 request.set_RR(RR) 27 request.set_Type(Type) 28 request.set_Value(Value) 29 response = client.do_action_with_exception(request) 30 31 32 def add(DomainName, RR, Type, Value): # 添加新的域名解析记录 33 from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest 34 request = AddDomainRecordRequest() 35 request.set_accept_format(‘json‘) 36 request.set_DomainName(DomainName) 37 request.set_RR(RR) 38 request.set_Type(Type) 39 request.set_Value(Value) 40 response = client.do_action_with_exception(request) 41 42 43 if ipv4_flag == 1: 44 request = DescribeSubDomainRecordsRequest() 45 request.set_accept_format(‘json‘) 46 request.set_DomainName(domain) 47 request.set_SubDomain(name_ipv4 + ‘.‘ + domain) 48 response = client.do_action_with_exception(request) # 获取域名解析记录列表 49 domain_list = json.loads(response) # 将返回的JSON数据转化为Python能识别的 50 51 ip = urlopen(‘https://api-ipv4.ip.sb/ip‘).read() # 使用IP.SB的接口获取ipv4地址 52 ipv4 = str(ip, encoding=‘utf-8‘) 53 print("获取到IPv4地址:%s" % ipv4) 54 55 if domain_list[‘TotalCount‘] == 0: 56 add(domain, name_ipv4, "A", ipv4) 57 print("新建域名解析成功") 58 elif domain_list[‘TotalCount‘] == 1: 59 if domain_list[‘DomainRecords‘][‘Record‘][0][‘Value‘].strip() != ipv4.strip(): 60 update(domain_list[‘DomainRecords‘][‘Record‘][0][‘RecordId‘], name_ipv4, "A", ipv4) 61 print("修改域名解析成功") 62 else: # https://blog.zeruns.tech 63 print("IPv4地址没变") 64 elif domain_list[‘TotalCount‘] > 1: 65 from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest 66 request = DeleteSubDomainRecordsRequest() 67 request.set_accept_format(‘json‘) 68 request.set_DomainName(domain) 69 request.set_RR(name_ipv4) 70 response = client.do_action_with_exception(request) 71 add(domain, name_ipv4, "A", ipv4) 72 print("修改域名解析成功") 73 75 76 if ipv6_flag == 1: 77 request = DescribeSubDomainRecordsRequest() 78 request.set_accept_format(‘json‘) 79 request.set_DomainName(domain) 80 request.set_SubDomain(name_ipv6 + ‘.‘ + domain) 81 response = client.do_action_with_exception(request) # 获取域名解析记录列表 82 domain_list = json.loads(response) # 将返回的JSON数据转化为Python能识别的 83 84 ip = urlopen(‘https://api-ipv6.ip.sb/ip‘).read() # 使用IP.SB的接口获取ipv6地址 85 ipv6 = str(ip, encoding=‘utf-8‘) 86 print("获取到IPv6地址:%s" % ipv6) 87 88 if domain_list[‘TotalCount‘] == 0: 89 add(domain, name_ipv6, "AAAA", ipv6) 90 print("新建域名解析成功") 91 elif domain_list[‘TotalCount‘] == 1: 92 if domain_list[‘DomainRecords‘][‘Record‘][0][‘Value‘].strip() != ipv6.strip(): 93 update(domain_list[‘DomainRecords‘][‘Record‘][0][‘RecordId‘], name_ipv6, "AAAA", ipv6) 94 print("修改域名解析成功") 95 else: 96 print("IPv6地址没变") 97 elif domain_list[‘TotalCount‘] > 1: 98 from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest 99 request = DeleteSubDomainRecordsRequest() 100 request.set_accept_format(‘json‘) 101 request.set_DomainName(domain) 102 request.set_RR(name_ipv6) 103 response = client.do_action_with_exception(request) 104 add(domain, name_ipv6, "AAAA", ipv6) 105 print("修改域名解析成功")
复制代码,然后使用编辑器打开,按照注释提示修改并保存。
-
运行代码
运行代码
-
设置定时运行代码
设置定时运行,方法自行百度(主要是自己百度出来的没有成功)
本人安装了宝塔面板于是直接在宝塔面板设置定时即可
编辑于:2020-10-22
原文:https://www.cnblogs.com/huangshengpeng/p/13859839.html
评论(0)