自定义ddns动态域名解析,ddns免费版动态解析域名
想有更好的阅读体验,可以转到我的个人博客。
DDNS DDNS(动态域名服务器)简介,其功能是将用户的动态IP绑定到一个域名上。
即使您的服务器IP发生变化,用户仍然可以使用您的域名找到您的服务器。
阿里云提供了一套API,可以让你通过编程实现DDNS,但是你需要在阿里云上申请你的域名。
感谢舍友把域名借给我测试。
可能用到的一些库pip安装一个李云-python-SDK-core pip安装一个李云-python-SDK-alidnspip安装pyyaml获取并缓存ip地址。首先,编写一个简单的工具类来获取当前计算机的公共IP地址。有很多网站提供这样的服务。这个例程使用www.3322.org/dyndns/getip.
获得IP后,最好将其缓存在一个文件中。
需要缓存是因为阿里云在更新两个相同的IP时会报错。我们可以提前缓存,下次调用更新服务前,再借用缓存的内容,判断当前IP是否没有变化。
定义IPManager类定义一个IPManager类,可以获取这台计算机的公共IP地址,并用文件缓存。
from urllib . request import urlopenimport logging class IP manager:def _ _ init _ _(self,File _ cache=。IP buffer ):self . IP= self . file _ cache=file _ cache def Get _ current _ IP(self):#以URL operon( 3358 www.3322.org/dyndns/getip )作为响应获取当前IP:self . IP=str(response . read(),encoding=utf-8 )。replace(n ,)logging . info( current IP: self . IP return self . IP def sync _ cache(self):#将当前IP同步到带open的缓存(self.file_cache,W )as f:f . write(self . IP)logging . info( sync cache IP: self . IP def Get _ cache(self):#获取带open的缓存内容(self.file_cache,R )as f:old _ IP=f . read()logging . info( Get cache IP: self . IP)return old _ IP程序使用默认存储IP的ipbuffer文件,
我觉得我们还需要先创建这个文件,不然运行的时候可能会报错
。您可以使用以下函数来检查和创建支持递归创建的文件:
导入def check _ file(文件名):#获取父文件夹dirname=os.path.dirname(文件名)如果不是os.path.exists (dirname)和dirname!=: #递归创建父文件夹os.makedirs(dirname) #创建open(filename,W )为f的文件:f.write( )简单使用IP manager def main(): #创建一个IP manager IP _ manager=IP manager()#获取当前IP current _ IP=IP _ manager . Get _ current _ IP()#如果IP已经缓存,则返回If IP _ manager . Get _ cache()==current _ IP:return #更新IP cache ip_manager.sync_cache()此程序可以在010-50更新缓存
获取accessKeyId和accessKeySecret云帐户以登录RAM控制台。在左侧导航栏的
获取IP
菜单下,单击IP无缓存
。在IP更新
列表下,单击目标RAM用户名。在“人员管理
区域”下,单击“用户
”。摘自阿里云文档从aliyunsdkcore创建客户端。client import acsclient profile={ accesskeyid : XXX , accesskeys ecret: XXX ,region id : cn-Hangzhou } client=ACS lient(profile[ access keyid ],profile [accessKeySecret],profile [regionid])填写上一步中的access keyid和accesskeys ecret。
在regionId中填写您的区号。关于regionId的描述,请参考阿里云官方文档。
我们需要使用函数client . do _ action _ with _ exception将请求发送到阿里云。
之所以需要增加域名解析记录查询,是为了检查我们的域名是否已经被其他IP绑定。
来自aliyunsdkalidns。请求。v 2015 01 09。DescribeDomainRecordsRequestimport DescribeDomainRecordsRequestimport JSON import logging def describe _ domain _ records(client,record_type,subdomain): logging.info(域名解析记录查询)request=DescribeDomainRecordsRequest()请求。set _ accept _ format( JSON )请求。set _ Type(记录类型)请求。设置域名(子域)响应=客户端。do _ action _ with _ exception(请求)response=str(响应,编码= utf-8 )result=JSON。负载(响应)日志记录。调试(结果)返回结果客户是上一步创建的客户端。
记录类型比较复杂,简单来说是域名服务器(域名服务器)域名解析的解析类型。我们这里使用A记录就好了。
{%笔记信息%}
常见的域名服务器(域名服务器)解析类型
答:将主机名(或域名)指向一个IPv4地址
AAAA:将主机名(或域名)指向一个IPv6地址
CNAME:将域名指向另一个域名
{% endnote %}
子整环填你的域名就好了。
# 调用举例描述_域_记录(客户端, A , tuenity.xyz )添加域名解析记录来自aliyunsdkalidns。请求。v 2015 01 09。adddomainrecordrequest导入adddomainrecordrequest导入logging导入JSON def add _ record(client,priority,ttl,record_type,value,rr,domain_name): logging.info(添加域名解析记录)request=AddDomainRecordRequest()请求。set _ accept _ format( JSON )请求。set _ Priority(优先级)请求。设置TTL(TTL)请求。set _ Value(值)请求。set _ Type(记录类型)请求。set _ RR(域名)response=client。do _ action _ with _ exception(请求)response=str(响应,编码= utf-8 )result=JSON。负载(响应)日志记录。调试(结果)返回结果优先级告诉域名解析服务,按照优先从小到大的顺序对记录搜索,搜索到匹配的记录后,就停止搜索优先值更大的记录,对于拥有相同优先的记录将通过重量再次选择。
虽然阿里云并不提供重量的设置接口,但是你要知道它是个什么东西。
对于拥有相同优先的多条记录,重量给出了选择某条记录的几率,值越大,被选中的概率就越大,合理的取值范围为0-65535。
ttl
用户登录名称/显示名称
,当用户在访问一个域名的时候,并不是每次都需要去解析一遍的,DNS服务器会在用户当地的递归域名服务器(域名服务器)服务器上缓存一次,在电平信号的时间长度内失效。一般设置"600"。记录类型同上一步。
价值就是你的互联网协议(互联网协议)地址。
rr,阿里云的阻力比是主机头的意思,一般设置“www。
域名就是你的域名。
更新域名解析记录来自aliyunsdkalidns。请求。v 2015 01 09。updatedomainrecordrequest导入updatedomainrecordrequest导入logging导入JSON def update _ record(client,priority,ttl,record_type,value,rr,record_id): logging.info(更新域名解析记录)request=UpdateDomainRecordRequest()请求。set _ accept _ format( JSON )请求。set _ Priority(优先级)请求。设置TTL(TTL)请求。set _ Value(值)请求。set _ Type(记录类型)请求。set _ RecordId(record _ id)response=client。do _ action _ with _ exception(request)response=str(response,encoding= utf-8 )日志。调试(响应)返回响应和上一步的函数接口几乎一摸一样,不过多解释了。
需要注意,不一样的是记录身份证。这个需要描述_域_记录函数的返回值。
des _ result=describe _ domain _ records(client, A , tuenity.xyz )使用des_result[TotalCount]就可以查处现在有多少条记录绑定在这个域名上了。
如果没有,我们就需要调用添加记录,否则就调用更新记录。
记录编号可以通过des _ result[域记录][记录][0][记录Id ]获取。
建议使用yaml作为配置文件,利用python自带的日志记录,将查询、更新、添加域名解析记录打包到一个类中,获得完整的代码Github项目地址。