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

softyun3年前云服务器55

前言

该脚本的代码大部分是参考自阿里云的官方帮助文档。
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


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

相关文章

为什么禁用阿里云ECS的内网后不能使用云监控?

本文为您介绍为何禁用ECS的内网后不能使用云监控。ECS服务器使用云监控服务,是不能禁用内网的。因为云监控的通讯地址open.cms.aliyun是解析在内网上的,通过内网来进行通讯获取数据,如果禁用...

阿里云linux服务器下安装Apache的简单方法

随着阿里云主机的火热推出,很多的站长朋友,也开始使用阿里云服务器了。php程序,大多还是要跑在linux系统的主机上的。今天,介绍下在阿里云的linux主机上安装apache的方法。云服务器操作系统:...

阿里云虚拟主机如何选择系统(阿里云虚拟主机如何选择系统版本)

阿里云虚拟主机是一种基于云计算技术的虚拟主机服务,用户可以通过购买阿里云虚拟主机来快速构建自己的网站或应用程序。在选择阿里云虚拟主机时,选择合适的操作系统和系统版本是非常重要的。本文将介绍阿里云虚拟主...

腾讯云为什么叫良心云?阿里云相比腾讯云良心云的优点

腾讯云为什么叫良心云?腾讯云之所以被称为良心云是因为价格上比阿里云优惠力度更大。腾讯云被广大站长称为良心云,而阿里云被称为“套路云”。腾讯公司向国家知识产权商标局申请 “良心云”商标,目前该商标还在等...

阿里云爆款特惠活动升级:云服务器9元/月起,百款爆品限量抢

阿里云爆款特惠全新改版上线,云服务器低至9元/月,数据库19.9元/月起,更有百款爆品限量抢。阿里云爆品销量榜单、ECS云服务器爆款榜单、云数据库专区,年付5折优惠、网络产品爆款专区、短信爆款产品首购...

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

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