From 56fbaf08f097ec62c0f7b4a2f89241828243a46e Mon Sep 17 00:00:00 2001 From: muzihuaner Date: Wed, 18 Mar 2026 13:27:52 +0800 Subject: [PATCH] fix --- api/icp/index.php | 334 ++++++++++++++++++++++------------------------ 1 file changed, 157 insertions(+), 177 deletions(-) diff --git a/api/icp/index.php b/api/icp/index.php index 3130b49..9cf5ffa 100644 --- a/api/icp/index.php +++ b/api/icp/index.php @@ -84,69 +84,40 @@ function queryICP($domain) { ]; try { - // 方法1: 使用API Vat接口(返回JSON格式) - $apiurl = "https://api.vat.tools/query?domain=" . urlencode($domain); + // 方法1: 使用互联网档案馆API + $apiurl = "https://www.api.vat.tools/query?domain=" . urlencode($domain); $data = callApi($apiurl); - if ($data && isset($data['icp'])) { - $result['status'] = 'success'; - $result['code'] = 200; - $result['message'] = '查询成功'; - $result['data'] = [ - 'domain' => $domain, - 'icp' => $data['icp'] ?? 'N/A', - 'owner' => $data['organizer'] ?? $data['owner'] ?? 'N/A', - 'siteName' => $data['website_name'] ?? $data['name'] ?? 'N/A', - 'checkDate' => $data['check_date'] ?? $data['approve_date'] ?? 'N/A', - 'siteNature' => $data['site_nature'] ?? 'N/A', - 'source' => 'api.vat.tools' - ]; - return $result; + if ($data && is_array($data) && !empty($data)) { + if (isset($data['icp']) && $data['icp'] != 'N/A') { + $result['status'] = 'success'; + $result['code'] = 200; + $result['message'] = '查询成功'; + $result['data'] = [ + 'domain' => $domain, + 'icp' => $data['icp'] ?? 'N/A', + 'owner' => $data['organizer'] ?? $data['owner'] ?? 'N/A', + 'siteName' => $data['website_name'] ?? $data['name'] ?? 'N/A', + 'checkDate' => $data['check_date'] ?? $data['approve_date'] ?? 'N/A', + 'siteNature' => $data['site_nature'] ?? 'N/A', + 'source' => 'vat.tools' + ]; + return $result; + } } - // 方法2: 使用天聪API - $apiurl2 = "https://api.tiancong.info/api/queryIcp?domain=" . urlencode($domain); - $data2 = callApi($apiurl2); - if ($data2 && isset($data2['code']) && $data2['code'] == 0 && isset($data2['data'])) { - $icpData = $data2['data']; - $result['status'] = 'success'; - $result['code'] = 200; - $result['message'] = '查询成功'; - $result['data'] = [ - 'domain' => $domain, - 'icp' => $icpData['icp'] ?? 'N/A', - 'owner' => $icpData['unitname'] ?? 'N/A', - 'siteName' => $icpData['sitename'] ?? 'N/A', - 'checkDate' => $icpData['checkdate'] ?? 'N/A', - 'siteNature' => $icpData['sitenature'] ?? 'N/A', - 'source' => 'tiancong.info' - ]; - return $result; - } - - // 方法3: 使用免费ICP API - $apiurl3 = "https://ijscode.top/api/icp.php?url=" . urlencode($domain); + // 方法2: 使用ICP查询-接口-通用API + $apiurl2 = "https://api.search.naver.com/search.naver?query=" . urlencode($domain) . "&where=web"; + + // 方法2b: 使用工信部接口 + $apiurl2b = "https://beian.miit.gov.cn/"; + + // 方法3: 使用免费的ICP API - API1 + $apiurl3 = "https://api.allorigins.win/get?url=" . urlencode("https://icp.aizhan.com/index.php?domain=" . urlencode($domain)); $data3 = callApi($apiurl3); - if ($data3 && isset($data3['icp'])) { - $result['status'] = 'success'; - $result['code'] = 200; - $result['message'] = '查询成功'; - $result['data'] = [ - 'domain' => $domain, - 'icp' => $data3['icp'] ?? 'N/A', - 'owner' => $data3['belong'] ?? 'N/A', - 'siteName' => $data3['name'] ?? 'N/A', - 'checkDate' => $data3['time'] ?? 'N/A', - 'source' => 'ijscode' - ]; - return $result; - } - - // 方法4: 使用aizhan.com (改进的HTML解析) - $apiurl4 = "https://icp.aizhan.com/index.php?domain=" . urlencode($domain); - $htmlData = callApi($apiurl4, false); - if ($htmlData) { - $parsedData = parseICPData($htmlData, $domain); - if ($parsedData) { + if ($data3 && isset($data3['contents'])) { + $htmlData = $data3['contents']; + $parsedData = parseICPFromHTML($htmlData, $domain); + if ($parsedData && (!isset($parsedData['icp']) || $parsedData['icp'] !== 'N/A')) { $result['status'] = 'success'; $result['code'] = 200; $result['message'] = '查询成功'; @@ -155,24 +126,84 @@ function queryICP($domain) { } } - // 方法5: 备用API - ICP查询 - $backupUrl = "https://www.beianx.com/search/?q=" . urlencode($domain); - $htmlResponse = callApi($backupUrl, false); - if ($htmlResponse) { - $backupData = parseBeianxData($htmlResponse, $domain); - if ($backupData) { + // 方法4: 使用爱站网缓存结果 + $apiurl4 = "https://tools.zhuaxia.com/icp?domain=" . urlencode($domain); + $data4 = callApi($apiurl4); + if ($data4 && is_array($data4) && isset($data4['data'])) { + $icpData = $data4['data']; + $parsedIcp = isset($icpData['icp']) && !empty($icpData['icp']) ? $icpData['icp'] : 'N/A'; + if ($parsedIcp !== 'N/A') { $result['status'] = 'success'; $result['code'] = 200; $result['message'] = '查询成功'; - $result['data'] = $backupData; + $result['data'] = [ + 'domain' => $domain, + 'icp' => $parsedIcp, + 'owner' => $icpData['unitname'] ?? $icpData['owner'] ?? 'N/A', + 'siteName' => $icpData['sitename'] ?? $icpData['name'] ?? 'N/A', + 'checkDate' => $icpData['checkdate'] ?? $icpData['time'] ?? 'N/A', + 'source' => 'zhuaxia' + ]; return $result; } } + // 方法5: 使用网格API + $apiurl5 = "https://www.chaxun.15600.net/service.php?domain=" . urlencode($domain); + $data5 = callApi($apiurl5, true); + if ($data5) { + $icpNum = ''; + if (isset($data5['ICP']) && !empty($data5['ICP'])) { + $icpNum = $data5['ICP']; + } elseif (isset($data5['icp']) && !empty($data5['icp'])) { + $icpNum = $data5['icp']; + } + + if (!empty($icpNum)) { + $result['status'] = 'success'; + $result['code'] = 200; + $result['message'] = '查询成功'; + $result['data'] = [ + 'domain' => $domain, + 'icp' => $icpNum, + 'owner' => $data5['company'] ?? $data5['owner'] ?? 'N/A', + 'siteName' => $data5['websitename'] ?? $data5['name'] ?? 'N/A', + 'checkDate' => $data5['checkTime'] ?? 'N/A', + 'source' => 'chaxun' + ]; + return $result; + } + } + + // 方法6: 爱站网直接查询 + $apiurl6 = "http://icp.aizhan.com/index.php?domain=" . urlencode($domain); + $htmlData = callApi($apiurl6, false); + if ($htmlData && strlen($htmlData) > 100) { + // 尝试提取ICP信息 + $icpMatch = []; + if (preg_match('/[\d\u4e00-\u9fa5]+-ICP-\d+/u', $htmlData, $icpMatch)) { + // 如果能直接提取ICP号则成功 + if (!empty($icpMatch[0]) && strpos($icpMatch[0], 'ICP') !== false) { + $result['status'] = 'success'; + $result['code'] = 200; + $result['message'] = '查询成功'; + $result['data'] = [ + 'domain' => $domain, + 'icp' => $icpMatch[0], + 'owner' => extractFromHTML($htmlData, '主办单位'), + 'siteName' => extractFromHTML($htmlData, '网站名称'), + 'checkDate' => extractFromHTML($htmlData, '审核时间'), + 'source' => 'aizhan-cache' + ]; + return $result; + } + } + } + // 如果都失败,返回默认的未备案状态 $result['status'] = 'not_found'; $result['code'] = 404; - $result['message'] = '未找到ICP备案信息(该域名可能未在中国备案或各查询源暂时不可用)'; + $result['message'] = '未找到ICP备案信息(该域名可能未在中国备案或查询源暂时不可用)'; } catch (Exception $e) { $result['message'] = '查询异常: ' . $e->getMessage(); @@ -181,6 +212,9 @@ function queryICP($domain) { return $result; } + return $result; +} + /** * 通用HTTP调用函数 */ @@ -196,10 +230,15 @@ function callApi($url, $isJson = true) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); + curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding: gzip, deflate', + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $curlError = curl_error($ch); curl_close($ch); if ($httpCode !== 200 || empty($response)) { @@ -217,140 +256,81 @@ function callApi($url, $isJson = true) { } /** - * 解析aizhan.com返回的ICP数据 + * 从HTML中提取指定字段的值 */ -function parseICPData($html, $domain) { - // 移除脚本和样式 +function extractFromHTML($html, $label) { + $patterns = [ + '/' . preg_quote($label) . '[^>]*>([^<]+)<', + '/]*>' . preg_quote($label) . '<\/th>\s*]*>([^<]+)<\/td>/', + '/]*>' . preg_quote($label) . '<\/td>\s*]*>([^<]+)<\/td>/', + ]; + + foreach ($patterns as $pattern) { + if (preg_match($pattern, $html, $matches)) { + return trim(strip_tags($matches[1])); + } + } + return 'N/A'; +} + +/** + * 改进的ICP HTML解析函数 + */ +function parseICPFromHTML($html, $domain) { $html = preg_replace('/)<[^<]*)*<\/script>/i', '', $html); $html = preg_replace('/)<[^<]*)*<\/style>/i', '', $html); - // 提取ICP编号 - 多种格式支持 + // 提取ICP编号 $icpPatterns = [ - '/[\d\u4e00-\u9fa5]+-ICP-\d{8}/iu', // 原格式 - '/ICP[\u4e00-\u9fa5]?\d{8,}/iu', // 新格式 - '/[\d]{8}\|[\d]{8}/u', // 竖线格式 + '/[\d\u4e00-\u9fa5]+-ICP-\d{8,}/u', + '/ICP[\u4e00-\u9fa5]?\d{8,}/u', + '/ICP\d{8,}/u', ]; - $icp = ''; + $icp = 'N/A'; foreach ($icpPatterns as $pattern) { if (preg_match($pattern, $html, $matches)) { - $icp = $matches[0]; + $icp = trim($matches[0]); break; } } - // 提取主办单位 - 多种选择器 - $ownerPatterns = [ - '/>([^<]*?单位[^<]*?)]*>([^<]+)]*>([^<]*?单位[^<]*?)<\/td>/i', + // 如果没有找到有效的ICP,返回null + if ($icp === 'N/A' || empty($icp)) { + return null; + } + + $owner = extractFromHTML($html, '主办单位'); + $siteName = extractFromHTML($html, '网站名称'); + $checkDate = extractFromHTML($html, '审核时间'); + + return [ + 'domain' => $domain, + 'icp' => $icp, + 'owner' => $owner, + 'siteName' => $siteName, + 'checkDate' => $checkDate, + 'source' => 'html-parse' ]; - $owner = ''; - foreach ($ownerPatterns as $pattern) { - if (preg_match($pattern, $html, $matches)) { - $owner = trim(strip_tags($matches[1])); - if (!empty($owner)) break; - } - } +} - // 提取网站名称 - $siteNamePatterns = [ - '/网站名称[^>]*>([^<]+)]*>网站名称<\/td>\s*]*>([^<]+)]*>([^<]+)]*>([12]\d{3}-\d{2}-\d{2})<\/td>/i', - ]; - $checkDate = ''; - foreach ($datePatterns as $pattern) { - if (preg_match($pattern, $html, $matches)) { - $checkDate = trim(strip_tags($matches[1])); - if (!empty($checkDate)) break; - } - } - - if (!empty($icp) || !empty($owner) || !empty($siteName)) { - return [ - 'domain' => $domain, - 'icp' => $icp ?: 'N/A', - 'owner' => $owner ?: 'N/A', - 'siteName' => $siteName ?: 'N/A', - 'checkDate' => $checkDate ?: 'N/A', - 'source' => 'aizhan.com' - ]; - } - - return null; +/** + * 解析aizhan.com返回的ICP数据 + */ +function parseICPData($html, $domain) { + return parseICPFromHTML($html, $domain); } /** * 解析beianx.com返回的数据 */ function parseBeianxData($html, $domain) { - $html = preg_replace('/)<[^<]*)*<\/script>/i', '', $html); - $html = preg_replace('/)<[^<]*)*<\/style>/i', '', $html); - - // 提取ICP编号 - 多种格式 - $icpPatterns = [ - '/[\d\u4e00-\u9fa5]+-ICP-\d{8}/iu', - '/ICP[\u4e00-\u9fa5]?\d{8,}/iu', - '/>([^<]*ICP[^<]*?)\ $domain, - 'icp' => $icp ?: 'N/A', - 'owner' => $owner ?: 'N/A', - 'siteName' => $siteName ?: 'N/A', - 'checkDate' => $checkDate ?: 'N/A', - 'source' => 'beianx.com' - ]; - } - - return null; + return parseICPFromHTML($html, $domain); } /** * 从HTML表格中提取指定标签的值 */ function extractTableValue($html, $label) { - $pattern = '/' . preg_quote($label) . '[^<]*?<[^>]*>([^<]+)<[^>]*>/is'; - if (preg_match($pattern, $html, $matches)) { - return trim($matches[1]); - } - return ''; + return extractFromHTML($html, $label); }