原理说明
先通过获取请求的客户端ip地址或请求参数中的ip地址,然后再通过远程第三方api接口来查询ip的详细信息。再把查询到的ip信息保存到本地json文件用于同一个ip第二是查询时直接返回保存到本地的响应信息,这样可以减少请求第三方api接口的频率避免被拉黑
文章目录
- 原理说明
- 请求说明
- 请求参数
- 返回参数
PHP代码都加了注释,方便小白修改或参考学习
<?php
//作者:看戏仔
//请求:支持GET/POST两种请求方式
//参数:
//ip 填写Ip地址则查询填写的ip地址
//如果不填写任何参数则获取请求的客户端ip地址
// 设置 CORS headers
header("Access-Control-Allow-Origin: *"); // 这里使用 * 允许所有源,但出于安全考虑,应该指定具体源
header("Access-Control-Allow-Credentials: true"); // 允许请求携带凭据
// 设置缓存文件路径
define('CACHE_FILE', 'ip_cache.json');
// 获取客户端IP地址,或者从请求参数中获取
$requestedIP = isset($_GET['ip']) ? $_GET['ip'] : $_SERVER['REMOTE_ADDR'];
// 检查缓存并获取IP信息
$cacheData = @file_get_contents(CACHE_FILE);
$cacheArray = $cacheData !== false ? json_decode($cacheData, true) : [];
// 如果缓存中存在请求的IP地址,则直接返回缓存的信息
if (isset($cacheArray[$requestedIP])) {
$ipInfo = $cacheArray[$requestedIP];
$fromCache = true;
} else {
// 如果缓存中不存在,查询外部API获取IP信息
$ipInfo = getIPInfoFromAPI($requestedIP);
if (!empty($ipInfo)) {
// 将获取到的信息保存到缓存中
$cacheArray[$requestedIP] = $ipInfo;
file_put_contents(CACHE_FILE, json_encode($cacheArray, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
$fromCache = false;
}
}
// 构建JSON响应
$response = [
"code" => 200,
"success" => true,
"msg" => "获取成功!",
"ip" => $requestedIP,
"data" => [
"country" => $ipInfo['nation'],
"province" => $ipInfo['province'],
"city" => $ipInfo['subdivision_2_name'],
"isp" => $ipInfo['isp']
],
"tips" => "接口由看戏仔-API(http://api.kxzjoker.cn/)免费提供",
"fromCache" => $fromCache // 添加标签以表明是否使用了本地缓存的信息
];
// 输出JSON响应
header('Content-Type: application/json');
echo json_encode($response, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// 发送HTTP请求获取IP信息的函数
function getIPInfoFromAPI($ip) {
$url = "https://webapi-pc.meitu.com/common/ip_location?ip=" . urlencode($ip);
$userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
$response = curl_exec($ch);
curl_close($ch);
$apiResponse = json_decode($response, true);
return $apiResponse['data'][$ip] ?? null;
}
?>
请求说明
- 请求地址:http://localhost/ip.php
- 返回格式:JSON
- 请求方式:GET/POST
- 请求示例:http://localhost/ip.php?ip=123.121.179.195
请求参数
ip=需要查询的IP地址
返回示例
{
"code": 200,
"success": true,
"msg": "获取成功!",
"ip": "123.121.179.195",
"data": {
"country": "中国",
"province": "北京",
"city": "北京",
"isp": "联通"
},
"fromCache": false
}
返回参数
- ip→IP地址
- country→国家
- province→省份
- city→城市
- isp→运营商
- fromCache→是否是本地缓存信息
![](https://cos.lhndy.cn/2024/04/ad-wztb.png)
© 版权声明
THE END
暂无评论内容