騰訊 IP 分享計劃(https://ip.qq.com/cgi-bin/searchip)回傳 HTML 頁面,需解析其中的 <span> 內容並處理 GB2312 編碼。本文提供封裝良好的函式範例。
<?php
/**
* 透過騰訊 IP 分享計劃查詢地理位置
*
* @param string $ip 目標 IP
* @return string 位置描述,失敗回傳空字串
*/
function getLocationByQQ(string $ip): string {
$url = "https://ip.qq.com/cgi-bin/searchip?searchip1={$ip}";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_ENCODING => 'gb2312', // 關鍵:騰訊回傳 GB2312
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP IP Lookup)',
]);
$html = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
if ($err || !$html) {
error_log("QQ IP API error: $err");
return '';
}
// 確保轉為 UTF-8 供後續處理
$html = mb_convert_encoding($html, 'UTF-8', 'GB2312');
// 解析 ... 內的位置文字
if (preg_match('/<span>(.*?)<\/span><\/p>/isu', $html, $m)) {
return trim($m[1]);
}
return '';
}
// 使用範例
echo getLocationByQQ('183.37.209.57'); // 輸出:北京市 聯通 等
?>
CURLOPT_ENCODING => 'gb2312' 或事後 mb_convert_encoding,否則中文會亂碼。$dom = new DOMDocument(); @$dom->loadHTML($html); $span = $dom->getElementsByTagName('span')->item(0); return $span ? $span->textContent : '';