IP9 免費 IP 歸屬地查詢 API 實測,一支 curl 查出城市與電信商

IP9 是免註冊就能呼叫的 IP 歸屬地查詢 API,一支 curl 就回傳國家、城市與電信商。本文實測它的回應欄位與錯誤行為,並拆解三個接入前該知道的資料邊界:海外 IP 只有國家級解析、經緯度回傳國土中心,以及台灣 IP 的 country 欄歸類。

用 AI 摘要這篇文章:

在終端機貼上 curl ip9.com.cn 按下 Enter,一秒內會收到一段 JSON:這個 IP 位在台北、電信商是中嘉數位、經緯度 121.57 與 25.04 都一併回來,全程不用註冊帳號、不用申請 API 金鑰。這是 IP9 給人的第一印象,也是它最實在的部分:對臨時要查 IP 位置的人來說,入手成本趨近於零。

不過同一批查詢裡,有幾個結果會讓人愣一下。拿 Google 公共 DNS 的 8.8.8.8 去查,城市欄位是空的,回傳的經緯度落在美國本土的地理中心;Cloudflare 的 1.1.1.1 被標成澳洲;台灣 IP 的 country 欄回「中國」、國家代碼回 cn。這些不是服務故障,是 IP 地理資料庫本身的邊界,也正好是把它接進專案之前最該看清的部分。

我在 2026 年 9 月 14 日用 curl 實際跑了八組查詢,從本機與台灣的 IP 一路查到海外的知名節點,也讀完官網的定價與條款頁。

回應長什麼樣:免註冊就能用的三種查詢

IP9 的正式端點只有一個:https://ip9.com.cn/get。不帶參數就查發出請求的這台機器,加上 ?ip=8.8.8.8 就查指定位置,懶一點直接 curl ip9.com.cn 也通。下面是查本機 IP 的實際回應,欄位值原文為簡體中文,這裡轉成繁體對照:

{
  "ret": 200,
  "data": {
    "ip": "182.234.195.157",
    "country": "中國",
    "country_code": "cn",
    "prov": "台灣",
    "city": "台北",
    "city_code": "taipei",
    "city_short_code": "tb",
    "area": "",
    "post_code": "",
    "area_code": "02",
    "isp": "中嘉數位",
    "lng": "121.57",
    "lat": "25.04",
    "long_ip": 3068838813,
    "big_area": "港澳台"
  },
  "qt": 0.001
}

免費版拿得到的欄位大致分兩類。基礎欄位有國家與國家代碼、省份、城市、城市代碼、郵遞區號、電話區碼、電信商、經緯度、大區分類;回應裡另外有三個欄位在免費版永遠是空的,官方文件標明屬於 VIP:區縣(area)、IP 類型(家用、企業專線或機房)、AS 號。

欄位免費版說明
prov、city、isp省份、城市、電信商,中國大陸 IP 最完整
post_code、area_code部分郵遞區號與電話區碼,看地區填不填
lng、lat海外 IP 回的是國土中心,不是實際位置
area、ip_type、ip_asnVIP 欄位,區縣與 IP 型態

qt 是站方自己記錄的查詢耗時,八組實測都回 0.001 秒,這是伺服器端的處理時間,不含你到它機房之間的往返延遲。

整合時有兩個細節會踩到。輸入不合法的 IP(例如 999.999.999.999)會收到 {"data":[],"ret":400},實測 HTTP 狀態碼同樣回 400,兩層一致,程式裡認 ret 欄位最省事;另外這個端點只接受 GET,用 HEAD 探測會得到 404,寫健康檢查時別用錯動詞。IPv6 位址查得到結果,但 long_ip 欄會回 0,這個欄位是 32 位元整數,裝不下 IPv6,當主鍵用會撞值。

還有一件對台灣開發者很實際的事:回應值是簡體中文。資料庫回「中國」「美國」「中華電信」這類值時用的都是簡體字,直接顯示在介面上前得先轉繁,OpenCC 一行就能處理,但漏掉這步的產品不少。

官方在首頁放了 Java、Python、Go、PHP、Swift、Rust 等九種語言的對接範例,外部 API 文件則放在 Apifox 平台上,串接本身沒什麼門檻。

IP9 官網首頁的快速接入區塊,標示免費 IP 歸屬地查詢接口、IPv4 與 IPv6 支援,以及當日累計請求次數的即時計數器Pin
IP9 官網首頁的快速接入區塊,免註冊的接口說明與當日請求計數器(圖片來源:IP9 官網截圖)

座標落在國土中心:海外 IP 只有國家級

