txydns.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. date_default_timezone_set("GMT");
  3. /*
  4. $obj = new TxyDns(txyaccessKeyId, APPKEY, APPTOKEN);
  5. //显示所有域名
  6. $data = $obj->DomainList();
  7. if ($data["code"]!=0) {
  8. echo $data["message"] . "\n";
  9. }
  10. //可以增加同名的二条
  11. $data = $obj->RecordCreate("www3","TXT",rand(10,1000));
  12. $data = $obj->RecordCreate("www3","TXT",rand(10,1000));
  13. $data = $obj->RecordCreate("www3.www3","TXT",rand(10,1000));
  14. if ($data["code"]!=0) {
  15. echo $data["message"] . "\n";
  16. }
  17. //查看一个主机的所有txt 记录
  18. $data = $obj->RecordList("www3.www3","TXT");
  19. $data = $obj->RecordList("www3","TXT");
  20. $records = $data["data"]["records"];
  21. foreach ($records as $k=>$v) {
  22. //根据ID修改记录
  23. $data = $obj->RecordModify("www3", "TXT", rand(1000,2000), $v["id"]);
  24. //根据ID删除记录
  25. $obj->RecordDelete($v["id"]);
  26. }
  27. */
  28. ###### 代码运行
  29. //php txydns.php add "www.yudadan.com" "k1" "v1" AKIDwlPr7DUpLgpZBb4tlT0MWUHtIVXOJwxm mMkxzoTxOirrfJlFYfbS7g7792jEi5GG
  30. # 第一个参数是 action,代表 (add/clean)
  31. # 第二个参数是域名
  32. # 第三个参数是主机名(第三个参数+第二个参数组合起来就是要添加的 TXT 记录)
  33. # 第四个参数是 TXT 记录值
  34. # 第五个参数是 APPKEY
  35. # 第六个参数是 APPTOKEN
  36. echo "域名 API 调用开始\n";
  37. if (count($argv) < 7) {
  38. echo "参数有误\n";
  39. exit;
  40. }
  41. echo $argv[1] . "-" . $argv[2] . "-" . $argv[3] . "-" . $argv[4] . "-" . $argv[5] . "-" . $argv[6] . "\n";
  42. $domainarray = TxyDns::getDomain($argv[2]);
  43. $selfdomain = ($domainarray[0] == "") ? $argv[3] : $argv[3] . "." . $domainarray[0];
  44. $obj = new TxyDns($argv[5], $argv[6], $domainarray[1]);
  45. switch ($argv[1]) {
  46. case "clean":
  47. $data = $obj->RecordList($selfdomain, "TXT");
  48. if ($data["code"] != 0) {
  49. echo "txy dns 记录获取失败-" . $data["message"] . "\n";
  50. exit;
  51. }
  52. $records = $data["data"]["records"];
  53. foreach ($records as $k => $v) {
  54. $data = $obj->RecordDelete($v["id"]);
  55. if ($data["code"] != 0) {
  56. echo "txy dns 记录删除失败-" . $data["message"] . "\n";
  57. exit;
  58. }
  59. }
  60. break;
  61. case "add":
  62. $data = $obj->RecordCreate($selfdomain, "TXT", $argv[4]);
  63. if ($data["code"] != 0) {
  64. echo "txy dns 记录添加失败-" . $data["message"] . "\n";
  65. exit;
  66. }
  67. break;
  68. }
  69. echo "域名 API 调用成功结束\n";
  70. ####### 基于腾讯云 DNS API 实现的 PHP 类,参考 https://cloud.tencent.com/document/product/302/4032
  71. class TxyDns {
  72. private $accessKeyId = null;
  73. private $accessSecrec = null;
  74. private $DomainName = null;
  75. private $Host = "cns.api.qcloud.com";
  76. private $Path = "/v2/index.php";
  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. // 【http://www.seobythesea.com/2006/01/googles-most-popular-and-least-popular-top-level-domains/】
  88. $arr[] = ".uk";
  89. $arr[] = ".hk";
  90. $arr[] = ".net";
  91. $arr[] = ".com";
  92. $arr[] = ".edu";
  93. $arr[] = ".mil";
  94. $arr[] = ".com.cn";
  95. $arr[] = ".org";
  96. $arr[] = ".cn";
  97. $arr[] = ".gov";
  98. $arr[] = ".net.cn";
  99. $arr[] = ".io";
  100. $arr[] = ".co.jp";
  101. $arr[] = ".com.tw";
  102. $arr[] = ".info";
  103. $arr[] = ".io";
  104. $arr[] = ".top";
  105. $arr[] = ".me";
  106. $arr[] = ".int";
  107. $arr[] = ".edu";
  108. //二级域名
  109. $seconddomain = "";
  110. //子域名
  111. $selfdomain = "";
  112. //根域名
  113. $rootdomain = "";
  114. foreach ($arr as $k => $v) {
  115. $pos = stripos($domain, $v);
  116. if ($pos) {
  117. $rootdomain = substr($domain, $pos);
  118. $s = explode(".", substr($domain, 0, $pos));
  119. $seconddomain = $s[count($s) - 1] . $rootdomain;
  120. for ($i = 0; $i < count($s) - 1; $i++)
  121. $selfdomain .= $s[$i];
  122. break;
  123. }
  124. }
  125. //echo $seconddomain ;exit;
  126. if ($rootdomain == "") {
  127. $seconddomain = $domain;
  128. $selfdomain = "";
  129. }
  130. return array($selfdomain, $seconddomain);
  131. }
  132. public function error($code, $str) {
  133. echo "操作错误:" . $code . ":" . $str;
  134. exit;
  135. }
  136. public function RecordDelete($recordId) {
  137. $param["domain"] = $this->DomainName;
  138. $param["recordId"] = $recordId;
  139. $data = $this->send("RecordDelete", "GET", $param);
  140. return ($this->out($data));
  141. }
  142. public function RecordList($subDomain, $recordType = "") {
  143. if ($recordType != "")
  144. $param["recordType"] = $recordType;
  145. $param["subDomain"] = $subDomain;
  146. $param["domain"] = $this->DomainName;
  147. $data = $this->send("RecordList", "GET", $param);
  148. return ($this->out($data));
  149. }
  150. public function RecordModify($subDomain, $recordType = "TXT", $value, $recordId) {
  151. $param["recordType"] = $recordType;
  152. $param["subDomain"] = $subDomain;
  153. $param["recordId"] = $recordId;
  154. $param["domain"] = $this->DomainName;
  155. $param["recordLine"] = "默认";
  156. $param["value"] = $value;
  157. $data = $this->send("RecordModify", "GET", $param);
  158. return ($this->out($data));
  159. }
  160. public function RecordCreate($subDomain, $recordType = "TXT", $value) {
  161. $param["recordType"] = $recordType;
  162. $param["subDomain"] = $subDomain;
  163. $param["domain"] = $this->DomainName;
  164. $param["recordLine"] = "默认";
  165. $param["value"] = $value;
  166. $data = $this->send("RecordCreate", "GET", $param);
  167. return ($this->out($data));
  168. }
  169. public function DomainList() {
  170. $data = $this->send("DomainList", "GET", array());
  171. return ($this->out($data));
  172. }
  173. private function send($action, $reqMethod, $requestParams) {
  174. $params = $this->formatRequestData($action, $requestParams, $reqMethod);
  175. $uri = http_build_query($params);
  176. $url = "https://" . $this->Host . "" . $this->Path . "?" . $uri;
  177. return $this->curl($url);
  178. }
  179. private function formatRequestData($action, $request, $reqMethod) {
  180. $param = $request;
  181. $param["Action"] = ucfirst($action);
  182. //$param["RequestClient"] = $this->sdkVersion;
  183. $param["Nonce"] = rand();
  184. $param["Timestamp"] = time();
  185. //$param["Version"] = $this->apiVersion;
  186. $param["SecretId"] = $this->accessKeyId;
  187. $signStr = $this->formatSignString($this->Host, $this->Path, $param, $reqMethod);
  188. $param["Signature"] = $this->sign($signStr);
  189. return $param;
  190. }
  191. //签名
  192. private function formatSignString($host, $path, $param, $requestMethod) {
  193. $tmpParam = array();
  194. ksort($param);
  195. foreach ($param as $key => $value) {
  196. array_push($tmpParam, str_replace("_", ".", $key) . "=" . $value);
  197. }
  198. $strParam = join("&", $tmpParam);
  199. $signStr = strtoupper($requestMethod) . $host . $path . "?" . $strParam;
  200. return $signStr;
  201. }
  202. private function sign($signStr) {
  203. $signature = base64_encode(hash_hmac("sha1", $signStr, $this->accessSecrec, true));
  204. return $signature;
  205. }
  206. private function curl($url) {
  207. $ch = curl_init();
  208. curl_setopt($ch, CURLOPT_URL, $url);
  209. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  210. $result = curl_exec($ch);
  211. curl_close($ch);
  212. return $result;
  213. }
  214. private function out($msg) {
  215. return json_decode($msg, true);
  216. }
  217. }