Files
QuickAPI/api/icp/index.php
muzihuaner 3c4af36e11 更新
2026-03-18 13:23:58 +08:00

357 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
$file = 'counter.dat';
// 读取并自增
$counter = (int)@file_get_contents($file);
$counter++;
// 使用 LOCK_EX 防止并发写入冲突
file_put_contents($file, $counter, LOCK_EX);
?>
<?php
/**
* ICP备案查询API
* 支持通过域名查询网站的ICP备案信息
*/
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
// 获取请求参数
$domain = isset($_GET['domain']) ? trim($_GET['domain']) : '';
$type = isset($_GET['type']) ? trim($_GET['type']) : 'json';
// 验证域名参数
if (empty($domain)) {
http_response_code(400);
echo json_encode([
'status' => 'error',
'code' => 400,
'message' => '缺少必要参数: domain',
'example' => '/api/icp/index.php?domain=example.com'
], JSON_UNESCAPED_UNICODE);
exit;
}
// 清理域名格式移除http://或https://
$domain = preg_replace('/^https?:\/\//i', '', $domain);
$domain = preg_replace('/\/.*$/', '', $domain);
$domain = strtolower(trim($domain));
// 验证域名格式
if (!preg_match('/^([a-z0-9]([a-z0-9\-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i', $domain)) {
http_response_code(400);
echo json_encode([
'status' => 'error',
'code' => 400,
'message' => '无效的域名格式',
'domain' => $domain
], JSON_UNESCAPED_UNICODE);
exit;
}
// 查询ICP信息
$result = queryICP($domain);
// 根据type参数返回不同格式
if ($type === 'text') {
header('Content-Type: text/plain; charset=utf-8');
if ($result['status'] === 'success') {
echo "域名: " . $result['data']['domain'] . "\n";
echo "主办单位: " . $result['data']['owner'] . "\n";
echo "ICP编号: " . $result['data']['icp'] . "\n";
echo "审核时间: " . $result['data']['checkDate'] . "\n";
echo "网站名称: " . $result['data']['siteName'] . "\n";
} else {
echo "查询失败: " . $result['message'];
}
} else {
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
/**
* 查询ICP信息
* @param string $domain 域名
* @return array 返回结果数组
*/
function queryICP($domain) {
$result = [
'status' => 'error',
'code' => 500,
'message' => '查询失败',
'domain' => $domain,
'data' => null
];
try {
// 方法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;
}
// 方法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;
$result['message'] = '查询成功';
$result['data'] = $parsedData;
return $result;
}
}
// 方法5: 备用API - ICP查询
$backupUrl = "https://www.beianx.com/search/?q=" . urlencode($domain);
$htmlResponse = callApi($backupUrl, false);
if ($htmlResponse) {
$backupData = parseBeianxData($htmlResponse, $domain);
if ($backupData) {
$result['status'] = 'success';
$result['code'] = 200;
$result['message'] = '查询成功';
$result['data'] = $backupData;
return $result;
}
}
// 如果都失败,返回默认的未备案状态
$result['status'] = 'not_found';
$result['code'] = 404;
$result['message'] = '未找到ICP备案信息该域名可能未在中国备案或各查询源暂时不可用';
} catch (Exception $e) {
$result['message'] = '查询异常: ' . $e->getMessage();
}
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数据
*/
function parseICPData($html, $domain) {
// 移除脚本和样式
$html = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/i', '', $html);
$html = preg_replace('/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/i', '', $html);
// 提取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;
}
}
// 提取主办单位 - 多种选择器
$ownerPatterns = [
'/>([^<]*?单位[^<]*?)</i',
'/主办单位[^>]*>([^<]+)</i',
'/<td[^>]*>([^<]*?单位[^<]*?)<\/td>/i',
];
$owner = '';
foreach ($ownerPatterns as $pattern) {
if (preg_match($pattern, $html, $matches)) {
$owner = trim(strip_tags($matches[1]));
if (!empty($owner)) break;
}
}
// 提取网站名称
$siteNamePatterns = [
'/网站名称[^>]*>([^<]+)</i',
'/<td[^>]*>网站名称<\/td>\s*<td[^>]*>([^<]+)</i',
];
$siteName = '';
foreach ($siteNamePatterns as $pattern) {
if (preg_match($pattern, $html, $matches)) {
$siteName = trim(strip_tags($matches[1]));
if (!empty($siteName)) break;
}
}
// 提取审核时间
$datePatterns = [
'/审核时间[^>]*>([^<]+)</i',
'/<td[^>]*>([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;
}
/**
* 解析beianx.com返回的数据
*/
function parseBeianxData($html, $domain) {
$html = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/i', '', $html);
$html = preg_replace('/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/i', '', $html);
// 提取ICP编号 - 多种格式
$icpPatterns = [
'/[\d\u4e00-\u9fa5]+-ICP-\d{8}/iu',
'/ICP[\u4e00-\u9fa5]?\d{8,}/iu',
'/>([^<]*ICP[^<]*?)\</i',
];
$icp = '';
foreach ($icpPatterns as $pattern) {
if (preg_match($pattern, $html, $matches)) {
$icp = trim(isset($matches[1]) ? $matches[1] : $matches[0]);
if (!empty($icp)) break;
}
}
// 从表格中提取信息
$owner = extractTableValue($html, '主办单位');
if (empty($owner)) {
$owner = extractTableValue($html, '单位');
}
$siteName = extractTableValue($html, '网站名称');
if (empty($siteName)) {
$siteName = extractTableValue($html, '名称');
}
$checkDate = extractTableValue($html, '审核时间');
if (empty($checkDate)) {
$checkDate = extractTableValue($html, '时间');
}
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' => 'beianx.com'
];
}
return null;
}
/**
* 从HTML表格中提取指定标签的值
*/
function extractTableValue($html, $label) {
$pattern = '/' . preg_quote($label) . '[^<]*?<[^>]*>([^<]+)<[^>]*>/is';
if (preg_match($pattern, $html, $matches)) {
return trim($matches[1]);
}
return '';
}