· 6 years ago · Sep 17, 2019, 05:50 AM
1<?php
2
3/**
4 * Класс проверки окончания срока доменного имени и ssl сертификатов
5 */
6class Domain
7{
8 /** @var array Тип запрашиваемой информации */
9 const TYPE = [ "name", "ssl" ];
10
11 /** @var array Тип вывода */
12 const OUTPUT = [ "view" ];
13
14 /** @var string Url api определения окончания срока имени */
15 const NAME = "http://api.whois.vu/?q=%DOMAIN%&clean";
16
17 /** @var array Url определения окончания срока ssl */
18 const SSL = [
19 'url' => "https://www.sslshopper.com/assets/snippets/sslshopper/ajax/ajax_check_ssl.php",
20 'params' => "?hostname=%DOMAIN%&g-recaptcha-response=&rand=240"
21 ];
22
23 /** @var string Тип запрашиваемой информации */
24 private $type = "";
25
26 /** @var string Домен, для которого запрашивается информация */
27 private $domain = "";
28
29 /**
30 * Статически передаём тип запрашиваемой информации для красивого обращения к классу
31 * @param string $name
32 * @param array $arguments
33 * @return Domain
34 */
35 public static function __callStatic(string $name, array $arguments)
36 {
37 if(!in_array($name, self::TYPE)) die("Неверно задан тип запроса\r\n");
38 if(!isset($arguments[0])) die("Не задан домен\r\n");
39 return new Domain($name, $arguments[0]);
40 }
41
42 /**
43 * Конструктор
44 * @param string $type
45 * @param string $domain
46 */
47 public function __construct(string $type, string $domain)
48 {
49 $this->domain = $domain;
50 $this->type = $type;
51 return $this;
52 }
53
54 /**
55 * Вызов методов вывода информации
56 * @param string $name
57 * @param array $arguments
58 */
59 public function __call(string $name, array $arguments)
60 {
61 if(!in_array($name, self::OUTPUT)) die("Неверно задан тип вывода\r\n");
62 if(!$this->type) die("Не задан тип запроса\r\n");
63 $method = "get".ucfirst($this->type)."Expires";
64 $this->$method($name);
65 }
66
67 /**
68 * Курл для имитации пользователя
69 * @param string $url
70 * @param string $method
71 * @param array $data
72 * @param array $headers
73 * @return mixed|string
74 */
75 protected function curl(string $url, string $method, array $data = [], array $headers = [])
76 {
77 // Формирование запроса
78 if($data) $data = json_encode($data);
79 $ch = curl_init();
80 switch($method) {
81 case("POST") : curl_setopt($ch, CURLOPT_POST, 1);
82 if($data) curl_setopt($ch, CURLOPT_POSTFIELDS, $data); break;
83 case("PUT") : curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
84 if($data) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
85 if($data) $headers[] = 'Content-Length: '.strlen($data); break;
86 case("DELETE") : curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
87 if($data) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
88 if($data) $headers[] = 'Content-Length: '.strlen($data); break;
89 default : $url = sprintf("%s?%s", $url, http_build_query($data));
90 }
91 //
92 curl_setopt($ch, CURLOPT_URL, $url);
93 curl_setopt($ch, CURLOPT_TIMEOUT, 30);
94 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
95 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
96 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 29);
97 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
98 $response = curl_exec($ch);
99 curl_close($ch);
100 return $response ?? '';
101 }
102
103 /**
104 * Получение информации об истечении имени домена
105 * @param string $output
106 */
107 public function getNameExpires(string $output)
108 {
109 $info = json_decode(file_get_contents(str_replace("%DOMAIN%", $this->domain, self::NAME)), true);
110 if(json_last_error() !== 0) die("Неверный формат ответа\r\n");
111
112 if(isset($info['expires'])) {
113 $expires = $info['expires'];
114 } elseif(isset($info['whois'])) {
115 preg_match("/Registry.Expiry.Date\:.(.*?)\s/", $info['whois'], $whois);
116 if(isset($whois[1])) $expires = strtotime($whois[1]);
117 }
118
119 if(!isset($expires)) {
120 echo "Информация по домену не получена\r\n";
121 var_dump($info);
122 } else {
123 $expires = date("Y-m-d" , $expires);
124 echo "Domain name expires $expires\r\n";
125 }
126 }
127
128 /**
129 * Получение информации об истечении ssl домена
130 * @param string $output
131 */
132 public function getSslExpires(string $output)
133 {
134 $headers = [ 'Accept: */*', 'X-Requested-With: XMLHttpRequest' ];
135 $url = str_replace("%DOMAIN%", $this->domain, self::SSL['url'].self::SSL['params']);
136 $data = $this->curl($url, "GET", [], $headers);
137 header("Content-Type: text/plain; utf-8");
138 preg_match("/<span.id=\"cert_expiration_days\">(.*?)<\/span>/", $data, $expires);
139 if(isset($expires[1])) echo "SSL expires ".date("Y-m-d", strtotime("+{$expires[1]} day"))."\r\n";
140 }
141}
142
143foreach(["action", "output", "domain"] as $key => $res) {
144 $$res = $_GET[$res] ?? ($argv[ $key+1] ?? null);
145 if(!isset($$res)) die("Не задан параметр \"{$res}\"\r\n");
146}
147
148Domain::$action($domain)->$output();