首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 串接騰訊 IP 分享計劃 API 取得地理位置

     編輯:PHP 相關知識

騰訊 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'); // 輸出:北京市 聯通 等
?>

關鍵點說明

  • 編碼處理:騰訊介面回傳 GB2312,必須 CURLOPT_ENCODING => 'gb2312' 或事後 mb_convert_encoding,否則中文會亂碼。
  • 正則解析:頁面結構可能變動,建議以 DOMDocument 解析更穩健:
    $dom = new DOMDocument(); @$dom->loadHTML($html); $span = $dom->getElementsByTagName('span')->item(0); return $span ? $span->textContent : '';
  • 可用性:同屬非官方 SLA 介面,生產環境請快取並備援多家服務商(新浪、ipip.net、ipapi.co 等)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved