动态更新IP地址的方法
由于个人网络是动态IP地址,导致每次重启路由器都会更换IP地址,或者是租约到期也会更新IP地址。
更换IP地址后每次都需要重新设置DNSPod,假如设置不及时还可能会影响到个人搭建的某些服务。
所以当时我就在想有没有办法实现定期查询本地IP地址与DNSPod记录IP地址是否相同,
相同则不进行任何操作,不同则自动上报更新IP地址。于是乎有了下面这个利用DNSPod的API实现动态更新IP地址的方法。
优点:
- 定期自动查询比对IP地址是否相同,相同则不做任何操作,不同则自动上报并修改。
省去了人为修改不及时导致服务出现异常。
缺点:
- 需要有一台公网固定IP的服务器进行搭建API,增加了费用开支。
如果有需求的话可以评论留言我提供给你API。(我之所以自己搭建是因为本地有一个4T的私人网盘,使用OOS、COS或VPS存储空间太贵)
使用方法
- 一台固定公网服务器搭建Web服务,并把以下API代码部署到服务器。
- 需要到腾讯DNSPod官网申请SecretKey、SecretId,调用API会用到。
申请网址:腾讯云控制台 - 去DNSPod创建需要动态DDNS解析的子域名。
- 设置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'); } ?>
收藏备用。