阿里云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 time
import 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-8
import requests
import socket
import os
import logs
#前面两个通过dns服务器获得本地IP地址,有时候获得的地址不准
def getAddr6():
try:
response=requests.request('get','https://ipv6.ddnspod.com')
ip6='['+response.text+']'
logs.logs(ip6)
return response.text
except:
pass
def getAddr4():
try:
response=requests.request('get','https://ipv4.ddnspod.com')
ip4=response.text
logs.logs(ip4)
return response.text
except:
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=j
logs.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-v3
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import getIPaddr
import logs
#不仅可以更新ip还能更新域名解析类型以及域名前缀(记录值)等
##################################
RR='RR' # 域名前缀(记录值) 如 RR.china.cn 就填RR 可以随便填
domain='RR.china.cn' # 填完整的域名用于检测当前ip是否发生变化 如填 RR.china.cn
Value=getIPaddr.getIPv6ForLinux() # ipaddr now localhost x
RecordId='2105432164005760' # 这个是主要的,自己百度一下怎么获取
accessKeyId='xxxxx' #这个填自己的
accessSecret='xxxxxxxxxx' #这个填自己的
#####################################
client = AcsClient(accessKeyId, accessSecret, 'default')
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('alidns.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http #请求使用的协议
request.set_version('2015-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是 AAAA
request.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-v3
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import getIPaddr
import logs
#不仅可以更新ip还能更新域名解析类型以及域名前缀(记录值)等
##################################
RR='RR' # 域名前缀(记录值) 如 RR.china.cn 就填RR 可以随便填
domain='RR.china.cn' # 填完整的域名用于检测当前ip是否发生变化 如填 RR.china.cn
Value=getIPaddr.getAddr4() # ipaddr now localhost x
RecordId='2105432164005760' # 这个是主要的,自己百度一下怎么获取
accessKeyId='xxxxx' #这个填自己的
accessSecret='xxxxxxxxxx' #这个填自己的
#####################################
client = AcsClient(accessKeyId, accessSecret, 'default')
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('alidns.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http #请求使用的协议
request.set_version('2015-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是 AAAA
request.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 time
import os
import logs
#任务
def task():
os.system('python3 ddns6.py &') #ipv4的话更改为ddns.py
logs.logs('执行任务')
#每隔半小时执行一次任务
while True:
task()
time.sleep(1800)
让闹钟脚本开机自启动的办法
进入 /etc/init.d/,随便编辑里面一个文件 把脚本的启动命令添加到开头或者末尾确保可以执行
例如
vim /etc/init.d/ssh
#添加 python3 闹钟脚本的地址 &
这样闹钟开机就会随着ssh服务而启动