| 接口 | URL 示例 | 返回格式 | 性能(10萬次測試) | 穩定性 |
|---|---|---|---|---|
| 新浪 | https://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip= | JS 變量 | ~9萬/分鐘 | 高 |
| 淘寶 | https://ip.taobao.com/service/getIpInfo.php | JSON | ~5萬/小時 | 限流嚴格 |
| 騰訊 | 需申請 Key | JSON | 較好 | 需備案 |
public static String getIpInfoBySina(String ip) {
String url = "https://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=" + ip;
String js = HttpClientUtil.get(url); // 簡易 GET 請求
if (js.contains("ret\":1")) {
String province = extract(js, "province");
String city = extract(js, "city");
String district = extract(js, "district");
String isp = extract(js, "isp");
return province + city + district + isp;
}
return "";
}
// 從 JS 字符串提取字段值(處理 Unicode 轉義)
private static String extract(String js, String key) {
String val = StringUtils.substringBetween(js, "\"" + key + "\":", ",");
return val != null ? UnicodeUtils.decodeUnicode(val) : "";
}
public String getAddresses(String ip) {
String url = "https://ip.taobao.com/service/getIpInfo.php";
String param = "ip=" + ip;
String json = HttpUtil.post(url, param, "utf-8");
// 解析 JSON 並提取 country, area, region, city, county, isp
// 附帶完整 decodeUnicode 實現
}
// 簡單 Map 緩存,實際建議用 Guava Cache / Caffeine / Redis
private static final Map IP_CACHE = new ConcurrentHashMap<>();
public String getLocation(String ip) {
return IP_CACHE.computeIfAbsent(ip, this::callRemoteApi);
}
實測:淘寶接口 5 萬次耗時 1 小時,加入本地緩存後重複查詢耗時 < 1ms。
高併發實時查詢首選新浪接口 + 本地緩存;離線分析建議自建 IP 庫或購買商業服務;切勿直接在業務主流程同步調用遠程接口。