diff --git a/api/icp/index.php b/api/icp/index.php index 487c9a4..3130b49 100644 --- a/api/icp/index.php +++ b/api/icp/index.php @@ -84,26 +84,68 @@ function queryICP($domain) { ]; try { - // 方法1: 使用国家互联网应急中心API - $apiurl = "https://icp.aizhan.com/index.php?domain=" . urlencode($domain); - - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $apiurl); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 8); - curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_MAXREDIRS, 5); - - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); + // 方法1: 使用API Vat接口(返回JSON格式) + $apiurl = "https://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 ($httpCode === 200 && !empty($response)) { - // 解析HTML获取ICP信息 - $parsedData = parseICPData($response, $domain); + // 方法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); + $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) { $result['status'] = 'success'; $result['code'] = 200; @@ -113,22 +155,11 @@ function queryICP($domain) { } } - // 方法2: 备用API - ICP查询 + // 方法5: 备用API - ICP查询 $backupUrl = "https://www.beianx.com/search/?q=" . urlencode($domain); - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $backupUrl); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 8); - curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - - $backupResponse = curl_exec($ch); - $backupHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - - if ($backupHttpCode === 200 && !empty($backupResponse)) { - $backupData = parseBeianxData($backupResponse, $domain); + $htmlResponse = callApi($backupUrl, false); + if ($htmlResponse) { + $backupData = parseBeianxData($htmlResponse, $domain); if ($backupData) { $result['status'] = 'success'; $result['code'] = 200; @@ -141,7 +172,7 @@ function queryICP($domain) { // 如果都失败,返回默认的未备案状态 $result['status'] = 'not_found'; $result['code'] = 404; - $result['message'] = '未找到ICP备案信息(该域名可能未在中国备案)'; + $result['message'] = '未找到ICP备案信息(该域名可能未在中国备案或各查询源暂时不可用)'; } catch (Exception $e) { $result['message'] = '查询异常: ' . $e->getMessage(); @@ -150,6 +181,41 @@ function queryICP($domain) { return $result; } +/** + * 通用HTTP调用函数 + */ +function callApi($url, $isJson = true) { + try { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_MAXREDIRS, 3); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlError = curl_error($ch); + curl_close($ch); + + if ($httpCode !== 200 || empty($response)) { + return null; + } + + if ($isJson) { + return json_decode($response, true); + } + + return $response; + } catch (Exception $e) { + return null; + } +} + /** * 解析aizhan.com返回的ICP数据 */ @@ -158,40 +224,58 @@ function parseICPData($html, $domain) { $html = preg_replace('/)<[^<]*)*<\/script>/i', '', $html); $html = preg_replace('/)<[^<]*)*<\/style>/i', '', $html); - // 提取ICP编号 - $icpPattern = '/[\d\u4e00-\u9fa5]+-ICP-\d{8}/iu'; - $icpMatches = []; - if (preg_match_all($icpPattern, $html, $icpMatches)) { - $icp = $icpMatches[0][0] ?? ''; - } else { - $icp = ''; + // 提取ICP编号 - 多种格式支持 + $icpPatterns = [ + '/[\d\u4e00-\u9fa5]+-ICP-\d{8}/iu', // 原格式 + '/ICP[\u4e00-\u9fa5]?\d{8,}/iu', // 新格式 + '/[\d]{8}\|[\d]{8}/u', // 竖线格式 + ]; + $icp = ''; + foreach ($icpPatterns as $pattern) { + if (preg_match($pattern, $html, $matches)) { + $icp = $matches[0]; + break; + } } - // 提取主办单位 - $ownerPattern = '/主办单位.*?]*>([^<]+)<\/td>/is'; - $ownerMatches = []; - if (preg_match_all($ownerPattern, $html, $ownerMatches)) { - $owner = trim($ownerMatches[1][0] ?? ''); - } else { - $owner = ''; + // 提取主办单位 - 多种选择器 + $ownerPatterns = [ + '/>([^<]*?单位[^<]*?)]*>([^<]+)]*>([^<]*?单位[^<]*?)<\/td>/i', + ]; + $owner = ''; + foreach ($ownerPatterns as $pattern) { + if (preg_match($pattern, $html, $matches)) { + $owner = trim(strip_tags($matches[1])); + if (!empty($owner)) break; + } } // 提取网站名称 - $sitePattern = '/网站名称.*?]*>([^<]+)<\/td>/is'; - $siteMatches = []; - if (preg_match_all($sitePattern, $html, $siteMatches)) { - $siteName = trim($siteMatches[1][0] ?? ''); - } else { - $siteName = ''; + $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)) { @@ -215,16 +299,35 @@ function parseBeianxData($html, $domain) { $html = preg_replace('/)<[^<]*)*<\/script>/i', '', $html); $html = preg_replace('/)<[^<]*)*<\/style>/i', '', $html); - // 提取ICP编号 - $icpPattern = '/[\d\u4e00-\u9fa5]+-ICP-\d{8}/iu'; - $icpMatches = []; - preg_match_all($icpPattern, $html, $icpMatches); - $icp = $icpMatches[0][0] ?? ''; + // 提取ICP编号 - 多种格式 + $icpPatterns = [ + '/[\d\u4e00-\u9fa5]+-ICP-\d{8}/iu', + '/ICP[\u4e00-\u9fa5]?\d{8,}/iu', + '/>([^<]*ICP[^<]*?)\