diff --git a/cmdRoute.php b/cmdRoute.php index 4561222..c3dbcc3 100644 --- a/cmdRoute.php +++ b/cmdRoute.php @@ -19,10 +19,10 @@ $cmds = array( // 命令列表 function route($cmd, $rawParam) { // 命令请求路由 switch ($cmd) { case 'ip': - ipInfo($rawParam); + $entry = new ipInfoEntry; break; case 'dc': - tgDC($rawParam); + $entry = new tgDCEntry; break; case 'kms': kmsCheck($rawParam); @@ -37,22 +37,12 @@ function route($cmd, $rawParam) { // 命令请求路由 whoisQuery($rawParam); break; } -} - -function routeCallback($cmd, $rawParam) { // 回调请求路由 - switch ($cmd) { - case 'ip': - ipInfoCallback($rawParam); - break; - case 'kms': - kmsCheckCallback($rawParam); - break; - case 'ntp': - ntpCheckCallback($rawParam); - break; - case 'cfop': - cfopPicCallback($rawParam); - break; + if ($entry) { + if (!$isCallback) { + $entry->query($rawParam); + } else { + $entry->callback($rawParam); + } } } diff --git a/main.php b/main.php index 7ba4cc0..fe750b9 100644 --- a/main.php +++ b/main.php @@ -53,11 +53,7 @@ foreach ($cmds as $cmd) { } if (strlen($rawParam) != 0 && substr($rawParam, 0, 1) !== ' ') { break; } // 命令后必须带空格 $rawParam = trim($rawParam); // 消除前后空格 - if ($isCallback) { - routeCallback($cmd, $rawParam); - } else { - route($cmd, $rawParam); - } + route($cmd, $rawParam); // 路由命令 } } diff --git a/models/ipInfo.php b/models/ipInfo.php index 3f3aca4..655a5fa 100644 --- a/models/ipInfo.php +++ b/models/ipInfo.php @@ -3,11 +3,6 @@ class ipInfo { private $apiPath = 'https://api.343.re/ip/'; - public function isDomain($domain) { // 检测是否为域名 - preg_match('/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/', $domain, $match); - return (count($match) != 0); - } - private function changeCoor($num) { // 转为时分秒格式 $stage_1 = floor($num); $stage_3 = ($num - $stage_1) * 60; @@ -27,6 +22,44 @@ class ipInfo { return $str; } + public function getInfo($ip) { + if (!filter_var($ip, FILTER_VALIDATE_IP)) { // IP地址不合法 + return array( + 'status' => 'error', + 'message' => 'Illegal IP Address' + ); + } + $redis = new redisCache('ip'); + $info = $redis->getData($ip); // 查询缓存数据 + if (!$info) { // 缓存未命中 + $info = json_decode(file_get_contents($this->apiPath . $ip), true); + if ($info['status'] !== 'T') { // 上游接口错误 + return array( + 'status' => 'error', + 'message' => 'Server Error' + ); + } + unset($info['status']); + if ($info['loc'] != NULL) { + $info['locCoor'] = $this->coorFormat($info['loc']); // 转换为经纬度格式 + } + $redis->setData($ip, json_encode($info), 1800); // 缓存30min + } else { // 缓存命中 + $info = json_decode($info, true); // 使用缓存数据 + } + return array( + 'status' => 'ok', + 'data' => json_encode($info) // 返回查询结果 + ); + } +} + +class ipInfoEntry { + private function isDomain($domain) { // 检测是否为域名 + preg_match('/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/', $domain, $match); + return (count($match) != 0); + } + private function dnsResolveIPv4($domain) { // DNS解析A记录 $ipAddr = array(); $rs = dns_get_record(strtolower($domain), DNS_A); @@ -45,7 +78,7 @@ class ipInfo { return $ipAddr; } - public function dnsResolve($domain) { // DNS解析IP记录 + private function dnsResolve($domain) { // DNS解析IP记录 $ipAddr = array(); $ipv4 = $this->dnsResolveIPv4($domain); foreach ($ipv4 as $ip) { @@ -58,18 +91,14 @@ class ipInfo { return $ipAddr; } - public function getInfo($ip) { - if (!filter_var($ip, FILTER_VALIDATE_IP)) { // IP地址不合法 + private function getInfo($ip) { + $content = (new ipInfo)->getInfo($ip); // 发起查询 + if ($content['status'] !== 'ok') { return array( - 'text' => 'Illegal IP Address' - ); - } - $info = json_decode(file_get_contents($this->apiPath . $ip), true); - if ($info['status'] !== 'T') { // 上游接口错误 - return array( - 'text' => 'Server Error' + 'text' => $content['message'] // 返回错误信息 ); } + $info = json_decode($content['data'], true); $msg = 'IP: ' . $info['ip'] . '' . PHP_EOL; if ($info['as'] != NULL) { $msg .= 'AS: '; @@ -78,7 +107,7 @@ class ipInfo { if ($info['loc'] != NULL) { $msg .= 'Location: '; - $msg .= $this->coorFormat($info['loc']) . '' . PHP_EOL; + $msg .= $info['locCoor'] . '' . PHP_EOL; } if ($info['city'] != NULL) { $msg .= 'City: ' . $info['city'] . PHP_EOL; } if ($info['region'] != NULL) { $msg .= 'Region: ' . $info['region'] . PHP_EOL; } @@ -99,31 +128,32 @@ class ipInfo { )) ); } -} -function ipInfo($rawParam) { // IP查询入口 - global $chatId; - if ($rawParam == '' || $rawParam === 'help') { // 显示使用说明 - sendMessage($chatId, array( - 'parse_mode' => 'Markdown', - 'text' => '*Usage:* `/ip IPv4/IPv6/Domain`', - 'reply_markup' => json_encode(array( // 显示echoIP按钮 - 'inline_keyboard' => array([[ - 'text' => 'Get my IP address', - 'url' => 'https://ip.dnomd343.top/' - ]]) - )) - )); - return; - } - if (filter_var($rawParam, FILTER_VALIDATE_IP)) { // 参数为IP地址 - sendMessage($chatId, (new ipInfo)->getInfo($rawParam)); - return; - } - if ((new ipInfo)->isDomain($rawParam)) { - $ips = (new ipInfo)->dnsResolve($rawParam); + public function query($rawParam) { // ipInfo查询入口 + if ($rawParam == '' || $rawParam === 'help') { // 显示使用说明 + tgApi::sendMessage(array( + 'parse_mode' => 'Markdown', + 'text' => '*Usage:* `/ip IPv4/IPv6/Domain`', + 'reply_markup' => json_encode(array( // 显示echoIP按钮 + 'inline_keyboard' => array([[ + 'text' => 'Get my IP address', + 'url' => 'https://ip.dnomd343.top/' + ]]) + )) + )); + return; + } + if (filter_var($rawParam, FILTER_VALIDATE_IP)) { // 参数为IP地址 + tgApi::sendMessage($this->getInfo($rawParam)); // 发起查询 + return; + } + if (!$this->isDomain($rawParam)) { + tgApi::sendText('Illegal Request'); // 非法请求 + return; + } + $ips = $this->dnsResolve($rawParam); if (count($ips) == 0) { // 解析不到IP记录 - sendMessage($chatId, array( + tgApi::sendMessage($chatId, array( 'parse_mode' => 'Markdown', 'text' => 'Nothing found of `' . $rawParam . '`' )); @@ -141,7 +171,7 @@ function ipInfo($rawParam) { // IP查询入口 'callback_data' => '/ip ' . $rawParam ]); } - sendMessage($chatId, array( + tgApi::sendMessage(array( 'parse_mode' => 'Markdown', 'text' => 'DNS resolve of `' . $rawParam . '`', 'reply_markup' => json_encode(array( // 显示IP列表按钮 @@ -149,17 +179,15 @@ function ipInfo($rawParam) { // IP查询入口 )) )); } -} -function ipInfoCallback($rawParam) { // IP查询回调入口 - global $chatId; - $content = explode(',', $rawParam); - if (filter_var($rawParam, FILTER_VALIDATE_IP)) { // 参数为IP地址 - ipInfo($rawParam); - } else { // 参数为域名 - $ips = (new ipInfo)->dnsResolve($rawParam); - foreach ($ips as $ip) { - ipInfo($ip); // 逐个输出 + public function callback($rawParam) { // ipInfo回调入口 + if (filter_var($rawParam, FILTER_VALIDATE_IP)) { // 参数为IP地址 + $this->query($rawParam); + } else { // 参数为域名 + $ips = $this->dnsResolve($rawParam); + foreach ($ips as $ip) { + $this->query($ip); // 逐个输出 + } } } } diff --git a/models/tgDC.php b/models/tgDC.php index 2556817..0431c67 100644 --- a/models/tgDC.php +++ b/models/tgDC.php @@ -175,8 +175,4 @@ class tgDCEntry { } } -function tgDC($rawParam) { // DC查询入口 - (new tgDCEntry)->query($rawParam); -} - ?>