原理说明
先通过获取请求的客户端ip地址或请求参数中的ip地址,然后再通过远程第三方api接口来查询ip的详细信息。再把查询到的ip信息保存到本地json文件用于同一个ip第二是查询时直接返回保存到本地的响应信息,这样可以减少请求第三方api接口的频率避免被拉黑
PHP代码都加了注释,方便小白修改或参考学习
<?php//作者:看戏仔//请求:支持GET/POST两种请求方式//参数://ip 填写Ip地址则查询填写的ip地址//如果不填写任何参数则获取请求的客户端ip地址// 设置 CORS headersheader("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→是否是本地缓存信息