alydns.php 7.3 KB

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