在线工具 美国VPS 联系我们

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

发表时间:2019-08-14 10:10 | 分类:Python | 浏览:3,836 次

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

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

rc_rr = "home" # 指代二级域名(子域名,空则使用 @ 代替)
rc_domain = "zhangnq.com" # 指代完整域名,若未配置阿里云 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.zhangnq.com"
smtp_port = 465
smtp_username = "noreply@zhangnq.com"
smtp_password = "123456"
smtp_ssl = True
to_emails = "admin@zhangnq.com"
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('http://tool.sijitao.net/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

本文标签:

本文链接:https://zhangnq.com/3077.html

欢迎您在本博客中留下评论,如需转载原创文章请注明出处,谢谢!

现在只有1个回复
Comment (1)
Trackbacks (0)
  1. 武陵红苗  ( 2019.08.16 16:21 ) : #-9

    学习了 :roll:

  1. 还没有Trackbacks
一键脚本 博客历程 留言本 文章归档 网站地图 谷歌地图 浙ICP备13025236号
托管于阿里云&七牛云 浙公网安备 33021202001057号
Copyright © 2010-2019 章郎虫博客 All Rights Reserved.