kuang_za 发表于 2019-10-7 16:00:47

利用阿里云 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

vlookuptest 发表于 2019-10-11 09:36:31

感谢分享!
页: [1]
查看完整版本: 利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS