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

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

前提:已经在阿里云注册了一个域名,获得AccessKey ID
AccessKey Secret,先添加了一个子域名解析,解析值随便
然后获取这个子域名的recordid ,这些怎么获取,网上都有教程自。己搜一下,一定要获取自己的,

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

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

原理:

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

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

下面的脚本是本人自己写的,参考了别人的一些东西,由于本人水平很low请各位勿怪,域名解析的更新往往有延迟
源码包链接: 提取码: h47n
一共5个文件 日志,获取ip地址,更新ipv4脚本,更新ipv6脚本,定时器 前面两个文件都是函数接口,后面三个才是正主

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

  1. 日志脚本
#!/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()

  1. 获取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

  1. 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!')



  1. 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!')



  1. 定时器


#!/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服务而启动

上一篇:使用VBS脚本实现Ali_DDNS


下一篇:NameSilo的DDNS动态域名解析脚本