alydns.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. date_default_timezone_set("GMT");
  3. /*
  4. //$obj = new AliDns(accessKeyId, accessSecrec, "newyingyong.cn");
  5. //显示所有
  6. //$data = $obj->DescribeDomainRecords();
  7. //增加解析
  8. //$data= $obj->AddDomainRecord("TXT", "test", "test");
  9. //修改解析
  10. //$data = $obj->UpdateDomainRecord("3965724468724736","TXT", "test", "test2");
  11. //删除解析
  12. //$data = $obj->DescribeDomainRecords();
  13. //$data = $data["DomainRecords"]["Record"];
  14. //if (is_array($data)) {
  15. //foreach ($data as $v) {
  16. //if ($v["RR"] == "test") {
  17. //$obj->DeleteDomainRecord($v["RecordId"]);
  18. //}
  19. //}
  20. //}
  21. */
  22. /*
  23. example:
  24. php alydns.php "simplehttps.com" "dnsv" "dnsk" APPKEY APPTOKEN
  25. */
  26. ########## 配合 cerbot 运行
  27. # 第一个参数是 action,代表 (add/clean)
  28. # 第二个参数是域名
  29. # 第三个参数是主机名(第三个参数+第二个参数组合起来就是要添加的 TXT 记录)
  30. # 第四个参数是 TXT 记录值
  31. # 第五个参数是 APPKEY
  32. # 第六个参数是 APPTOKEN
  33. echo "域名 API 调用开始\n" ;
  34. echo $argv[1] . "-" . $argv[2] . "-" . $argv[3] . "-" . $argv[5] . "-" . $argv[5] . "-" . $argv[6] . "\n";
  35. $domainarray = AliDns::getDomain($argv[2]);
  36. $selfdomain = ($domainarray[0]=="")?$argv[3]:$argv[3] . "." . $domainarray[0];
  37. $obj = new AliDns($argv[5], $argv[6], $domainarray[1]);
  38. switch ($argv[1]) {
  39. case "clean":
  40. $data = $obj->DescribeDomainRecords();
  41. $data = $data["DomainRecords"]["Record"];
  42. if (is_array($data)) {
  43. foreach ($data as $v) {
  44. if ($v["RR"] == $selfdomain) {
  45. $res = $obj->DeleteDomainRecord($v["RecordId"]);
  46. }
  47. }
  48. }
  49. break;
  50. case "add":
  51. $res = $obj->AddDomainRecord("TXT", $selfdomain,$argv[3]);
  52. break;
  53. }
  54. echo "域名 API 调用结束\n" ;
  55. ############ Class 定义
  56. class AliDns {
  57. private $accessKeyId = null;
  58. private $accessSecrec = null;
  59. private $DomainName = null;
  60. public function __construct($accessKeyId, $accessSecrec, $domain) {
  61. $this->accessKeyId = $accessKeyId;
  62. $this->accessSecrec = $accessSecrec;
  63. $this->DomainName = $domain;
  64. }
  65. /*
  66. 根据域名返回主机名和二级域名
  67. */
  68. public static function getDomain($domain) {
  69. //https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
  70. //常见根域名
  71. $arr[]=".co.jp";
  72. $arr[]=".com.tw";
  73. $arr[]=".net";
  74. $arr[]=".com";
  75. $arr[]=".com.cn";
  76. $arr[]=".org";
  77. $arr[]=".cn";
  78. $arr[]=".gov";
  79. $arr[]=".net.cn";
  80. $arr[]=".io";
  81. $arr[]=".top";
  82. $arr[]=".me";
  83. $arr[]=".int";
  84. $arr[]=".edu";
  85. $arr[]=".link";
  86. $arr[]=".uk";
  87. $arr[]=".hk";
  88. //二级域名
  89. $seconddomain ="";
  90. //子域名
  91. $selfdomain = "";
  92. //根域名
  93. $rootdomain = "";
  94. foreach ($arr as $k=>$v) {
  95. $pos = stripos($domain,$v);
  96. if ($pos) {
  97. $rootdomain = substr($domain,$pos);
  98. $s = explode(".",substr($domain,0,$pos));
  99. $seconddomain = $s[count($s)-1] . $rootdomain;
  100. for ($i=0;$i<count($s)-1;$i++)
  101. $selfdomain .= $s[$i];
  102. break;
  103. }
  104. }
  105. //echo $seconddomain ;exit;
  106. if ($rootdomain=="") {
  107. $seconddomain = $domain;
  108. $selfdomain = "";
  109. }
  110. return array($selfdomain,$seconddomain);
  111. }
  112. public function DescribeDomainRecords() {
  113. $requestParams = array(
  114. "Action" => "DescribeDomainRecords"
  115. );
  116. $val = $this->send($requestParams);
  117. return $this->out($val);
  118. }
  119. public function UpdateDomainRecord($id, $type, $rr,$value){
  120. $requestParams = array(
  121. "Action" => "UpdateDomainRecord",
  122. "RecordId" => $id,
  123. "RR" => $rr,
  124. "Type" => $type,
  125. "Value" => $value,
  126. );
  127. $val = $this->send($requestParams);
  128. return $this->out($val);
  129. }
  130. public function DeleteDomainRecord($id) {
  131. $requestParams = array(
  132. "Action" => "DeleteDomainRecord",
  133. "RecordId" => $id,
  134. );
  135. $val = $this->send($requestParams);
  136. return $this->out($val);
  137. }
  138. public function AddDomainRecord($type, $rr, $value) {
  139. $requestParams = array(
  140. "Action" => "AddDomainRecord",
  141. "RR" => $rr,
  142. "Type" => $type,
  143. "Value" => $value,
  144. );
  145. $val = $this->send($requestParams);
  146. return $this->out($val);
  147. }
  148. private function send($requestParams) {
  149. $publicParams = array(
  150. "DomainName" => $this->DomainName,
  151. "Format" => "JSON",
  152. "Version" => "2015-01-09",
  153. "AccessKeyId" => $this->accessKeyId,
  154. "Timestamp" => date("Y-m-d\TH:i:s\Z"),
  155. "SignatureMethod" => "HMAC-SHA1",
  156. "SignatureVersion" => "1.0",
  157. "SignatureNonce" => substr(md5(rand(1, 99999999)), rand(1, 9), 14),
  158. );
  159. $params = array_merge($publicParams, $requestParams);
  160. $params['Signature'] = $this->sign($params, $this->accessSecrec);
  161. $uri = http_build_query($params);
  162. $url = 'http://alidns.aliyuncs.com/?'.$uri;
  163. return $this->curl($url);
  164. }
  165. private function sign($params, $accessSecrec, $method = "GET") {
  166. ksort($params);
  167. $stringToSign = strtoupper($method).'&'.$this->percentEncode('/').'&';
  168. $tmp = "";
  169. foreach($params as $key => $val){
  170. $tmp .= '&'.$this->percentEncode($key).'='.$this->percentEncode($val);
  171. }
  172. $tmp = trim($tmp, '&');
  173. $stringToSign = $stringToSign.$this->percentEncode($tmp);
  174. $key = $accessSecrec.'&';
  175. $hmac = hash_hmac("sha1", $stringToSign, $key, true);
  176. return base64_encode($hmac);
  177. }
  178. private function percentEncode($value = null){
  179. $en = urlencode($value);
  180. $en = str_replace("+", "%20", $en);
  181. $en = str_replace("*", "%2A", $en);
  182. $en = str_replace("%7E", "~", $en);
  183. return $en;
  184. }
  185. private function curl($url) {
  186. $ch = curl_init();
  187. curl_setopt($ch, CURLOPT_URL, $url );
  188. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
  189. $result = curl_exec ($ch);
  190. curl_close($ch);
  191. return $result;
  192. }
  193. private function out($msg) {
  194. return json_decode($msg, true);
  195. }
  196. }