树莓派实现阿里云DNS动态域名解析

admin 11天前 44

  让树莓派实现阿里云DNS动态域名解析,需要Python2.x 运行。

1、首先安装alidns python sdk,输入以下命令。

sudo pip install aliyun-python-sdk-alidns

(如果报错可参考 : https://www.jmdbd.com/?thread-10.htm

2、将以下代码保存为“ddns.py”。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# www.jmdbd.com
 
import json
import os
import re
import sys
from datetime import datetime
 
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \
    DescribeDomainRecordInfoRequest
from aliyunsdkcore import client
 
#请填写你的Access Key ID
access_key_id = ""
 
#请填写你的Access Key Secret
access_key_secret = ""
 
#请填写你的账号ID
account_id = ""
 
#如果选择yes,则运行程序后仅现实域名信息,并不会更新记录,用于获取解析记录ID。
#如果选择no,则运行程序后不显示域名信息,仅更新记录
#i_dont_know_record_id = 'yes'
i_dont_know_record_id = 'no'
#请填写解析记录ID
rc_record_id = ''
 
#请填写你的一级域名
rc_domain = ''
 
#请填写你的解析记录,对应的主机记录
rc_rr = ''
 
#请填写你的记录类型,DDNS请填写A,表示A记录
rc_type = 'A'
 
#请填写解析有效生存时间TTL,单位:秒
#rc_ttl = '1'
rc_ttl = '600'
 
#请填写返还内容格式,json,xml
rc_format = 'json'
 
 
def my_ip():
    get_ip_method = os.popen('curl -s ip.cn')
    get_ip_responses = get_ip_method.readlines()[0]
    get_ip_pattern = re.compile(r'\d+\.\d+\.\d+\.\d+')
    get_ip_value = get_ip_pattern.findall(get_ip_responses)[0]
    return get_ip_value
 
 
def check_records(dns_domain):
    clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
    request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
    request.set_DomainName(dns_domain)
    request.set_accept_format(rc_format)
    #result = clt.do_action(request)
    result = clt.do_action_with_exception(request)
    return result
 
 
def old_ip():
    clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
    request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest()
    request.set_RecordId(rc_record_id)
    request.set_accept_format(rc_format)
    #result = clt.do_action(request)
    result = clt.do_action_with_exception(request)
    result = json.JSONDecoder().decode(result)
    result = result['Value']
    return result
 
 
def update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl, dns_format):
    clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
    request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
    request.set_RR(dns_rr)
    request.set_Type(dns_type)
    request.set_Value(dns_value)
    request.set_RecordId(dns_record_id)
    request.set_TTL(dns_ttl)
    request.set_accept_format(dns_format)
    #result = clt.do_action(request)
    result = clt.do_action_with_exception(request)
    return result
 
def write_to_file():
    time_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    #current_script_path = sys.path[7]
    current_script_path = sys.path[0]
    print current_script_path
    log_file = current_script_path + '/' + 'aliyun_ddns_log.txt'
    write = open(log_file, 'a')
    write.write(time_now + ' ' + str(rc_value_old) + '--->' + str(rc_value) + '\n')
    write.close()
    return
 
if i_dont_know_record_id == 'yes':
    print check_records(rc_domain)
elif i_dont_know_record_id == 'no':
    rc_value = my_ip()
    rc_value_old = old_ip()
    if rc_value_old == rc_value:
        print 'The specified value of parameter Value is the same as old'
    else:
        print update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format)
        write_to_file()

分别填入代码内所需的信息:Access Key ID、Access Key Secret、阿里云账号ID、解析记录ID、一级域名、解析记录。

特别注意的是“解析记录ID”,需要先将“i_dont_know_record_id = 'no'”设置为“yes”,即可在返回信息里获取。

3、将修改好的文件使用WinSCP上传至树莓派,输入以下命令执行:

python DNS.py

4、使用crontab命令添加计划任务,让脚本自动运行。

  首先说一下Crontab命令参数:

  crontab参数:

    -u:只有root才可能,帮其他用户建立或移除工作排程。

    -l:查阅crontab的工作内容

    -r:移除所有的crontab的工作内容,移除一项,用-e编辑。

 输入以下命令编辑:

crontab -e

  在文件末尾添加以下内容:

*/60 * * * * python DNS.py

参数含义:

# * * * * *  command to execute (要执行的命令)
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── 星期中的哪一天(0-7)(从0到6代表星期日到星期六,也可以使用名字;7是星期天,等同于0)
# │ │ │ └────────── 月份 (1 - 12)
# │ │ └───────────────几号 (1 - 31)
# │ └──────────────────── 小时 (0 - 23)
# └───────────────────────── 分钟 (0 - 59)

依次按下“Ctrl+O”,“Ctrl+X”保存及退出即可。

最新回复 (0)
返回
发新帖