同一支 API,換成海外 IP 之後解析度立刻不一樣。這是查 8.8.8.8 的實際回應(欄位值同樣轉為繁體):

{
  "ret": 200,
  "data": {
    "ip": "8.8.8.8",
    "country": "美國",
    "country_code": "us",
    "prov": "",
    "city": "",
    "city_code": "",
    "city_short_code": "",
    "area": "",
    "post_code": "",
    "area_code": "",
    "isp": "Google Cloud",
    "lng": "-97.82",
    "lat": "37.75",
    "long_ip": 134744072,
    "big_area": ""
  },
  "qt": 0.001
}

省份和城市都是空的,經緯度 -97.82、37.75 這個位置在美國堪薩斯一帶,是美國本土的地理中心點,並不是 8.8.8.8 真正的部署位置。這是 IP 地理資料庫的通病:一段 IP 查得到城市,靠的是對當地網路的實測探測;探測涵蓋不到的地方,就只剩 IP 註冊資料能看,而各區域的網路註冊機構(例如亞太的 APNIC、美洲的 ARIN)公開的資料最細只到國家與持有機構。所以同一個資料庫裡,中國大陸的 IP 有城市層級,海外 IP 只有國家層級,不是品質忽好忽壞,而是兩種資料來源本來就不同粗細。

IP9 官方說它的資料靠自有網路監測點輔助測量、持續迭代更新,這句話對照實測是成立的:探測範圍以中國大陸為主,海外就回到註冊資料那一層。

1.1.1.1 的結果把這件事演示得更完整。它被歸為澳洲,因為這段 IP 向 APNIC 註冊,註冊地在澳洲,資料庫就照著登記地回。想多認識這組很常被拿來當公共 DNS 服務的 1.1.1.1,可以參考先前的介紹;這裡的重點是,anycast 這類全球散布的 IP,任何地理位置服務都只能給你一個帳面上的登記地址。

這個邊界對兩種人影響最大。想把查詢結果畫上地圖的,海外 IP 會全部疊在國土中心一個點,視覺化直接出錯;需要海外城市級解析的,這個 API 免費版給不了,官方對國際區域的說法是覆蓋 200 多個國家地區,講的是國家級覆蓋。查 Cloudflare 的邊緣節點 IP 時還會看到 ISP 欄標成 Cloudflare/CDN,官方說明是 CDN 廠商常混用家用 IP 當邊緣節點,這類 IP 才被歸為 ISP 類,做流量分析時把它當正常現象就好。

台灣 IP 的三層標記:country、prov、big_area 各自表述

台灣 IP 在這個資料庫裡同時掛著三個不同層次的標記。實測本機 IP 與中華電信的 168.95.1.1,結果一致:prov 回「台灣」、city 回「台北」、isp 回電信商名稱,城市層級解析得到;但 country 回「中國」、country_code 回 cn,另外有一個 big_area 欄回「港澳台」。官方常見問題頁附的國碼對照表明列台灣、香港、澳門都對應 cn,這是站方資料庫的歸類方式,寫在文件裡、有跡可查。

欄位完整度可以跟中國大陸 IP 對照著看。查官方範例的 58.30.0.0(北京),郵遞區號 100000、電話區碼 010、大區「華北」全部有值;換成台北的 IP,電話區碼 02 有值,郵遞區號是空的。同一張表裡台灣資料的欄位填得比較少,這與前面說的探測範圍落差是同一件事。

對開發者的實際影響只有一條:依 country_code 做地區分流的邏輯,會把台灣使用者歸進 cn。如果產品慣例是看 country 欄決定語系或內容,這裡就會分錯組。做法是改用 prov 或 big_area 判斷,台灣流量在這兩個欄位的值是穩定的。這是從兩組實測推出來的規律,正式上線前建議拿自己的真實流量抽樣驗一次,特別是台灣與海外佔比高的服務。

文件範例裡 58.30.0.0 的電信商寫中國移動,實測回的是國研科技/歌華有線,這類資料本來就會隨時間漂移,把單次查詢結果當恆真寫死在程式裡,遲早會出狀況。

免費版的數字邊界:每分鐘 60 次、沒有 SLA

免費版的頻率上限是每個 IP 每分鐘 60 次查詢,這是官方規範。一般網站後端更該做的是加上快取:登入頁想顯示來源地、留言表單想過濾垃圾流量,同一個 IP 短時間內重複查詢的結果快取起來,60 次的額度對絕大多數網站都用不完。

