gx
This commit is contained in:
@@ -1,14 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
$file = 'counter.dat';
|
|
||||||
|
|
||||||
// 读取并自增
|
|
||||||
$counter = (int)@file_get_contents($file);
|
|
||||||
$counter++;
|
|
||||||
|
|
||||||
// 使用 LOCK_EX 防止并发写入冲突
|
|
||||||
file_put_contents($file, $counter, LOCK_EX);
|
|
||||||
?>
|
|
||||||
<?php
|
|
||||||
/**
|
/**
|
||||||
* ICP备案查询API
|
* ICP备案查询API
|
||||||
* 支持通过域名查询网站的ICP备案信息
|
* 支持通过域名查询网站的ICP备案信息
|
||||||
@@ -17,6 +7,13 @@ file_put_contents($file, $counter, LOCK_EX);
|
|||||||
header('Content-Type: application/json; charset=utf-8');
|
header('Content-Type: application/json; charset=utf-8');
|
||||||
header('Access-Control-Allow-Origin: *');
|
header('Access-Control-Allow-Origin: *');
|
||||||
|
|
||||||
|
// 访问计数
|
||||||
|
$counterFile = __DIR__ . '/counter.dat';
|
||||||
|
if (is_writable(dirname($counterFile))) {
|
||||||
|
$counter = (int)@file_get_contents($counterFile);
|
||||||
|
@file_put_contents($counterFile, $counter + 1, LOCK_EX);
|
||||||
|
}
|
||||||
|
|
||||||
// 获取请求参数
|
// 获取请求参数
|
||||||
$domain = isset($_GET['domain']) ? trim($_GET['domain']) : '';
|
$domain = isset($_GET['domain']) ? trim($_GET['domain']) : '';
|
||||||
$type = isset($_GET['type']) ? trim($_GET['type']) : 'json';
|
$type = isset($_GET['type']) ? trim($_GET['type']) : 'json';
|
||||||
@@ -84,17 +81,17 @@ function queryICP($domain) {
|
|||||||
];
|
];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 方法1: 使用互联网档案馆API
|
// 方法1: 使用微步在线API
|
||||||
$apiurl = "https://www.api.vat.tools/query?domain=" . urlencode($domain);
|
$apiurl = "https://api.vat.tools/query?domain=" . urlencode($domain);
|
||||||
$data = callApi($apiurl);
|
$data = callApi($apiurl);
|
||||||
if ($data && is_array($data) && !empty($data)) {
|
if ($data && is_array($data)) {
|
||||||
if (isset($data['icp']) && $data['icp'] != 'N/A') {
|
if (isset($data['icp']) && !empty($data['icp']) && $data['icp'] !== 'N/A') {
|
||||||
$result['status'] = 'success';
|
$result['status'] = 'success';
|
||||||
$result['code'] = 200;
|
$result['code'] = 200;
|
||||||
$result['message'] = '查询成功';
|
$result['message'] = '查询成功';
|
||||||
$result['data'] = [
|
$result['data'] = [
|
||||||
'domain' => $domain,
|
'domain' => $domain,
|
||||||
'icp' => $data['icp'] ?? 'N/A',
|
'icp' => $data['icp'],
|
||||||
'owner' => $data['organizer'] ?? $data['owner'] ?? 'N/A',
|
'owner' => $data['organizer'] ?? $data['owner'] ?? 'N/A',
|
||||||
'siteName' => $data['website_name'] ?? $data['name'] ?? 'N/A',
|
'siteName' => $data['website_name'] ?? $data['name'] ?? 'N/A',
|
||||||
'checkDate' => $data['check_date'] ?? $data['approve_date'] ?? 'N/A',
|
'checkDate' => $data['check_date'] ?? $data['approve_date'] ?? 'N/A',
|
||||||
@@ -105,40 +102,19 @@ function queryICP($domain) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法2: 使用ICP查询-接口-通用API
|
// 方法2: 使用爱站网API
|
||||||
$apiurl2 = "https://api.search.naver.com/search.naver?query=" . urlencode($domain) . "&where=web";
|
$apiurl2 = "https://tools.zhuaxia.com/icp?domain=" . urlencode($domain);
|
||||||
|
$data2 = callApi($apiurl2);
|
||||||
// 方法2b: 使用工信部接口
|
if ($data2 && is_array($data2) && isset($data2['data'])) {
|
||||||
$apiurl2b = "https://beian.miit.gov.cn/";
|
$icpData = $data2['data'];
|
||||||
|
$icp = $icpData['icp'] ?? '';
|
||||||
// 方法3: 使用免费的ICP API - API1
|
if (!empty($icp) && $icp !== 'N/A') {
|
||||||
$apiurl3 = "https://api.allorigins.win/get?url=" . urlencode("https://icp.aizhan.com/index.php?domain=" . urlencode($domain));
|
|
||||||
$data3 = callApi($apiurl3);
|
|
||||||
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'] = '查询成功';
|
|
||||||
$result['data'] = $parsedData;
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 方法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['status'] = 'success';
|
||||||
$result['code'] = 200;
|
$result['code'] = 200;
|
||||||
$result['message'] = '查询成功';
|
$result['message'] = '查询成功';
|
||||||
$result['data'] = [
|
$result['data'] = [
|
||||||
'domain' => $domain,
|
'domain' => $domain,
|
||||||
'icp' => $parsedIcp,
|
'icp' => $icp,
|
||||||
'owner' => $icpData['unitname'] ?? $icpData['owner'] ?? 'N/A',
|
'owner' => $icpData['unitname'] ?? $icpData['owner'] ?? 'N/A',
|
||||||
'siteName' => $icpData['sitename'] ?? $icpData['name'] ?? 'N/A',
|
'siteName' => $icpData['sitename'] ?? $icpData['name'] ?? 'N/A',
|
||||||
'checkDate' => $icpData['checkdate'] ?? $icpData['time'] ?? 'N/A',
|
'checkDate' => $icpData['checkdate'] ?? $icpData['time'] ?? 'N/A',
|
||||||
@@ -148,71 +124,71 @@ function queryICP($domain) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法5: 使用网格API
|
// 方法3: 使用网格API (chaxun)
|
||||||
$apiurl5 = "https://www.chaxun.15600.net/service.php?domain=" . urlencode($domain);
|
$apiurl3 = "https://www.chaxun.15600.net/service.php?domain=" . urlencode($domain);
|
||||||
$data5 = callApi($apiurl5, true);
|
$data3 = callApi($apiurl3);
|
||||||
if ($data5) {
|
if ($data3 && is_array($data3)) {
|
||||||
$icpNum = '';
|
$icpNum = $data3['ICP'] ?? $data3['icp'] ?? '';
|
||||||
if (isset($data5['ICP']) && !empty($data5['ICP'])) {
|
if (!empty($icpNum) && $icpNum !== 'N/A') {
|
||||||
$icpNum = $data5['ICP'];
|
|
||||||
} elseif (isset($data5['icp']) && !empty($data5['icp'])) {
|
|
||||||
$icpNum = $data5['icp'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($icpNum)) {
|
|
||||||
$result['status'] = 'success';
|
$result['status'] = 'success';
|
||||||
$result['code'] = 200;
|
$result['code'] = 200;
|
||||||
$result['message'] = '查询成功';
|
$result['message'] = '查询成功';
|
||||||
$result['data'] = [
|
$result['data'] = [
|
||||||
'domain' => $domain,
|
'domain' => $domain,
|
||||||
'icp' => $icpNum,
|
'icp' => $icpNum,
|
||||||
'owner' => $data5['company'] ?? $data5['owner'] ?? 'N/A',
|
'owner' => $data3['company'] ?? $data3['owner'] ?? 'N/A',
|
||||||
'siteName' => $data5['websitename'] ?? $data5['name'] ?? 'N/A',
|
'siteName' => $data3['websitename'] ?? $data3['name'] ?? 'N/A',
|
||||||
'checkDate' => $data5['checkTime'] ?? 'N/A',
|
'checkDate' => $data3['checkTime'] ?? $data3['time'] ?? 'N/A',
|
||||||
'source' => 'chaxun'
|
'source' => 'chaxun'
|
||||||
];
|
];
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法6: 爱站网直接查询
|
// 方法4: 使用AllOrigins代理通过爱站网查询
|
||||||
$apiurl6 = "http://icp.aizhan.com/index.php?domain=" . urlencode($domain);
|
$proxyUrl = "https://api.allorigins.win/get?url=" . urlencode("http://icp.aizhan.com/index.php?domain=" . urlencode($domain));
|
||||||
$htmlData = callApi($apiurl6, false);
|
$data4 = callApi($proxyUrl);
|
||||||
if ($htmlData && strlen($htmlData) > 100) {
|
if ($data4 && isset($data4['contents'])) {
|
||||||
// 尝试提取ICP信息
|
$htmlData = $data4['contents'];
|
||||||
$icpMatch = [];
|
$parsedData = parseICPFromHTML($htmlData, $domain);
|
||||||
if (preg_match('/[\d\u4e00-\u9fa5]+-ICP-\d+/u', $htmlData, $icpMatch)) {
|
if ($parsedData && isset($parsedData['icp']) && $parsedData['icp'] !== 'N/A') {
|
||||||
// 如果能直接提取ICP号则成功
|
return [
|
||||||
if (!empty($icpMatch[0]) && strpos($icpMatch[0], 'ICP') !== false) {
|
'status' => 'success',
|
||||||
$result['status'] = 'success';
|
'code' => 200,
|
||||||
$result['code'] = 200;
|
'message' => '查询成功',
|
||||||
$result['message'] = '查询成功';
|
|
||||||
$result['data'] = [
|
|
||||||
'domain' => $domain,
|
'domain' => $domain,
|
||||||
'icp' => $icpMatch[0],
|
'data' => $parsedData
|
||||||
'owner' => extractFromHTML($htmlData, '主办单位'),
|
|
||||||
'siteName' => extractFromHTML($htmlData, '网站名称'),
|
|
||||||
'checkDate' => extractFromHTML($htmlData, '审核时间'),
|
|
||||||
'source' => 'aizhan-cache'
|
|
||||||
];
|
];
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果都失败,返回默认的未备案状态
|
// 方法5: 直接查询爱站网 (HTTP)
|
||||||
|
$apiurl5 = "http://icp.aizhan.com/index.php?domain=" . urlencode($domain);
|
||||||
|
$htmlData = callApi($apiurl5, false);
|
||||||
|
if ($htmlData && strlen($htmlData) > 100) {
|
||||||
|
$parsedData = parseICPFromHTML($htmlData, $domain);
|
||||||
|
if ($parsedData && isset($parsedData['icp']) && $parsedData['icp'] !== 'N/A') {
|
||||||
|
return [
|
||||||
|
'status' => 'success',
|
||||||
|
'code' => 200,
|
||||||
|
'message' => '查询成功',
|
||||||
|
'domain' => $domain,
|
||||||
|
'data' => $parsedData
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 都失败返回未备案
|
||||||
$result['status'] = 'not_found';
|
$result['status'] = 'not_found';
|
||||||
$result['code'] = 404;
|
$result['code'] = 404;
|
||||||
$result['message'] = '未找到ICP备案信息(该域名可能未在中国备案或查询源暂时不可用)';
|
$result['message'] = '未找到ICP备案信息(该域名可能未在中国备案)';
|
||||||
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$result['message'] = '查询异常: ' . $e->getMessage();
|
$result['status'] = 'error';
|
||||||
|
$result['code'] = 500;
|
||||||
|
$result['message'] = 'API异常: ' . $e->getMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -223,19 +199,14 @@ function callApi($url, $isJson = true) {
|
|||||||
$ch = curl_init();
|
$ch = curl_init();
|
||||||
curl_setopt($ch, CURLOPT_URL, $url);
|
curl_setopt($ch, CURLOPT_URL, $url);
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
curl_setopt($ch, CURLOPT_TIMEOUT, 8);
|
||||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
|
||||||
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_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_VERIFYHOST, 0);
|
||||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
|
||||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||||
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
|
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
|
||||||
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
|
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);
|
$response = curl_exec($ch);
|
||||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||||
@@ -260,42 +231,49 @@ function callApi($url, $isJson = true) {
|
|||||||
*/
|
*/
|
||||||
function extractFromHTML($html, $label) {
|
function extractFromHTML($html, $label) {
|
||||||
$patterns = [
|
$patterns = [
|
||||||
'/' . preg_quote($label) . '[^>]*>([^<]+)<',
|
'/' . preg_quote($label) . '[^>]*>([^<]+)</',
|
||||||
'/<th[^>]*>' . preg_quote($label) . '<\/th>\s*<td[^>]*>([^<]+)<\/td>/',
|
|
||||||
'/<td[^>]*>' . preg_quote($label) . '<\/td>\s*<td[^>]*>([^<]+)<\/td>/',
|
'/<td[^>]*>' . preg_quote($label) . '<\/td>\s*<td[^>]*>([^<]+)<\/td>/',
|
||||||
|
'/<th[^>]*>' . preg_quote($label) . '<\/th>\s*<td[^>]*>([^<]+)<\/td>/',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($patterns as $pattern) {
|
foreach ($patterns as $pattern) {
|
||||||
if (preg_match($pattern, $html, $matches)) {
|
if (preg_match($pattern, $html, $matches)) {
|
||||||
return trim(strip_tags($matches[1]));
|
$value = trim(strip_tags($matches[1]));
|
||||||
|
if (!empty($value)) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 'N/A';
|
return 'N/A';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 改进的ICP HTML解析函数
|
* 从HTML解析ICP信息
|
||||||
*/
|
*/
|
||||||
function parseICPFromHTML($html, $domain) {
|
function parseICPFromHTML($html, $domain) {
|
||||||
|
// 清理HTML
|
||||||
$html = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/i', '', $html);
|
$html = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/i', '', $html);
|
||||||
$html = preg_replace('/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/i', '', $html);
|
$html = preg_replace('/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/i', '', $html);
|
||||||
|
|
||||||
// 提取ICP编号
|
// 提取ICP编号 - 多种格式
|
||||||
$icpPatterns = [
|
$icpPatterns = [
|
||||||
'/[\d\u4e00-\u9fa5]+-ICP-\d{8,}/u',
|
'/[\d\u4e00-\u9fa5]+-ICP-\d{8,}/u',
|
||||||
'/ICP[\u4e00-\u9fa5]?\d{8,}/u',
|
'/ICP[\u4e00-\u9fa5]?\d{8,}/u',
|
||||||
'/ICP\d{8,}/u',
|
'/ICP\d{8,}/u',
|
||||||
];
|
];
|
||||||
$icp = 'N/A';
|
|
||||||
|
$icp = '';
|
||||||
foreach ($icpPatterns as $pattern) {
|
foreach ($icpPatterns as $pattern) {
|
||||||
if (preg_match($pattern, $html, $matches)) {
|
if (preg_match($pattern, $html, $matches)) {
|
||||||
$icp = trim($matches[0]);
|
$icp = trim($matches[0]);
|
||||||
|
if (!empty($icp)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 如果没有找到有效的ICP,返回null
|
// 如果没有找到ICP号,返回null
|
||||||
if ($icp === 'N/A' || empty($icp)) {
|
if (empty($icp) || $icp === 'N/A') {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,25 +290,4 @@ function parseICPFromHTML($html, $domain) {
|
|||||||
'source' => 'html-parse'
|
'source' => 'html-parse'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
/**
|
|
||||||
* 解析aizhan.com返回的ICP数据
|
|
||||||
*/
|
|
||||||
function parseICPData($html, $domain) {
|
|
||||||
return parseICPFromHTML($html, $domain);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 解析beianx.com返回的数据
|
|
||||||
*/
|
|
||||||
function parseBeianxData($html, $domain) {
|
|
||||||
return parseICPFromHTML($html, $domain);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 从HTML表格中提取指定标签的值
|
|
||||||
*/
|
|
||||||
function extractTableValue($html, $label) {
|
|
||||||
return extractFromHTML($html, $label);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user