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

前言

该脚本的代码大部分是参考自阿里云的官方帮助文档。
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,批量操作,如果记录不存在则添加记录,存在则更新记录

脚本代码

#!/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.com'

# 子域名列表 列表参数可根据实际需求增加或减少值
SubDomainList = ['a', 'b', 'c']

# 获取外网IP  三个地址返回的ip地址格式各不相同,3322 的是最纯净的格式, 备选1为 json格式 备选2 为curl方式获取 两个备选地址都需要对获取值作进一步处理才能使用
def getIp():
  # 备选地址: 1, http://pv.sohu.com/cityjson?ie=utf-8  2,curl -L tool.lu/ip
  with urllib.request.urlopen('http://www.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.com'
  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.com')

# 新增或更新记录测试
# 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.com。
脚本并没有验证记录类型,所以同一子域名下的不同类型的记录也会认为是相同记录,比如:
有两条记录分别是 test.examlpe.com 的 A 记录 和 test.examlpe.com 的 AAAA 记录,会被认为是两条相同的 test.example.com 记录
可以通过判断获取记录返回的 record_id 来实现精确匹配记录,但我没有这样的需求,也就没有花时间去写。

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

(0)

相关推荐

  • 阿里云云服务器Windows 2008下IIS添加网站绑定域名图文教程

    云服务器默认使用Windws 2008 中自带的IIS服务器. 1. 打开Internet 服务(IIS)管理器. 1) 启动左下角任务栏中的"服务器管理器",选择"角色"->"Web服务器IIS"->"Internet 服务(IIS)管理器"来打开IIS管理界面: 2) 选择"网站",点击右侧"添加网站": 2. 填写网站信息.在添加网站窗口中,输入您的"网站名称

  • 阿里云Linux系统Nginx配置多个域名的方法详解

    Nginx绑定多个域名,可通过把多个域名规则写一个配置文件里实现,也可通过分别建立多个域名配置文件实现,为了管理方便,建议每个域名建一个文件,有些同类域名则可写在一个总的配置文件里. 1. 比如我想建立两个站点的域名分别是www.A.com 和 www.B.com,将这两个域名都解析到同一服务器IP. 2. 在Nginx配置文件conf目录下创建一个专门存放虚拟主机配置的目录,命名为vhosts,可以把虚拟目录的配置全部放在这里.如本例创建名为vhosts_A.conf和vhosts_B.con

  • 利用Python+阿里云实现DDNS动态域名解析的方法

    引子 我想大家应该都很熟悉DNS了,这回在DNS前面加了一个D又变成了什么呢?这个D就是Dynamic(动态),也就是说,按照传统,一个域名所对应的IP地址应该是定死的,而使用了DDNS后,域名所对应的IP是可以动态变化的.那这个有什么用呢? 比如,在家里的路由器上连着一个raspberry pi(树莓派),上面跑着几个网站,我应该如和在外网环境下访问网站.登陆树莓派的SSH呢? 还有,家里的NAS(全称Network Attach Storage 网络附属存储,可以理解为私有的百度网盘)上存储

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

    前言 该脚本的代码大部分是参考自阿里云的官方帮助文档. 1, 脚本语言使用的是python, 我个人只是了解python,没有太深入的知识功底 2, 脚本代码我会尽量详细地添加注释说明,有问题欢迎留言交流,但回复可能不会那么及时. 前置条件 1.域名是在阿里云购买的 (我的域名本身就是阿里云买的,其他的域名我没有测试过) 2.地址必须是公网地址,不然加了解析也没有用 (这个不用多加解释了) 安装阿里云SDK 需要安装三个SDK库,一个是阿里云核心SDK库,一个是阿里云域名SDK库,一个是DNS库

  • 阿里云服务器实现域名解析步骤(小白教程)

    对于刚开始接触网站搭建的新手来说,好多东西都需要去了解学习,搭建网站首先需要购买服务器,然后购买域名,然后是域名解析,最后是域名备案等这些大的流程步骤.本节就来将将域名解析的步骤,服务器是以阿里云服务器来讲,其他平台的服务器暂时不介绍.具体步骤如下所示. 一.打开进入阿里云官网,然后登陆阿里云账号,进入控制台. 二.在控制台主界面,找到左侧菜单栏里面的下拉菜单,并找到"域名"选项,地球图标的那个选项,单击进入域名控制台. 三.进入域名控制台之后,可以看到该阿里云账号下面的域名,然后点击

  • 阿里云域名和ip绑定步骤方法实现

    1 进入阿里云控制台,找到域名控制台,选择需要绑定的域名点击[解析] 2 添加解析 主机记录: www : 将域名解析为www.example.com,填写www: @ : 将域名解析为example.com(不带www),填写@或者不填写: mail : 将域名解析为mail.example.com,通常用于解析邮箱服务器: * : 泛解析,所有子域名均被解析到统一地址(除单独设置的子域名解析): 二级域名 : 如:mail.example.com或abc.example.com,填写mail

  • Python3编程实现获取阿里云ECS实例及监控的方法

    本文实例讲述了Python3编程实现获取阿里云ECS实例及监控的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python3.5 # -*- coding:utf8 -*- try: import httplib except ImportError: import http.client as httplib import sys,datetime import urllib import urllib.request import urllib.error impor

  • 阿里云ECS服务器部署django的方法

    参考 服务器安装的是Centos 系统. uwsgi是使用pip安装的. nginx是使用yum install nginx安装. python 2.7, mysql 5.5使用 yum安装. 它们之间的逻辑关系如下: the web client <-> the web server <-> the socket <-> uwsgi <-> Django uswgi负责从Django拿内容,通过socket传给 web server如nginx, 最后显示

  • 阿里云服务器购买搭建过程的方法步骤

    1.购买服务器 在示例中购买的为阿里云服务器,在校大学生可以购买阿里云的学生认证特权服务器 (云翼计划)网址:https://promotion.aliyun.com/ntms/act/campus2018.html 购买云服务器ECS 价钱比较便宜,一年的费用也就一百多块钱,这款服务器需要进行学生学信网认证,按照要求认证就行(此服务器比较抢手,会有一些服务器贩子天天抢,你不一定能抢上). 注意: 1.购买服务器的预装环境选择你自己电脑对应的系统 2.地域选择你相对应的地区 比如: 2.阿里云配

  • yii2.0整合阿里云oss删除单个文件的方法

    主要思路,在controller里边通过获得要删除的文件fileid,把fileid传递给model的deletefile方法进行处理,并返回处理结果. 在deletefile方法里边,先根据id找到对应的文件信息,然后删除数据里边的记录和阿里云oss里边的文件和本地的文件. 主要步骤如下: 1 首先是构建一个view视图,或者写一个ajax发送请求,此处代码略(让前端去写吧). 2 在控制器里边接收参数,并转交给model.控制器UploadController.php里边的代码参考如下: /

  • Workbench连接不上阿里云服务器Ubuntu的Mysql解决方法(已测)

    这两天为了解决workbench连接不上阿里云服务器的问题,搞得头大,网上搜到的教程都大同小异,但唯独到我这就是行不通.不过好在最后终于解决了,记录一下这个坑爹的过程. 使用的环境: 系统: Ubuntu 18.04.2 LTS Mysql:mysql Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using EditLine wrapper MySQL Workbench8.0CE 1. 无法连接到服务器 一开始连接的时候是出现下面这种状态. 遇到的

  • Vue自定义指令结合阿里云OSS优化图片的实现方法

    图片往往在加载前端项目中占大头,如何既不损失图片质量,又提升加载速度呢? 根据显示设备pixelRatio和元素宽高来显示合适图片 略微压缩图片质量 使用webp 注册全局自定义指令 Vue.directive('img-condense', { bind: (el, binding, vnode) => { let src = el.getAttribute('src') let newSrc = compressImg(src, el) el.setAttribute('src', newS

  • 本地Windows远程桌面连接阿里云Ubuntu 16.04服务器的操作方法

    本地Windows远程桌面连接阿里云Ubuntu 16.04服务器: 1.目的:希望通过本地的Windows远程桌面连接到阿里云的Ubuntu服务器,通过远程桌面图形界面的方式操作服务器. 2.条件:申请的阿里云Ubuntu服务器一台,本地Windows操作系统电脑一台. 3.如何远程桌面连接: (1)首先通过Windows系统下连接Linux系统的命令行工具连接Ubuntu服务器,(工具:xshell,securecrt,putty等). (2)通过Windows下工具连接到linux操作系统

随机推荐