失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 阿里云ddns 动态域名更新Python脚本 基于Python3 适用于linux

阿里云ddns 动态域名更新Python脚本 基于Python3 适用于linux

时间:2021-11-19 17:09:04

相关推荐

阿里云ddns 动态域名更新Python脚本 基于Python3 适用于linux

阿里云ddns更新脚本,基于Python3

前提:已经在阿里云注册了一个域名,获得AccessKey ID

AccessKey Secret,先添加了一个子域名解析,解析值随便

然后获取这个子域名的recordid,这些怎么获取,网上都有教程自。己搜一下,一定要获取自己的,

依赖环境:Python3,aliyun-python-sdk-core-v3 开发包

pip3 install aliyun-python-sdk-core-v3#如果下载太慢请百度搜索pip换源

原理:

通过网络或本地命令获取本机IP地址,有时候通过网络获取的IP地址并不正确通过网络获取域名当前指向的ip地址检查本地ip和域名当前指向的ip是否一致不一致则通信阿里云dns服务器更新解析值,并查看是否更新成功一致则不更新

脚本写好后可以用Python3再写一个开机启动和定时运行更新脚本的脚本

下面的脚本是本人自己写的,参考了别人的一些东西,由于本人水平很low请各位勿怪,域名解析的更新往往有延迟

源码包链接: 提取码: h47n

一共5个文件 日志,获取ip地址,更新ipv4脚本,更新ipv6脚本,定时器 前面两个文件都是函数接口,后面三个才是正主

要使用的话,填上ddns.py或 ddns6.py 里面的一些参数就行了

日志脚本

#!/usr/bin/env python# coding=utf-8#写logs日志import timeimport os#用于写日志def logs(log):fobj=open('./log','a+',encoding='utf-8') #这里的./log 指的是保存日志的文件,可以自行修改,要确保对此文件有写入的权限fobj.write(time.ctime())fobj.write(str(log)+'\n'+'pid:'+str(os.getpid())+'\n')fobj.close()

获取ip地址的脚本

#!/usr/bin/env python#coding=utf-8import requestsimport socketimport osimport logs #前面两个通过dns服务器获得本地IP地址,有时候获得的地址不准def getAddr6():try:response=requests.request('get','')ip6='['+response.text+']'logs.logs(ip6)return response.textexcept:passdef getAddr4():try:response=requests.request('get','')ip4=response.textlogs.logs(ip4)return response.textexcept:pass #获取域名当前的解析值def getDomainIp(domain):try:ipad=socket.getaddrinfo(domain, None)logs.logs(ipad[0][4][0])return str(ipad[0][4][0])except:pass#用于获取linux系统的全球ipv6地址,直接解析本地网络信息def getIPv6ForLinux():ipaddr=''lines=os.popen('ifconfig').readlines()for i in lines:if ':' in i and 'inet6' in i and 'global' in i and '64' in i:tmp=i[-32:]if '64' in tmp:ipaddr=i.split(' ')for j in ipaddr:if ':' in j:result=jlogs.logs(j)if ipaddr=='':logs.logs('ERROR!!!\n')exit('0')else:return result

ipv6更新脚本

#!/usr/bin/env python#coding=utf-8## 请先安装开发包 pip3 install aliyun-python-sdk-core-v3from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.request import CommonRequestimport getIPaddrimport logs#不仅可以更新ip还能更新域名解析类型以及域名前缀(记录值)等##################################RR='RR'# 域名前缀(记录值) 如 就填RR 可以随便填domain='' # 填完整的域名用于检测当前ip是否发生变化 如填 Value=getIPaddr.getIPv6ForLinux() # ipaddr now localhost xRecordId='2105432164005760' # 这个是主要的,自己百度一下怎么获取accessKeyId='xxxxx'#这个填自己的accessSecret='xxxxxxxxxx' #这个填自己的#####################################client = AcsClient(accessKeyId, accessSecret, 'default') request = CommonRequest()request.set_accept_format('json')request.set_domain('')request.set_method('POST')request.set_protocol_type('https') # https | http #请求使用的协议request.set_version('-01-09')request.set_action_name('UpdateDomainRecord')request.add_query_param('RecordId', RecordId)request.add_query_param('RR', RR)request.add_query_param('Type', 'AAAA') # 记录类型 可以更改 ipv4是A ,ipv6是 AAAArequest.add_query_param('Value', Value)request.add_query_param('Line', 'unicom') #这里的unicom指的是解析服务器,可以自己更改,可以改为default, Unicom指联通###############判断域名地址与当前地址是否相同if Value==getIPaddr.getDomainIp(domain):logs.logs('the value of domain is equal to localhost! \n')else:response = client.do_action(request)# python2: print(response) logs.logs(str(response, encoding = 'utf-8'))if 'error' in str(response):logs.logs('ERROR!!! Please check your setting!')

ipv4更新脚本

#!/usr/bin/env python#coding=utf-8## 请先安装开发包 pip3 install aliyun-python-sdk-core-v3from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.request import CommonRequestimport getIPaddrimport logs#不仅可以更新ip还能更新域名解析类型以及域名前缀(记录值)等##################################RR='RR'# 域名前缀(记录值) 如 就填RR 可以随便填domain='' # 填完整的域名用于检测当前ip是否发生变化 如填 Value=getIPaddr.getAddr4() # ipaddr now localhost xRecordId='2105432164005760' # 这个是主要的,自己百度一下怎么获取accessKeyId='xxxxx'#这个填自己的accessSecret='xxxxxxxxxx' #这个填自己的#####################################client = AcsClient(accessKeyId, accessSecret, 'default') request = CommonRequest()request.set_accept_format('json')request.set_domain('')request.set_method('POST')request.set_protocol_type('https') # https | http #请求使用的协议request.set_version('-01-09')request.set_action_name('UpdateDomainRecord')request.add_query_param('RecordId', RecordId)request.add_query_param('RR', RR)request.add_query_param('Type', 'A') # 记录类型 可以更改 ipv4是A ,ipv6是 AAAArequest.add_query_param('Value', Value)request.add_query_param('Line', 'unicom') #这里的unicom指的是解析服务器,可以自己更改,可以改为default, Unicom指联通###############判断域名地址与当前地址是否相同if Value==getIPaddr.getDomainIp(domain):logs.logs('the value of domain is equal to localhost! \n')else:response = client.do_action(request)# python2: print(response) logs.logs(str(response, encoding = 'utf-8'))if 'error' in str(response):logs.logs('ERROR!!! Please check your setting!')

定时器

#!/usr/bin/env python# coding=utf-8#定时脚本,定时执行任务import timeimport osimport logs#任务def task():os.system('python3 ddns6.py &') #ipv4的话更改为ddns.pylogs.logs('执行任务')#每隔半小时执行一次任务while True:task()time.sleep(1800)

让闹钟脚本开机自启动的办法

进入 /etc/init.d/,随便编辑里面一个文件 把脚本的启动命令添加到开头或者末尾确保可以执行

例如

vim /etc/init.d/ssh#添加 python3 闹钟脚本的地址 &

这样闹钟开机就会随着ssh服务而启动

如果觉得《阿里云ddns 动态域名更新Python脚本 基于Python3 适用于linux》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。