PHP后端第三方查询IP接口源代码

原理说明

先通过获取请求的客户端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
}

返回参数

  1. ip→IP地址
  2. country→国家
  3. province→省份
  4. city→城市
  5. isp→运营商
  6. fromCache→是否是本地缓存信息
© 版权声明
THE END
点赞25 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容