1. 首页
  2. 运维开发
  3. Python

使用阿里云的域名API实现动态域名解析DDNS脚本

只要拨号有公网IP地址,我们就可以使用脚本免费实现动态域名解析,相比免费的花生壳稳定性有很大的提升。使用dnspod实现ddns的脚本可以参考:http://blog.nbqykj.cn/?p=2334.html 。

首先是需要定义的几个参数:

rc_rr = “home” # 指代二级域名(子域名,空则使用 @ 代替)
rc_domain = “blog.nbqykj.cn” # 指代完整域名,若未配置阿里云 NameServer 解析修改也无效
rc_format = “json” # 指定返回数据格式,目前本例使用 JSON 数据
rc_type = “A” # 指定修改记录类型,目前本例使用 A 记录
rc_ttl = “600” # 指定修改 TTL 值,目前本例使用 600 秒
rc_format = “json” # 使用 JSON 返回数据,也可以填写为 XML

data_pkl=’/tmp/ddns_ip.pkl’ # 保存ip临时文件

# 定义邮箱参数,修改或者异常后邮件通知
smtp_server = “smtp.blog.nbqykj.cn”
smtp_port = 465
smtp_username = “noreply@blog.nbqykj.cn”
smtp_password = “123456”
smtp_ssl = True
to_emails = “admin@blog.nbqykj.cn”
email_error_log = “/tmp/mail_error.log”

access_key_id = “xxxxxxxxxxxxxxxx” # 这里为 Aliyun AccessKey 信息
access_key_secret = “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx” # 这里为 Aliyun AccessKey 信息

脚本实现ddns的步骤主要如下

一、获取本地公网IP地址

def my_ip_direct():
    opener = urllib.urlopen('https://tool.nbqykj.cn/network/ip/myip?type=html')
    strg = opener.read()
    return strg

二、获取本地保存的IP

def get_local_ip():
    try:
        f=file(data_pkl,'rb')
        data_dict=pickle.load(f)
        f.close()
    except:
        data_dict={"ip":""}
    return data_dict["ip"]

三、获取DNS解析出来的IP

def host2ip(hostname):
    ip =socket.gethostbyname(hostname)
    return ip

四、获取阿里云域名解析中记录的IP

def check_record_id(dns_rr, dns_domain):
    times = 0            # 用于检查对应子域名的记录信息
    check = 0            # 用于确认对应子域名的记录信息
    request = CommonRequest()
    request.set_accept_format('json')                   # 设置返回格式
    request.set_domain('alidns.aliyuncs.com')           # 阿里云服务
    request.set_method('POST')
    request.set_protocol_type('https')
    request.set_version('2015-01-09')
    request.set_action_name('DescribeDomainRecords')

    request.add_query_param('DomainName', rc_domain)    # 设置请求域名
    request.add_query_param('RRKeyWord', rc_rr)
    request.add_query_param('TypeKeyWord', rc_type)
    response = loads(clt.do_action(request))            # 接受返回数据
    result = response['DomainRecords']['Record']        # 缩小数据范围
    for record_info in result:                            # 遍历返回数据
        if record_info['RR'] == dns_rr:                    # 检查是否匹配
            check = 1; break;                            # 确认完成结束
        else:
            times += 1                                    # 进入下个匹配
    if check:
        result = result[times]['RecordId']                # 返回记录数值
    else:
        result = -1                                        # 返回失败数值
    return result

def old_ip(dns_record_id):
    request = CommonRequest()
    request.set_accept_format('json')                           # 设置返回格式
    request.set_domain('alidns.aliyuncs.com')
    request.set_method('POST')                                  # 设置记录值
    request.set_protocol_type('https')
    request.set_version('2015-01-09')
    request.set_action_name('DescribeDomainRecordInfo')

    request.add_query_param('RecordId', dns_record_id)

    result = loads(clt.do_action(request))                      # 接受返回数据
    return result['Value']                                      # 返回记录数值

# 调用方法
rc_record_id = check_record_id(rc_rr, rc_domain)
o_ip = old_ip(rc_record_id)

五、比较检查出来的IP,不一致的话修改

def update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl):
    request = CommonRequest()
    request.set_accept_format('json')                           # 设置返回格式
    request.set_domain('alidns.aliyuncs.com')
    request.set_method('POST')
    request.set_protocol_type('https')
    request.set_version('2015-01-09')
    request.set_action_name('UpdateDomainRecord')

    request.add_query_param('RecordId', dns_record_id)          # 设置记录值
    request.add_query_param('RR', dns_rr)                       # 设置子域名信息
    request.add_query_param('Type', dns_type)                   # 设置 DNS 类型
    request.add_query_param('Value', dns_value)                  # 设置解析 IP

    response = loads(clt.do_action(request))                    # 发送请求内容
    return response

#调用
rc_value = '1.2.3.4'
rc_record_id = check_record_id(rc_rr, rc_domain)
resp = update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl)

六、添加计划任务

*/1 * * * * /usr/bin/python /root/scripts/ali4ddns.py >>/tmp/ali4ddns.log 2>&1

详细的脚本下载地址:https://github.com/zhangnq/scripts/blob/master/python/ali4ddns.py

评论列表(0条)

联系我们

0574-55011290

QQ:248687950

邮件:admin@nbhao.org

工作时间:周一至周五,9:00-18:00,节假日休息

QR code