<?php
#需要配置的项
define('ACCESSKEYID','AAAAAAAAAAAAAAAA'); #阿里云用户密钥ID 获取方法 https://help.aliyun.com/knowledge_detail/38738.html
define('ACCESSKEYSECRET','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');#阿里云用户密钥
define('RR','myhome'); #二级域名的记录名 如果是一级 请用@
define('DOMAIN','myhome.baidu.com'); #完整域名
define('RECORDID','11111111111111111'); #解析记录ID
/*关键如何获取解析记录ID ,需要在下面这个地址中
https://api.aliyun.com/?spm=a2c4g.11186623.2.26.79ae2846d9RBBa#/?product=Alidns&api=AddDomainRecord¶ms={}&tab=DEMO&lang=JAVA
先设置一个记录(二级域名) 然后返回结果中获取这个ID 添加记录所需的参数文档在下面这里查看
https://help.aliyun.com/document_detail/29772.html?spm=a2c4g.11186623.4.3.392b5eb4SAeph9
*/
# 获取自己公网 IP 的接口
define('GET_IP_URL','myip.fireflysoft.net');
define('IP_FILE',__DIR__. DIRECTORY_SEPARATOR .'ip.txt');
function 获取HTTP($url)
{
$curl_samples = curl_init();
$options = [CURLOPT_URL => $url,CURLOPT_RETURNTRANSFER => 1,CURLOPT_FOLLOWLOCATION => 1,CURLOPT_SSL_VERIFYPEER => 0];
curl_setopt_array($curl_samples, $options);
curl_setopt($curl_samples, CURLOPT_CUSTOMREQUEST, 'GET');
$result = curl_exec($curl_samples);
$info = curl_getinfo($curl_samples);
$curl_err = curl_errno($curl_samples);
curl_close($curl_samples);
if( 0 != $curl_err )
{
echo "getip error:".date('Y-m-d H:i:s',time());
var_dump($info);
echo PHP_EOL;
var_dump($result);
echo PHP_EOL;
echo $curl_err;
echo PHP_EOL;
exit;
}
return $result;
}
function 编码字符($string)
{
$result = urlencode($string);
$result = str_replace(['+', '*'], ['%20', '%2A'], $result);
$result = preg_replace('/%7E/', '~', $result);
return $result;
}
function 排序参数计算签名($parameters,$method="GET")
{
ksort($parameters);
$canonicalizedQuery = '';
foreach ($parameters as $key => $value)
{
$canonicalizedQuery .= '&' . 编码字符($key) . '=' . 编码字符($value);
}
$stringToBeSigned = $method. '&%2F&'. 编码字符(substr($canonicalizedQuery, 1));
return base64_encode(hash_hmac('sha1', $stringToBeSigned, ACCESSKEYSECRET . '&', true));
}
function 获取当前的解析记录值()
{
#请求dns的API重新做解析
$api_url = 'https://alidns.aliyuncs.com/?';
$data = [];
#公共参数
$data['Format'] = 'json';
$data['Version'] = '2015-01-09';
$data['SignatureMethod'] = 'HMAC-SHA1';
$data['SignatureNonce'] = uniqid();
$data['SignatureVersion']= '1.0';
$data['AccessKeyId'] = ACCESSKEYID;
$data['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z");
#专用参数
$data['Action'] = 'DescribeDomainRecordInfo';
$data['RecordId'] = RECORDID; #解析记录的ID,此参数在添加解析时会返回,在获取域名解析列表时会返回
#签名
$data['Signature'] = 排序参数计算签名($data);
#请求接口
$json = 获取HTTP($api_url . http_build_query($data));
$result = json_decode($json,true);
return $result['Value'];
}
function 主函数()
{
#获取现在网络的IP
$ip = 获取HTTP(GET_IP_URL);
#获取现在域名的解析结果 也就是旧的IP
$旧IP = 获取当前的解析记录值();
#对比新旧IP是否一样
if(!isset($旧IP) || $旧IP !== $ip)
{
#请求dns的API重新做解析
$api_url = 'https://alidns.aliyuncs.com/?';
$data = [];
#公共参数
$data['Format'] = 'json';
$data['Version'] = '2015-01-09';
$data['SignatureMethod'] = 'HMAC-SHA1';
$data['SignatureNonce'] = uniqid();
$data['SignatureVersion']= '1.0';
$data['AccessKeyId'] = ACCESSKEYID;
$data['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z");
#专用参数
$data['Action'] = 'UpdateDomainRecord';
$data['RecordId'] = RECORDID; #解析记录的ID,此参数在添加解析时会返回,在获取域名解析列表时会返回
$data['RR'] = RR; #主机记录
$data['Type'] = 'A';
$data['Value'] = $ip;
$data['TTL'] = 600;
#$data['Priority'] = 10; #MX记录的优先级,取值范围[1,10],记录类型为MX记录时,此参数必须
$data['Line'] = 'default';
#签名
$data['Signature'] = 排序参数计算签名($data);
#请求接口
$json = 获取HTTP($api_url . http_build_query($data));
$result = json_decode($json);
#完成以后
if(isset($result->RecordId)){
file_put_contents(IP_FILE,$ip);
}else{
echo 'error';
var_dump($result);
}
}else
{
echo 'IP没有发生变化,不需要修改解析记录';
}
}
主函数();