找回密码
 立即注册
查看: 873|回复: 1

[教程] 利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS

[复制链接]

33

主题

114

回帖

335

积分

中级渣柚V1

积分
335
发表于 2019-10-7 16:00:47 | 显示全部楼层 |阅读模式
我尝试安装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"][0]["RecordId"]

    # 获取当前域名解析记录
    def get_record_value(self) :
        return self.record["DomainRecords"]["Record"][0]["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="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"

ipaddr=$(ifconfig pppoe-wan | awk '/inet /{print $2}'  |grep -o "$ip_regex" )

echo $ipaddr
然后加到cron 里面
*/15 * * * * python /root/update_ip.py

11

主题

301

回帖

556

积分

中级渣柚V2

积分
556
发表于 2019-10-11 09:36:31 | 显示全部楼层
感谢分享!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|矿渣社区 ( 黔ICP备2024020525号-1 )

GMT+8, 2024-5-11 23:24 , Processed in 0.047356 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表