天天看點

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&params={}&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 主函數();      

用定時任務執行腳本即可