由于个人网络是动态IP地址,导致每次重启路由器都会更换IP地址,或者是租约到期也会更新IP地址。 更换IP地址后每次都需要重新设置DNSPod,假如设置不及时还可能会影响到个人搭建的某些服务。 所以当时我就在想有没有办法实现定期查询本地IP地址与DNSPod记录IP地址是否相同, 相同则不进行任何操作,不同则自动上报更新IP地址。于是乎有了下面这个利用DNSPod的API实现动态更新IP地址的方法。
API调用方法为 ddns.php?token=xxxxxxxxxx&subDomain=pan
<?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');
}
?>