利用API自动更新腾讯dnspod子域名解析记录实现ddns

    选择打赏方式

    由于个人网络是动态IP地址,导致每次重启路由器都会更换IP地址,或者是租约到期也会更新IP地址,更换IP地址后每次都需要重新设置dnspod,假如设置不及时还可能会影响到个人搭建的某些服务。所以当时我就在想有没有办法实现定期查询本地IP地址与dnspod记录IP地址是否相同,相同则不进行任何操作,不同则自动上报更新IP地址。于是乎有了下面这个利用dnspod的API实现动态更新IP地址的方法。

    此方法并非最优方案,此方法的优缺点如下:

优点:定期自动查询比对IP地址是否相同,相同则不做任何操作,不同则自动上报并修改。省去了人为修改不及时导致服务出现异常。

缺点:需要有一台公网固定IP的服务器进行搭建api,增加了费用开支。如果有需求的话可以评论留言我提供给你API。(我之所以自己搭建是因为本地有一个4T的私人网盘,使用OOS、COS或VPS存储空间太贵)

    使用方法:

1.一台固定公网服务器搭建web服务,并把以下API代码部署到服务器。

2.需要到腾讯DNSPOD官网申请SecretKey、SecretId,调用API会用到。申请网址:https://console.cloud.tencent.com/cam/capi

3.去DNSPOD创建需要动态DDNS解析的子域名。

4.设置ddns.php里面的SecretId(line:22 or 54)SecretKey(line:25 or 57)、主域名(line:89)、记录类型(line:91 默认为A记录)、token(line:16 可空,用来防止域名被恶意解析)

4.API调用方法为ddns.php?token=xxxxxxxxxx&subDomain=pan

ddns.php

<?php
$Ip = getIP();
function getIP()
{
    global $ip;
    if (getenv("HTTP_CLIENT_IP"))
        $ip = getenv("HTTP_CLIENT_IP");
    else if(getenv("HTTP_X_FORWARDED_FOR"))
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if(getenv("REMOTE_ADDR"))
        $ip = getenv("REMOTE_ADDR");
    else 
        $ip = "Unknow";
    return $ip;
}
if ($_GET['token'] == "") {

    function ddns($domain,$recordId,$subDomain,$Type,$Line,$Value,$recordValue){
        $url = "https://cns.api.qcloud.com/v2/index.php";
        $Action = "RecordModify";
        $Nonce = rand(100000,500000);
        $SecretId = "";
        $SignatureMethod = "HmacSHA1";
        $Timestamp = time();
        $SecretKey = "";
        //生成签名串
        $srcStr = "GETcns.api.qcloud.com/v2/index.php?Action=$Action&Nonce=$Nonce&Region=&SecretId=$SecretId&SignatureMethod=$SignatureMethod&Timestamp=$Timestamp&domain=$domain&recordId=$recordId&recordLine=$Line&recordType=$Type&subDomain=$subDomain&value=$Value";
        $signStr = urlencode(base64_encode(hash_hmac('sha1',$srcStr,$SecretKey,true)));

        //修改域名解析记录
        $url = "$url?Action=$Action&Nonce=$Nonce&Region=&SecretId=$SecretId&SignatureMethod=$SignatureMethod&Timestamp=$Timestamp&domain=$domain&recordId=$recordId&recordLine=$Line&recordType=$Type&subDomain=$subDomain&value=$Value&Signature=$signStr";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);  //设置访问的url地址
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        $result =  curl_exec($ch);  //域名转入成功后做json解析,解析请求结果并返回。
        curl_close ($ch);
        $result = json_decode($result,true);
        $code = $result['code'];
        if ($code == 0) {
            echo "子域名:$subDomain.$domain"."IP地址更新成功:</br>原IP地址为:$recordValue</br>新IP地址为:$Value";
        }else{
            echo "错误码:".$result['code']."</br>";
            echo "错误信息:".$result['message'];
        }
        //return $result;
    }

    function getRecordId($subDomain,$domain){
        $url = "https://cns.api.qcloud.com/v2/index.php";
        $Action_List = "RecordList";
        $Nonce = rand(100000,500000);
        $SecretId = "";
        //$SignatureMethod = "HmacSHA256";
        $Timestamp = time();
        $SecretKey = "";

        //生成签名串
        $srcStr = "GETcns.api.qcloud.com/v2/index.php?Action=$Action_List&Nonce=$Nonce&SecretId=$SecretId&Timestamp=$Timestamp&domain=$domain";
        $signStr = urlencode(base64_encode(hash_hmac('sha1',$srcStr,$SecretKey,true)));

        //获取recordId
        $url = "$url?Action=$Action_List&Nonce=$Nonce&SecretId=$SecretId&Timestamp=$Timestamp&Signature=$signStr&domain=$domain";

        //修改域名解析记录
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);  //设置访问的url地址
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        $result =  curl_exec($ch);  //域名转入成功后做json解析,解析请求结果并返回。
        curl_close ($ch);
        $result = json_decode($result,true);

        //$Id = $result['code'];
        $Data = $result['data']['records'];
        $num = count($Data);
        for ($i = 0; $i < $num; $i++) {
             if ($Data[$i]['name'] == $subDomain) {
                 $Id = $Data[$i]['id'];
                 $Name = $Data[$i]['name'];
                 $Value = $Data[$i]['value'];
             }
        }
        return array($Id,$Name,$Value);
    }

    $domain = "mxin.moe";
    $subDomain = $_GET['subDomain'];
    $Type = "A";
    $Line = "默认";
    $Value = $Ip;
    getRecordId($subDomain,$domain);
    list($recordId,$recordName,$recordValue) = getRecordId($subDomain,$domain);
    if ($recordValue <> $Value) {
        ddns($domain,$recordId,$subDomain,$Type,$Line,$Value,$recordValue);
    }else{
        echo "子域名:$subDomain.$domain"."无需更新IP地址。</br>原IP地址为:$recordValue</br>新IP地址为:$Value";
    }
}else{
    header('content-type:text/html;charset=uft-8');
    header('location:https://www.mxin.moe');
}
?>


版权声明:若无特殊注明,本文为《铭心》原创,转载请保留文章出处。
本文链接:https://www.mxin.moe/dnspod_ddns.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框
可使用QQ号实时获取昵称+头像

私密评论

吃奶的力气提交吐槽中...

已有1条吐槽

匿名

2021-10-28 21:04 湖北省黄石市联通
收藏备用。
 Windows 7 x64   QQBrowser 10.8.4508.400