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 主函数();
用定时任务执行脚本即可