首页 > 编程语言 > 详细

Python实现阿里云域名DDNS

时间:2020-10-22 19:29:50      阅读:52      评论:0      收藏:0      [点我收藏+]

前言

  • 通过阿里云的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

     

Python实现阿里云域名DDNS

原文:https://www.cnblogs.com/huangshengpeng/p/13859839.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!