From 02fe8212c8fe7e188728b5c7e47923db14203a58 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Tue, 10 Aug 2021 18:08:43 +0800 Subject: [PATCH] feat: ip detail of ipv4, ipv6 or domain --- cmdRoute.php | 8 +++ models/ipInfo.php | 167 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 models/ipInfo.php diff --git a/cmdRoute.php b/cmdRoute.php index 5454635..c494e1a 100644 --- a/cmdRoute.php +++ b/cmdRoute.php @@ -1,10 +1,12 @@ changeCoor(abs($lat)); + $str .= ($lat < 0) ? 'S' : 'N'; + $lon = number_format(trim(explode(',', $rawStr)[1]), 8); // 经度 + $str .= ', ' . $this->changeCoor(abs($lon)); + $str .= ($lon < 0) ? 'W' : 'E'; + $str .= ')'; + return $str; + } + + private function dnsResolveIPv4($domain) { // DNS解析A记录 + $ipAddr = array(); + $rs = dns_get_record(strtolower($domain), DNS_A); + foreach ($rs as $record) { + $ipAddr[] = $record['ip']; + } + return $ipAddr; + } + + private function dnsResolveIPv6($domain) { // DNS解析AAAA记录 + $ipAddr = array(); + $rs = dns_get_record(strtolower($domain), DNS_AAAA); + foreach ($rs as $record) { + $ipAddr[] = $record['ipv6']; + } + return $ipAddr; + } + + public function dnsResolve($domain) { // DNS解析IP记录 + $ipAddr = array(); + $ipv4 = $this->dnsResolveIPv4($domain); + foreach ($ipv4 as $ip) { + $ipAddr[] = $ip; + } + $ipv6 = $this->dnsResolveIPv6($domain); + foreach ($ipv6 as $ip) { + $ipAddr[] = $ip; + } + return $ipAddr; + } + + public function getInfo($ip) { + if (!filter_var($ip, FILTER_VALIDATE_IP)) { // IP地址不合法 + 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' + ); + } + $msg = 'IP: ' . $info['ip'] . '' . PHP_EOL; + if ($info['as'] != NULL) { + $msg .= 'AS: '; + $msg .= $info['as'] . '' . PHP_EOL; + } + if ($info['loc'] != NULL) { + $msg .= 'Location: '; + $msg .= $this->coorFormat($info['loc']) . '' . PHP_EOL; + } + if ($info['city'] != NULL) { $msg .= 'City: ' . $info['city'] . PHP_EOL; } + if ($info['region'] != NULL) { $msg .= 'Region: ' . $info['region'] . PHP_EOL; } + if ($info['country'] != NULL) { $msg .= 'Country: ' . $info['country'] . PHP_EOL; } + if ($info['timezone'] != NULL) { $msg .= 'Timezone: ' . $info['timezone'] . PHP_EOL; } + if ($info['isp'] != NULL) { $msg .= 'ISP: ' . $info['isp'] . PHP_EOL; } + if ($info['scope'] != NULL) { $msg .= 'Scope: ' . $info['scope'] . '' . PHP_EOL; } + if ($info['detail'] != NULL) { $msg .= 'Detail: ' . $info['detail'] . PHP_EOL; } + return array( + 'parse_mode' => 'HTML', // HTML格式输出 + 'disable_web_page_preview' => 'true', // 不显示页面预览 + 'text' => $msg, + 'reply_markup' => json_encode(array( // 显示按钮 + 'inline_keyboard' => array([[ + 'text' => 'View on echoIP', + 'url' => 'https://ip.dnomd343.top/?ip=' . $ip + ]]) + )) + ); + } +} + +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); + if (count($ips) == 0) { // 解析不到IP记录 + sendMessage($chatId, array( + 'parse_mode' => 'Markdown', + 'text' => 'Nothing found of `' . $rawParam . '`' + )); + return; + } + foreach ($ips as $ip) { + $buttons[] = array([ // 生成按钮列表 + 'text' => $ip, + 'callback_data' => '/ip ' . $ip + ]); + } + if (count($ips) >= 2) { + $buttons[] = array([ // 两个及以上的IP 添加显示全部的按钮 + 'text' => 'Get all detail', + 'callback_data' => '/ip ' . $rawParam + ]); + } + sendMessage($chatId, array( + 'parse_mode' => 'Markdown', + 'text' => 'DNS resolve of `' . $rawParam . '`', + 'reply_markup' => json_encode(array( // 显示IP列表按钮 + 'inline_keyboard' => $buttons + )) + )); + } +} + +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); // 逐个输出 + } + } +} + +?> \ No newline at end of file