DNSPod.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace App\Components\DDNS;
  3. use Arr;
  4. use Http;
  5. use Log;
  6. class DNSPod
  7. {
  8. private static $apiHost = 'https://dnsapi.cn/';
  9. private static $subDomain;
  10. public function __construct($subDomain)
  11. {
  12. self::$subDomain = $subDomain;
  13. }
  14. public function store($ip, $type)
  15. {
  16. $domainInfo = $this->analysisDomain();
  17. if ($domainInfo) {
  18. return $this->send('Record.Create', [
  19. 'domain_id' => $domainInfo[2],
  20. 'sub_domain' => $domainInfo[1],
  21. 'record_type' => $type,
  22. 'record_line_id' => 0,
  23. 'value' => $ip,
  24. ]);
  25. }
  26. return false;
  27. }
  28. private function analysisDomain()
  29. {
  30. $domainList = $this->domainList();
  31. if ($domainList) {
  32. foreach ($domainList as $key => $domain) {
  33. if (strpos(self::$subDomain, $domain) !== false) {
  34. return [$domain, rtrim(substr(self::$subDomain, 0, -(strlen($domain))), '.'), $key];
  35. }
  36. }
  37. }
  38. return false;
  39. }
  40. public function domainList()
  41. {
  42. $domainList = $this->send('Domain.List', ['type' => 'mine']);
  43. if ($domainList) {
  44. return Arr::pluck($domainList['domains'], 'name', 'id');
  45. }
  46. return false;
  47. }
  48. private function send($action, $data = [])
  49. {
  50. $public = [
  51. 'login_token' => sysConfig('ddns_key').','.sysConfig('ddns_secret'),
  52. 'format' => 'json',
  53. ];
  54. $parameters = array_merge($data, $public);
  55. $response = Http::timeout(15)->asForm()->post(self::$apiHost.$action, $parameters);
  56. $message = $response->json();
  57. if ($response->failed() || ($message && Arr::has($message, 'status.code') && $message['status']['code'] !== '1')) {
  58. if ($message && Arr::has($message, 'status.code') && $message['status']['code'] !== '1') {
  59. $error = $message['status']['message'];
  60. } else {
  61. $error = $response->body();
  62. }
  63. Log::error('[DNSPod - '.$action.'] 请求失败:'.$error);
  64. return false;
  65. }
  66. return $message;
  67. }
  68. public function update($ip, $type)
  69. {
  70. $recordId = $this->getRecordId($type);
  71. $domainInfo = $this->analysisDomain();
  72. if ($recordId && $domainInfo) {
  73. return $this->send('Record.Modify', [
  74. 'domain_id' => $domainInfo[2],
  75. 'record_id' => $recordId[0],
  76. 'sub_domain' => $domainInfo[1],
  77. 'record_type' => $type,
  78. 'record_line_id' => 0,
  79. 'value' => $ip,
  80. ]);
  81. }
  82. return false;
  83. }
  84. private function getRecordId($type = null)
  85. {
  86. $domainInfo = $this->analysisDomain();
  87. if ($domainInfo) {
  88. $parameters = ['domain_id' => $domainInfo[2], 'sub_domain' => $domainInfo[1]];
  89. if ($type) {
  90. $parameters['record_type'] = $type;
  91. }
  92. $records = $this->send('Record.List', $parameters);
  93. if ($records && Arr::has($records, 'records')) {
  94. return Arr::pluck($records['records'], 'id');
  95. }
  96. }
  97. return false;
  98. }
  99. public function destroy($type)
  100. {
  101. $records = $this->getRecordId($type);
  102. $domainInfo = $this->analysisDomain();
  103. if ($records && $domainInfo) {
  104. $count = 0;
  105. foreach ($records as $record) {
  106. $result = $this->send('Record.Remove', ['domain_id' => $domainInfo[2], 'record_id' => $record]);
  107. if ($result) {
  108. $count++;
  109. }
  110. }
  111. return $count;
  112. }
  113. return false;
  114. }
  115. public function version()
  116. {
  117. $version = $this->send('Info.Version');
  118. if ($version) {
  119. return $version['status']['message'];
  120. }
  121. return false;
  122. }
  123. }