PHP更新本地公网IP到阿里云域名解析,实现DDNS
1 <?php 2 #需要配置的项 3 define('ACCESSKEYID','AAAAAAAAAAAAAAAA'); #阿里云用户密钥ID 获取方法 https://help.aliyun.com/knowledge_detail/38738.html 4 define('ACCESSKEYSECRET','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');#阿里云用户密钥 5 define('RR','myhome'); #二级域名的记录名 如果是一级 请用@ 6 define('DOMAIN','myhome.baidu.com'); #完整域名 7 define('RECORDID','11111111111111111'); #解析记录ID 8 /*关键如何获取解析记录ID ,需要在下面这个地址中 9 https://api.aliyun.com/?spm=a2c4g.11186623.2.26.79ae2846d9RBBa#/?product=Alidns&api=AddDomainRecord¶ms={}&tab=DEMO&lang=JAVA 10 先设置一个记录(二级域名) 然后返回结果中获取这个ID 添加记录所需的参数文档在下面这里查看 11 https://help.aliyun.com/document_detail/29772.html?spm=a2c4g.11186623.4.3.392b5eb4SAeph9 12 13 */ 14 15 define('GET_IP_URL','myip.fireflysoft.net'); 16 define('IP_FILE',__DIR__. DIRECTORY_SEPARATOR .'ip.txt'); 17 18 function 获取HTTP($url) 19 { 20 $curl_samples = curl_init(); 21 $options = [CURLOPT_URL => $url,CURLOPT_RETURNTRANSFER => 1,CURLOPT_FOLLOWLOCATION => 1,CURLOPT_SSL_VERIFYPEER => 0]; 22 curl_setopt_array($curl_samples, $options); 23 curl_setopt($curl_samples, CURLOPT_CUSTOMREQUEST, 'GET'); 24 $result = curl_exec($curl_samples); 25 $info = curl_getinfo($curl_samples); 26 $curl_err = curl_errno($curl_samples); 27 curl_close($curl_samples); 28 if( 0 != $curl_err ) 29 { 30 echo "getip error:".date('Y-m-d H:i:s',time()); 31 var_dump($info); 32 echo PHP_EOL; 33 var_dump($result); 34 echo PHP_EOL; 35 echo $curl_err; 36 echo PHP_EOL; 37 exit; 38 } 39 return $result; 40 } 41 42 function 编码字符($string) 43 { 44 $result = urlencode($string); 45 $result = str_replace(['+', '*'], ['%20', '%2A'], $result); 46 $result = preg_replace('/%7E/', '~', $result); 47 return $result; 48 } 49 50 function 排序参数计算签名($parameters,$method="GET") 51 { 52 ksort($parameters); 53 $canonicalizedQuery = ''; 54 foreach ($parameters as $key => $value) 55 { 56 $canonicalizedQuery .= '&' . 编码字符($key) . '=' . 编码字符($value); 57 } 58 59 $stringToBeSigned = $method. '&%2F&'. 编码字符(substr($canonicalizedQuery, 1)); 60 return base64_encode(hash_hmac('sha1', $stringToBeSigned, ACCESSKEYSECRET . '&', true)); 61 } 62 63 function 获取当前的解析记录值() 64 { 65 #请求dns的API重新做解析 66 $api_url = 'https://alidns.aliyuncs.com/?'; 67 $data = []; 68 #公共参数 69 $data['Format'] = 'json'; 70 $data['Version'] = '2015-01-09'; 71 $data['SignatureMethod'] = 'HMAC-SHA1'; 72 $data['SignatureNonce'] = uniqid(); 73 $data['SignatureVersion']= '1.0'; 74 $data['AccessKeyId'] = ACCESSKEYID; 75 $data['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z"); 76 #专用参数 77 $data['Action'] = 'DescribeDomainRecordInfo'; 78 $data['RecordId'] = RECORDID; #解析记录的ID,此参数在添加解析时会返回,在获取域名解析列表时会返回 79 #签名 80 $data['Signature'] = 排序参数计算签名($data); 81 #请求接口 82 $json = 获取HTTP($api_url . http_build_query($data)); 83 $result = json_decode($json,true); 84 return $result['Value']; 85 86 } 87 88 function 主函数() 89 { 90 #获取现在网络的IP 91 $ip = 获取HTTP(GET_IP_URL); 92 #获取现在域名的解析结果 也就是旧的IP 93 $旧IP = 获取当前的解析记录值(); 94 #对比新旧IP是否一样 95 if(!isset($旧IP) || $旧IP !== $ip) 96 { 97 #请求dns的API重新做解析 98 $api_url = 'https://alidns.aliyuncs.com/?'; 99 $data = []; 100 #公共参数 101 $data['Format'] = 'json'; 102 $data['Version'] = '2015-01-09'; 103 $data['SignatureMethod'] = 'HMAC-SHA1'; 104 $data['SignatureNonce'] = uniqid(); 105 $data['SignatureVersion']= '1.0'; 106 $data['AccessKeyId'] = ACCESSKEYID; 107 $data['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z"); 108 #专用参数 109 $data['Action'] = 'UpdateDomainRecord'; 110 $data['RecordId'] = RECORDID; #解析记录的ID,此参数在添加解析时会返回,在获取域名解析列表时会返回 111 $data['RR'] = RR; #主机记录 112 $data['Type'] = 'A'; 113 $data['Value'] = $ip; 114 $data['TTL'] = 600; 115 #$data['Priority'] = 10; #MX记录的优先级,取值范围[1,10],记录类型为MX记录时,此参数必须 116 $data['Line'] = 'default'; 117 #签名 118 $data['Signature'] = 排序参数计算签名($data); 119 #请求接口 120 $json = 获取HTTP($api_url . http_build_query($data)); 121 $result = json_decode($json); 122 123 #完成以后 124 if(isset($result->RecordId)){ 125 file_put_contents(IP_FILE,$ip); 126 }else{ 127 echo 'error'; 128 var_dump($result); 129 } 130 }else 131 { 132 echo 'IP没有发生变化,不需要修改解析记录'; 133 } 134 } 135 主函数();
用定时任务执行脚本即可