利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS
我尝试安装openwrt 路由器上首先openwrt 的路由器空间必须大,我是安装在u盘上的,可能要10M左右空间 ,python安装也占不少空间.
程序中用到阿里云的库, aliyunsdkcore 和aliyunsdkalidns , 之前有人用pip 安装,但是openwrt 上不能, 所以下载其源码,然后解压后, 把里面核心代码复制到 /usr/lib/python2.7/XXXX (后面路径不记得) ,我看见别人自己提取相关几个文件,放在当前目录也可以.
update_ip.py 这个基本上来自前面那个文章,只不过我因为跑在openwrt上, 所以我改了获取ip的方式,改有get_ip这个脚本获取.
#!/usr/bin/env python
# coding= utf-8
import subprocess
import os
import json
#from urllib2 import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest
class DnsHandler:
# 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret
access_key_id = ""
access_key_secret = ""
region_id = "cn-hangzhou"
# 填入自己的域名
domain_name = ""
# 填入二级域名的RR值
rr_keyword = ""
# 解析记录类型,一般为A记录
record_type = "A"
# 用于储存解析记录的文件名
file_name = ".ip_addr"
client = None
record = None
current_ip= ''
# 初始化,获取client实例
def __init__(self):
self.client = AcsClient(
self.access_key_id,
self.access_key_secret,
self.region_id
)
self.record = self.get_record()
self.current_ip = self.get_current_ip()
# 如果公网IP发生变化,则自动修改阿里云解析记录
def reset(self):
if self.current_ip <> self.get_record_value():
# print self.current_ip
print self.update_record(self.current_ip)
self.get_record()
# 获取阿里云域名解析完整记录,并使用文件缓存
def get_record(self):
if os.path.isfile(self.file_name) :
file_handler = open(self.file_name, 'r')
r = file_handler.read()
file_handler.close()
else :
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_PageSize(10)
request.set_action_name("DescribeDomainRecords")
request.set_DomainName(self.domain_name)
request.set_RRKeyWord(self.rr_keyword)
request.set_TypeKeyWord(self.record_type)
r = self.client.do_action_with_exception(request)
file_handler = open(self.file_name, 'w')
file_handler.write(r)
file_handler.close()
return json.loads(r)
# 获取阿里云域名解析记录ID
def get_record_id(self) :
return self.record["DomainRecords"]["Record"]["RecordId"]
# 获取当前域名解析记录
def get_record_value(self) :
return self.record["DomainRecords"]["Record"]["Value"]
# 修改阿里云解析记录
def update_record(self, value):
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_action_name("UpdateDomainRecord")
request.set_RecordId(self.get_record_id())
request.set_Type(self.record_type)
request.set_RR(self.rr_keyword)
request.set_Value(value)
return self.client.do_action_with_exception(request)
# 获取当前公网IP
def get_current_ip(self):
#ip,retcode=os.system('./get_ip')
out_bytes=subprocess.check_output('/root/get_ip')
out_text= out_bytes.decode('utf8')
out_text=out_text.replace("\n","")
#print out_text
#out_text.replace("\n","").replace("\r","")
return out_text
# //json.load(urlopen('http://jsonip.com'))['ip'
# 实例化类并启动更新程序
dns = DnsHandler()
dns.reset()
获取IP脚本
#!/bin/sh
# check ip change and update it
ip_regex="\{1,3\}\.\{1,3\}\.\{1,3\}\.\{1,3\}"
ipaddr=$(ifconfig pppoe-wan | awk '/inet /{print $2}'|grep -o "$ip_regex" )
echo $ipaddr
然后加到cron 里面
*/15 * * * * python /root/update_ip.py
感谢分享!
页:
[1]