查詢失敗時的行為也要先想好。免費版沒有 SLA,服務中斷或額度被擋時,來源地顯示這種裝飾性功能應該靜默帶過,擋垃圾流量這種安全功能則要設計成查不到就保守處理,兩種用途的失敗策略不同,接線時分開寫。

準確率的數字值得看仔細。官方在常見問題頁自揭:中國區域城市級準確率 99.2%、電信商 99.4%,區縣級只有 41.4%。這些是站方自己宣稱的數字,但區縣那個 41.4% 是官方自己寫出來的,而且區縣欄位本來就排在 VIP 欄位裡,免費版拿到的區縣永遠是空的。想定位到區縣級的人,免費版直接排除。

行動網路是另一個官方承認的誤差源。手機基地台分配的 IP 在城市甚至省內動態輪換,站方建議對行動用戶改用 IPv6 再查一次,準確率會提高。做以行動流量為主的產品,查詢端要保留 IPv6 的路徑,這件事在設計階段就要排進去。

要付費時解鎖什麼

超過免費額度或有穩定性需求時,官方的升級路徑分三層。VIP 版按次計費,最低 0.05 元人民幣一千次查詢,頻率上限放寬到每分鐘 180,000 次,SLA 99.95%,機房線路從社區贊助升級到阿里雲 BGP,並解鎖區縣、IP 類型、AS 號三個欄位;再往上是次數不限的方案;最頂層是私有化部署,把整套服務搬進客戶自己的機房,線路標示為客戶私有。後兩種在頁面上未公開標價,付費方案掛的都是每週七天、每天八小時的工作時間支援,急著上線的專案要先把對接節奏問清楚。站方對免費版的定位也寫得很直白:個人網站、開發測試、不保證 SLA,這條線是它自己畫的。

IP9 增值服務頁的方案對照表,比較免費版、VIP 版、VIP 不限量版與私有化部署的頻率限制、SLA 與價格差異Pin
免費版與 VIP 的方案對照,頻率限制與 SLA 是主要分界(圖片來源:IP9 官網截圖)

查詢會送到誰那裡

這是伺服器端的 API,每次查詢,目標 IP 加上發出請求的 IP 都會送到站方的基礎設施,這是所有線上 IP 查詢服務的通則,不是 IP9 特有的問題。差別在於送到誰那裡。IP9 網域掛的是河南省的 ICP 備案(豫ICP備2022012803號),服務條款寫明適用中華人民共和國法律,隱私政策是 2024 年 12 月生效的個資蒐集條款,開通需要帳號的付費服務時要透過境內手機號碼註冊並實名認證。免費查詢本身不用註冊,但隱私政策載明適用於網站所有服務,日誌條款也寫明會自動收集 IP 位址、查詢內容、電信商與存取時間等使用日誌;保存期限只給了達成目的所需期間的原則,查詢日誌實際留多久沒有具體數字。

規模可以從一個數字看出來:官網首頁有個即時計數器,實測當天上午顯示當日請求已超過 1,288 萬次,兩次載入頁面之間還在穩定增加。它不是殭屍服務,背後有真實的用量在跑。對 side project 與個人網站,這些背景資訊大概無感;對資料流向有合規考慮的正式產品,這條信任邊界要在接入前想清楚,想讓資料留在自己掌控範圍,自建一層代理或考慮能把資料留在自己帳號裡的 API 服務都是替代路線。

判斷:三種情境的接與不接

什麼樣的專案適合直接接?個人網站、side project、開發期的原型,以及以中國大陸訪客為主、需要城市與電信商層級查詢的服務。這些情境吃得到它最強的部分:免註冊、回應快、中國大陸 IP 解析到城市級,接線十分鐘內完成。台灣的網站要記得兩件事:分流邏輯改用 prov 或 big_area,顯示前把簡體值轉繁。isp 欄對台灣流量也有值,實測連中嘉數位這類有線電視寬頻上網的電信商都認得出來,想做電信商層級的流量統計,這個欄位比城市欄更實用。

暫時不適合的有三種。需要海外城市級解析的,它免費版只有國家級;需要 SLA 保證的正式服務,免費版明確不保證,要嘛升級 VIP 要嘛另找方案;查詢內容敏感、不願意送到境外基礎設施的,一開始就別考慮線上查詢服務。想順便比價網域資訊查詢工具的人,可以參考先前的 Next WHOIS 介紹,IP 位置查詢與網域註冊查詢是兩回事,混用會問錯問題。

接入前的最後一個動作:拿自己服務的真實流量抽 20 筆查一遍,看台灣與海外的解析結果長什麼樣。五分鐘的成本,比上線後才發現 country 欄的歸類與預期不同便宜得多。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 1311

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...