新浪提供的 IP 查詢介面(https://int.dpool.sina.com.cn/iplookup/iplookup.php)回傳 JSON 格式資料,包含省份、城市、區縣、ISP 等欄位。本文示範如何用 cURL 串接並處理編碼。
<?php
/**
* 透過新浪 IP 查詢 API 取得地理位置字串
*
* @param string $ip 目標 IP,預設為自動偵測
* @return string 位置描述,失敗回傳空字串
*/
function getLocationBySina(string $ip = ''): string {
if ($ip === '') {
$ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
}
$url = "https://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip={$ip}";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
CURLOPT_ENCODING => 'utf-8',
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP IP Lookup)',
]);
$raw = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
if ($err || !$raw) {
error_log("Sina IP API error: $err");
return '';
}
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE || !$data) {
return '';
}
// 新浪回傳結構:province, city, district, isp, desc
if (!empty($data['desc'])) {
return $data['desc']; // 如「北京市 聯通」
}
$parts = array_filter([
$data['province'] ?? '',
$data['city'] ?? '',
$data['district'] ?? '',
$data['isp'] ?? '',
]);
return implode(' ', $parts);
}
// 使用範例
echo getLocationBySina('183.37.209.57'); // 輸出:北京市 海淀區 聯通 等
?>
mb_convert_encoding。