引领工作室
引领自己走向未来

DNSPod用户API实现的纯Shell动态域名客户端:ArDNSPod

之前博客分享过一个dnspod的ddns插件,后续好像是出了问题,无法正常使用,由于技术问题,博客也无法修复,具体文章:#二次更新 利用DNSPodAPI实现服务器DDNS解析,博客后续找到一个工具,ArDNSPod,基于DNSPod用户API实现的纯Shell动态域名客户端。

博客进行了一部分修改:

 
合并了ddnspod.sh和ardnspod
修改了ip获取方式,直接从公网获取,不走内网,避免出问题。
解析到新ip后,自动退出程序。

下载:
https://cikeblog.com/s/ardnspod

#!/bin/sh
#

#############################################################
# AnripDdns v6.0.0
#
# Dynamic DNS using DNSPod API
#
# Author: anrip<mail@anrip.com>, www.anrip.com/post/872
# Collaborators: ProfFan, https://github.com/ProfFan
#
# Usage: please refer to `ddnspod.sh`
#
#############################################################

# TokenID,Token

export arToken=""

# Get WAN-IP

arWanIp() {

    local hostIp

    local lanIps="^$"

    lanIps="$lanIps|(^10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^169\.254\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^192\.168\.[0-9]{1,3}\.[0-9]{1,3}$)"

    case $(uname) in
        'Linux')
hostIp=$(wget --quiet --output-document=- http://members.3322.org/dyndns/getip)
        ;;
        'Darwin')
            hostIp=$(ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | grep -Ev "$lanIps")
        ;;
    esac

    if [ -z "$hostIp" ]; then
        if type wget >/dev/null 2>&1; then
            hostIp=$(wget --quiet --output-document=- http://members.3322.org/dyndns/getip)
        else
            hostIp=$(curl -s http://members.3322.org/dyndns/getip)
        fi
    fi

    echo $hostIp

}

# Dnspod Bridge
# Arg: type data

arDdnsApi() {

    local agent="AnripDdns/6.0.0(mail@anrip.com)"

    local apiurl="https://dnsapi.cn/${1:?'Info.Version'}"
    local params="login_token=$arToken&format=json&$2"

    if type wget >/dev/null 2>&1; then
        wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $params $apiurl
    else
        curl -s -A $agent -d $params $apiurl
    fi

}

# Fetch Domain Ip
# Arg: domain

arDdnsInfo() {

    local domainId
    local recordId
    local recordIp

    # Get domain ID
    domainId=$(arDdnsApi "Domain.Info" "domain=$1")
    domainId=$(echo $domainId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    # Get Record ID
    recordId=$(arDdnsApi "Record.List" "domain_id=$domainId&sub_domain=$2&record_type=A")
    recordId=$(echo $recordId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    # Last IP
    recordIp=$(arDdnsApi "Record.Info" "domain_id=$domainId&record_id=$recordId")
    recordIp=$(echo $recordIp | sed 's/.*,"value":"\([0-9\.]*\)".*/\1/')

    # Output IP
    case "$recordIp" in
        [1-9]*)
            echo $recordIp
            return 0
        ;;
        *)
            echo "Get Record Info Failed!"
            return 1
        ;;
    esac

}

# Update Domain Ip
# Arg: main-domain sub-domain

arDdnsUpdate() {

    local domainId
    local recordId
    local recordRs
    local recordIp
    local recordCd

    local hostIp=$(arWanIp)

    # Get domain ID
    domainId=$(arDdnsApi "Domain.Info" "domain=$1")
    domainId=$(echo $domainId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    # Get Record ID
    recordId=$(arDdnsApi "Record.List" "domain_id=$domainId&sub_domain=$2&record_type=A")
    recordId=$(echo $recordId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    # Update IP
    recordRs=$(arDdnsApi "Record.Ddns" "domain_id=$domainId&record_id=$recordId&sub_domain=$2&record_type=A&value=$hostIp&record_line=%e9%bb%98%e8%ae%a4")
    recordIp=$(echo $recordRs | sed 's/.*,"value":"\([0-9\.]*\)".*/\1/')
    recordCd=$(echo $recordRs | sed 's/.*{"code":"\([0-9]*\)".*/\1/')

    # Output IP
    if [ "$recordIp" = "$hostIp" ]; then
        if [ "$recordCd" = "1" ]; then
            echo $recordIp
            return 0
        fi
        # Echo error message
        echo $recordRs | sed 's/.*,"message":"\([^"]*\)".*/\1/'
        return 1
    else
        echo "Update Failed! Please check your network."
        return 1
    fi

}

# DDNS Check
# Arg: Main Sub
arDdnsCheck() {

    local postRs
    local lastIP

    local hostIp=$(arWanIp)

    echo "Updating Domain: $2.$1"
    echo "Host Ip: $hostIp"

    lastIP=$(arDdnsInfo "$1" "$2")
    if [ $? -eq 0 ]; then
        echo "lastIP: $lastIP"
        if [ "$lastIP" != "$hostIp" ]; then
            postRs=$(arDdnsUpdate "$1" "$2")
            if [ $? -eq 0 ]; then
                echo "postRs: $postRs"
                return 0
            else
                echo "$postRs"
                return 1
            fi
        fi
        echo "Last IP is the same as current IP!"
        return 1
    fi

    echo "$lastIP"
    return 1

}
arToken="15794x,23501514c6dba32dcebb04xxxxxxxxxx"

# Place each domain you want to check as follows
# you can have multiple arDdnsCheck blocks
arDdnsCheck "1.cc" "a"
#this domain is :a.1.cc

修改:

183行代码:
arToken="15794x,23501514c6dba32dcebb04xxxxxxxxxx"
请自行修改为dnspod的api信息,参照格式修改。
187行代码:
arDdnsCheck "1.cc" "a"
解析内容为:a.1.cc 请自行修改,格式不要乱。

使用:

chmod +x ardnspod
./ardnspod

测试无误后,自行加入crontab即可,推荐使用以下信息:

*/3 * * * * /root/ardnspod

三分钟自动刷新一次ddns。

作者github地址:https://github.com/anrip/dnspod-shell

赞(0) 更多内容关注公众号
版权声明:本站文章多数来源网络,本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《DNSPod用户API实现的纯Shell动态域名客户端:ArDNSPod》
文章链接:http://www.emulead.com/777.html

觉得文章不错就关注下公众号

微信扫一扫打赏