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


avatar
铭心 2021-06-01 3.09k

动态更新IP地址的方法

由于个人网络是动态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会用到。
    申请网址:腾讯云控制台
  3. 去DNSPod创建需要动态DDNS解析的子域名。
  4. 设置ddns.php里面的SecretId(line:22 or 54)、SecretKey(line:25 or 57)、主域名(line:89)、
    记录类型(line:91 默认为A记录)、token(line:16 可空,用来防止域名被恶意解析)。

API调用方法

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地址更新成功:原IP地址为:$recordValue新IP地址为:$Value";
        } else {
            echo "错误码:".$result['code']."";
            echo "错误信息:".$result['message'];
        }
    }

    function getRecordId($subDomain,$domain){
        $url = "https://cns.api.qcloud.com/v2/index.php";
        $Action_List = "RecordList";
        $Nonce = rand(100000,500000);
        $SecretId = "";
        $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);

        $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.co";
    $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地址。原IP地址为:$recordValue新IP地址为:$Value";
    }
} else {
    header('content-type:text/html;charset=uft-8');
    header('location:https://www.mxin.moe');
}
?>

发表评论
OωO表情