文件
2026-06-04 22:42:27 +08:00

187 行
5.5 KiB
PHP

<?php
header('Content-Type: application/json; charset=utf-8');
// 获取IP地址
$ip = $_GET['ip'] ?? '';
// 如果没有ip参数,检查第一个GET参数是否是IP地址
if (empty($ip)) {
$queryString = $_SERVER['QUERY_STRING'] ?? '';
if (!empty($queryString)) {
$parts = explode('=', $queryString, 2);
$potentialIp = $parts[0];
if (filter_var($potentialIp, FILTER_VALIDATE_IP)) {
$ip = $potentialIp;
}
}
}
if (empty($ip)) {
echo json_encode([
'error' => '请提供IP地址参数',
'status' => 'error'
], JSON_UNESCAPED_UNICODE);
exit;
}
// 验证IP地址格式
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
echo json_encode([
'error' => '无效的IP地址格式',
'status' => 'error'
], JSON_UNESCAPED_UNICODE);
exit;
}
// 定义IP查询API列表
$apis = [
// 纯真数据API
'cz88' => function($ip) {
$url = "http://ip.taokeyun.com/api.php?ip={$ip}&datatype=json";
return callApi($url);
},
// ipip API
'ipip' => function($ip) {
$url = "https://freeapi.ipip.net/{$ip}";
return callApi($url);
},
// 淘宝数据API
'taobao' => function($ip) {
$url = "http://ip.taobao.com/service/getIpInfo.php?ip={$ip}";
return callApi($url);
},
// IP2REGION API
'ip2region' => function($ip) {
$url = "http://api.ip2region.com/v1/?ip={$ip}&key=free";
return callApi($url);
},
// 备用:ip-api.com
'ipapi' => function($ip) {
$url = "http://ip-api.com/json/{$ip}?lang=zh-CN";
return callApi($url);
}
];
// API调用函数
function callApi($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 8);
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_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error || $httpCode !== 200) {
return false;
}
return json_decode($response, true);
}
// 解析不同API的响应
function parseApiResponse($apiName, $data, $ip) {
switch ($apiName) {
case 'cz88':
if (isset($data['code']) && $data['code'] == 0) {
return [
'ip' => $ip,
'city' => $data['data']['city'] ?? '',
'region' => $data['data']['province'] ?? '',
'country' => $data['data']['country'] ?? '',
'isp' => $data['data']['isp'] ?? '',
'status' => 'success'
];
}
break;
case 'ipip':
if (is_array($data) && count($data) >= 5) {
return [
'ip' => $ip,
'city' => $data[3] ?? '',
'region' => $data[2] ?? '',
'country' => $data[0] ?? '',
'isp' => $data[4] ?? '',
'status' => 'success'
];
}
break;
case 'taobao':
if (isset($data['code']) && $data['code'] == 0) {
return [
'ip' => $ip,
'city' => $data['data']['city'] ?? '',
'region' => $data['data']['region'] ?? '',
'country' => $data['data']['country'] ?? '',
'isp' => $data['data']['isp'] ?? '',
'status' => 'success'
];
}
break;
case 'ip2region':
if (isset($data['ret']) && $data['ret'] == 200) {
$location = explode('|', $data['data']['location'] ?? '');
return [
'ip' => $ip,
'city' => $location[3] ?? '',
'region' => $location[2] ?? '',
'country' => $location[0] ?? '',
'isp' => $location[4] ?? '',
'status' => 'success'
];
}
break;
case 'ipapi':
if (isset($data['status']) && $data['status'] === 'success') {
return [
'ip' => $data['query'] ?? $ip,
'city' => $data['city'] ?? '',
'region' => $data['regionName'] ?? '',
'country' => $data['country'] ?? '',
'isp' => $data['isp'] ?? '',
'status' => 'success'
];
}
break;
}
return false;
}
// 尝试所有API,直到成功
$locationData = false;
foreach ($apis as $apiName => $apiFunc) {
$data = $apiFunc($ip);
if ($data) {
$locationData = parseApiResponse($apiName, $data, $ip);
if ($locationData) {
break;
}
}
}
// 如果所有API都失败
if (!$locationData) {
echo json_encode([
'error' => '所有IP查询API都失败,请稍后再试',
'status' => 'error'
], JSON_UNESCAPED_UNICODE);
exit;
}
// 输出JSON响应
echo json_encode($locationData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>