首页| 版块| 我的| 发帖| 消息
主题:为你守候 温馨家园 即日起开始拥有自己的IP归属信息表
zhangjingyu 
经测试,https://whois.pconline.com.cn/ipJson.jsp?ip=39.78.172.154可用。那么,怎么把addr后面的归属地提取出来呢?
根据您提供的API返回内容,提取 addr 字段的归属地信息非常简单。这个接口返回的是 JSONP 格式数据(一个JavaScript函数调用),您需要先从中提取出JSON部分再解析。

✅ 最直接的方法:使用正则匹配提取 addr 值
php
function getLocationFromPconline($ip) {
$url = "https://whois.pconline.com.cn/ipJson.jsp?ip={$ip}";

// 初始化cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
$response = curl_exec($ch);
curl_close($ch);

if (!$response) {
return false;
}

// 方法1:直接正则匹配addr的值(最简洁)
// 匹配 "addr":"..." 中的内容,注意处理中文
if (preg_match('/"addr":"([^"]+)"/', $response, $matches)) {
$addr = $matches[1];
// 可选:将Unicode转义序列(如\uXXXX)转换为中文
$addr = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function($match) {
return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $addr);
return $addr;
}

return false;
}

// 使用示例
$ip = '39.78.172.154';
$location = getLocationFromPconline($ip);
echo $location; // 输出: 山东省济南市 联通
🛠️ 备选方案:JSON解析法(更严谨)
如果需要提取多个字段,可以先提取JSON部分再解析:

php
function getIpInfoFromPconline($ip) {
$url = "https://whois.pconline.com.cn/ipJson.jsp?ip={$ip}";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);

// 提取函数调用中的JSON字符串
if (preg_match('/IPCallBack\(({.+})\)/', $response, $matches)) {
$jsonStr = $matches[1];
$data = json_decode($jsonStr, true);
if ($data && isset($data['addr'])) {
return $data['addr']; // 返回完整地址
// 或只返回省份+城市: $data['pro'] . $data['city']
}
}

return false;
}
📦 集成到您原有的函数中
您可以把这个作为备选方案,当 ip.cn 失效时自动切换:

php
function getipguishu($onlineip) {
// ... 原有的数据库查询和ip.cn逻辑 ...

// 如果ip.cn失败,尝试pconline
if (empty($guishudi)) {
$guishudi = getLocationFromPconline($onlineip);
}

return $guishudi;
}
zhangjingyu回帖于2026-05-28 22:22[查看电脑版]
下一页 (1/2)
下一楼»:代码稍加修改后,已经上传覆盖。后台重新切换为网络版获取归属地信息,目前测试没有出现错误。然 ..
«上一楼:最近几天,网络版代码似乎又出问题了,后台暂时切换为本地方式获取。经过努力,下面是本地测试通 ..

查看全部回帖(42)
«返回主帖