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

PHP 串接新浪 IP 地址查詢 API 取得地理位置

     編輯:PHP 相關知識

新浪提供的 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'); // 輸出:北京市 海淀區 聯通 等
?>

注意事項

  • 介面為 HTTP 非 HTTPS,若專案全站 HTTPS 可能產生混合內容警告,建議代理轉發或改用支援 HTTPS 的服務(如 ipapi.co、ipinfo.io)。
  • 新浪介面無官方 SLA,高頻呼叫可能被限流,生產環境建議快取結果(Redis/Memcached)並設定合理 TTL。
  • 回傳編碼為 UTF-8,若專案採 Big5/GBK 需自行 mb_convert_encoding。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved