如何通过阿里云实现动态域名解析DDNS的方法

softyun3年前云服务器72

前言

该脚本的代码大部分是参考自阿里云的官方帮助文档。
1, 脚本语言使用的是python, 我个人只是了解python,没有太深入的知识功底
2, 脚本代码我会尽量详细地添加注释说明,有问题欢迎留言交流,但回复可能不会那么及时。

前置条件

1、域名是在阿里云购买的 (我的域名本身就是阿里云买的,其他的域名我没有测试过)
2、地址必须是公网地址,不然加了解析也没有用 (这个不用多加解释了)

安装阿里云SDK

需要安装三个SDK库,一个是阿里云核心SDK库,一个是阿里云域名SDK库,一个是DNS库
阿里云核心SDK库:pip install aliyun-python-sdk-core
阿里云域名SDK库:pip install aliyun-python-sdk-domain
阿里云DNSSDK库:pip install aliyun-python-sdk-alidns
说明:
1, 目前官方文档上说的是需要安装前两个SDK库,但我实测确定还需要第三个库!
2, 如果你使用的是ubuntu系统,并且同时有python2/python3和pip2/pip3,安装时前面的命令请写清楚版本,特别是pip。 我的系统pip默认是2.x,使用pip install xxx 命令安装的库无效,使用 pip3 install xxx 才成功(如果知道如何随意切换python和pip版本,请留言告知,感谢)。

脚本的具体功能

1, 获取外网ip地址
2,获取域名解析记录
3,新增域名解析记录
3,更新域名解析记录
4,删除域名解析记录 (并不建议将该功能添加在实际脚本中)
5,批量操作,如果记录不存在则添加记录,存在则更新记录

脚本代码

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/env python
#coding=utf-8
 
# 加载核心SDK
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
 
# 加载获取 、 新增、 更新、 删除接口
from aliyunsdkalidns.request.v20150109 import DescribeSubDomainRecordsRequest, AddDomainRecordRequest, UpdateDomainRecordRequest, DeleteDomainRecordRequest
 
# 加载内置模块
import json,urllib
 
# AccessKey 和 Secret 建议使用 RAM 子账户的 KEY 和 SECRET 增加安全性
ID = 'xxxxxxx'
SECRET = 'xxxxxx'
 
# 地区节点 可选地区取决于你的阿里云帐号等级,普通用户只有四个,分别是杭州、上海、深圳、河北,具体参考官网API
regionId = 'cn-hangzhou'
 
# 配置认证信息
client = AcsClient(ID, SECRET, regionId)
 
# 设置主域名
DomainName = 'example'
 
# 子域名列表 列表参数可根据实际需求增加或减少值
SubDomainList = ['a', 'b', 'c']
 
# 获取外网IP  三个地址返回的ip地址格式各不相同,3322 的是最纯净的格式, 备选1为 json格式 备选2 为curl方式获取 两个备选地址都需要对获取值作进一步处理才能使用
def getIp():
  # 备选地址: 1, pv.sohu/cityjson?ie=utf-8  2,curl -L tool.lu/ip
  with urllib.request.urlopen('3322.org/dyndns/getip') as response:
    html = response.read()
    ip = str(html, encoding='utf-8').replace("\n", "")
  return ip
 
# 查询记录
def getDomainInfo(SubDomain):
  request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest()
  request.set_accept_format('json')
 
  # 设置要查询的记录类型为 A记录  官网支持A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL隐性(显性)转发 如果有需要可将该值配置为参数传入
  request.set_Type("A")
 
  # 指定查记的域名 格式为 'test.example'
  request.set_SubDomain(SubDomain)
 
  response = client.do_action_with_exception(request)
  response = str(response, encoding='utf-8')
 
  # 将获取到的记录转换成json对象并返回
  return json.loads(response)
 
# 新增记录 (默认都设置为A记录,通过配置set_Type可设置为其他记录)
def addDomainRecord(client,value,rr,domainname):
  request = AddDomainRecordRequest.AddDomainRecordRequest()
  request.set_accept_format('json')
 
  # request.set_Priority('1') # MX 记录时的必选参数
  request.set_TTL('600')    # 可选值的范围取决于你的阿里云账户等级,免费版为 600 - 86400 单位为秒
  request.set_Value(value)   # 新增的 ip 地址
  request.set_Type('A')    # 记录类型
  request.set_RR(rr)      # 子域名名称
  request.set_DomainName(domainname) #主域名
 
  # 获取记录信息,返回信息中包含 TotalCount 字段,表示获取到的记录条数 0 表示没有记录, 其他数字为多少表示有多少条相同记录,正常有记录的值应该为1,如果值大于1则应该检查是不是重复添加了相同的记录
  response = client.do_action_with_exception(request)
  response = str(response, encoding='utf-8')
  relsult = json.loads(response)
  return relsult
 
# 更新记录
def updateDomainRecord(client,value,rr,record_id):
  request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
  request.set_accept_format('json')
 
  # request.set_Priority('1')
  request.set_TTL('600')
  request.set_Value(value) # 新的ip地址
  request.set_Type('A')
  request.set_RR(rr)
  request.set_RecordId(record_id) # 更新记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值
 
  response = client.do_action_with_exception(request)
  response = str(response, encoding='utf-8')
  return response
 
# 删除记录
def delDomainRecord(client,subdomain):
  info = getDomainInfo(subdomain)
  if info['TotalCount'] == 0:
    print('没有相关的记录信息,删除失败!')
  elif info["TotalCount"] == 1:
    print('准备删除记录')
    request = DeleteDomainRecordRequest.DeleteDomainRecordRequest()
    request.set_accept_format('json')
 
    record_id = info["DomainRecords"]["Record"][0]["RecordId"]
    request.set_RecordId(record_id) # 删除记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值
    result = client.do_action_with_exception(request)
    print('删除成功,返回信息:')
    print(result)
  else:
    # 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误
    print("存在多个相同子域名解析记录值,请核查后再操作!")
 
# 有记录则更新,没有记录则新增
def setDomainRecord(client,value,rr,domainname):
  info = getDomainInfo(rr + '.' + domainname)
  if info['TotalCount'] == 0:
    print('准备添加新记录')
    add_result = addDomainRecord(client,value,rr,domainname)
    print(add_result)
  elif info["TotalCount"] == 1:
    print('准备更新已有记录')
    record_id = info["DomainRecords"]["Record"][0]["RecordId"]
    cur_ip = getIp()
    old_ip = info["DomainRecords"]["Record"][0]["Value"]
    if cur_ip == old_ip:
      print ("新ip与原ip相同,无法更新!")
    else:
      update_result = updateDomainRecord(client,value,rr,record_id)
      print('更新成功,返回信息:')
      print(update_result)
  else:
    # 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误
    print("存在多个相同子域名解析记录值,请核查删除后再操作!")
 
 
IP = getIp()
 
# 循环子域名列表进行批量操作
for x in SubDomainList:
  setDomainRecord(client,IP,x,DomainName)
 
# 删除记录测试
# delDomainRecord(client,'b.jsoner')
 
# 新增或更新记录测试
# setDomainRecord(client,'192.168.3.222','a',DomainName)
 
# 获取记录测试
# print (getDomainInfo(DomainName, 'y'))
 
# 批量获取记录测试
# for x in SubDomainList:
#   print (getDomainInfo(DomainName, x))
 
# 获取外网ip地址测试
# print ('(' + getIp() + ')')






可以将以上脚本保存为文件之后,通过定时任务,来实现定期自动更新ip地址,具体如何添加定时任务,系统不同,可能方法也不尽相同,这里就不多说明了。

说明

1,建议不要将删除记录添加进实际使用的脚本当中。
2,相同记录是同一个子域名的多条记录,比如 test.example。
脚本并没有验证记录类型,所以同一子域名下的不同类型的记录也会认为是相同记录,比如:
有两条记录分别是 test.examlpe 的 A 记录 和 test.examlpe 的 AAAA 记录,会被认为是两条相同的 test.example 记录
可以通过判断获取记录返回的 record_id 来实现精确匹配记录,但我没有这样的需求,也就没有花时间去写。

到此这篇关于如何通过阿里云实现动态域名解析DDNS的方法的文章就介绍到这了,更多相关阿里云动态域名解析DDNS内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:cnblogs/waylen/archive/2020/07/25/13375373.html


标签: 阿里云
免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

阿里云、腾讯云、小鸟云服务器中安装wdcp

wdCP是基于linux的WEB管理面板系统,对于新手站长是一大福音,众所周知PHP类型网站在linux环境下才能发挥最大的极致,但是并不是所有的站长都熟悉linux系统,拿我来说,我接触过一段时间的...

阿里云发布7款创新创业产品 全面助力中小创业企业成长

作为全球最具影响力的科技大会之一,一年一度的云栖大会是科技爱好者不容错过的一场盛会。2023年10月19日-22日,云栖大会以“前沿·探索·想象力”为主题在云栖小镇与大家见面。据悉,本次阿里云创新中心...

怎么注册阿里云账号 阿里云帐号怎么申请

阿里云是国内最大的网络公司,注册一个阿里云账号可以登录很多旗下的网站。怎么注册阿里云账号  阿里云帐号怎么申请 首先百度搜索,阿里云找到 阿里云的官方网站打开阿里云网站之后,找到“用户注册”菜单根据阿...

阿里云通过安全组实现不同账号下相同地域ECS内网互通

阿里云通过安全组实现不同账号下相同地域ECS内网互通问题场景:不同账号下相同地域的ECS服务器如何通过安全组实现内网互通解决方法:1、登陆管理控制台--云服务器ECS--安全组,然后点击右上角创建安全...

阿里云服务器收费价格表(阿里云服务器收费价格表2023)

阿里云服务器收费价格表及阿里云服务器收费价格表2023随着互联网的不断发展和普及,越来越多的企业和个人开始关注云计算技术,并选择使用云服务器来搭建自己的网站、应用程序等。而在众多云服务器提供商中,阿里...

阿里云ECS云服务器和轻量应用服务器有啥区别?如何选择?

阿里云ecs云服务器和轻量应用服务器有啥区别?最近是阿里云双11活动期间,很多小伙伴不清楚「ECS云服务器」和「轻量应用服务器」两者之间的区别,虽然轻量应用服务器和 ECS 云服务器的相同之处是都可以...