
IP 地址查询接口实测评测5 个实测可用的接口实测时间2026-08-10 方式本机 curl 真实请求逐个发包验证样本114.114.114.114国内江苏南京电信、8.8.8.8海外美国本文只推荐实测通过的接口未通过的列在文末附录注明具体死因。写在前面IP 归属地查询是个看起来极其简单的需求——一个 HTTP 请求换一个地名。但真到要选一个接口用的时候你会发现网上的写法五花八门参数名不一样、有的只支持 HTTP、返回编码也各有各的脾气稍不注意就拿到空数据或者一堆乱码。有个坑最值得先提醒判断成功不能只看 HTTP 状态码。有些接口照常返回 HTTP 200、JSON 结构完好、字段一个不少但内容全是空的。代码判状态码通过、解析成功、写进库等到发现不对劲可能已经攒了几万条未知。所以下面每个接口的判断逻辑都落到了业务字段上。这次我们实测了几个流传最广的免费 IP 查询接口把能稳定跑通的整理出来测国内 IP、也测海外 IP附上每个的真实返回和可直接抄的代码。下面是实测可用的几个以及各自的脾气。1. 可用接口总览接口请求地址中文HTTPS编码需要Key百度 opendatahttps://opendata.baidu.com/api.php?query{ip}coresource_id6006oeutf8✔✔UTF-8否太平洋 pconlinehttps://whois.pconline.com.cn/ipJson.jsp?ip{ip}jsontrue✔✔GBK否ip-api.comhttp://ip-api.com/json/{ip}?langzh-CN✔✘UTF-8否ipinfo.iohttps://ipinfo.io/{ip}/json✘✔UTF-8否限额ShowAPI 20-1https://route.showapi.com/20-1?appKey{appKey}✔✔UTF-8✔补充一个curl https://ifconfig.me/ip是通的但它只返回你自己的出口 IP不能查指定 IP严格说不算同类工具本文不做展开。2. 百度 opendata —— 最省事的那个无需 key、支持 HTTPS、返回 UTF-8三个条件同时满足的只有它。本地调试首选。curlhttps://opendata.baidu.com/api.php?query114.114.114.114coresource_id6006oeutf8实测返回节选{status:0,data:[{OriginQuery:114.114.114.114,location:江苏省南京市 电信,origip:114.114.114.114,titlecont:IP地址查询,resourceid:6006}]}⚠️ 参数名是query不是apiquery。这个坑值得单独说。网上流传的写法里有相当一部分把参数写成apiquery。我实测过明确报错curlhttps://opendata.baidu.com/api.php?apiquery114.114.114.114coresource_id6006oeutf8# {status:1,msg:参数错误,data:[]}一个错误写法能传播到这个程度说明转载的人多实际跑过的人少。其他要注意的成功时status是字符串0失败时是数字1。类型不一致判断时别直接地址在data[0].location是「江苏省南京市 电信」这么一整个字符串省市和运营商没有拆开要自己切海外 IP 只到国家级。查8.8.8.8返回的location就俩字「美国」importrequestsdefquery_baidu(ip):rrequests.get(https://opendata.baidu.com/api.php,params{query:ip,co:,resource_id:6006,oe:utf8},timeout5)dr.json()ifstr(d.get(status))!0ornotd.get(data):returnNonereturnd[data][0].get(location)3. 太平洋 pconline —— 国内定位最准的那个如果你的业务只面向国内这个的省市准确度是这批里最好的。curl-shttps://whois.pconline.com.cn/ipJson.jsp?ip114.114.114.114jsontrue\|iconv-fGBK-tUTF-8实测返回{ip:114.114.114.114,pro:江苏省,proCode:320000,city:南京市,cityCode:320100,region:,regionCode:0,addr:江苏省南京市 电信,regionNames:,err:}字段拆得比百度细省、市分开给还带行政区划编码直接能入库。但它有三个坑一个比一个隐蔽其一必须走 HTTPS。实测http://明确返回403 Forbidden只有https://是 200。这一条要特别注意——网上能搜到的示例几乎清一色写的是http://直接复制粘贴必挂而且 403 这个错误码容易让人误以为是被反爬了实际只是协议问题。其二返回是 GBK。不是 UTF-8。不转码就是满屏乱码。其三海外 IP 只到国家。查8.8.8.8的实测结果{ip:8.8.8.8,pro:,city:,addr: 美国,err:noprovince}省市全空err字段有值。好在它诚实——err非空就是明确告诉你这次没查全可以拿来做判断依据。做海外业务的话这个接口直接排除。一个小彩蛋省掉ip参数就是查自己的出口 IP。curl-shttps://whois.pconline.com.cn/ipJson.jsp?jsontrue|iconv-fGBK-tUTF-8# {ip:116.54.67.111,pro:云南省,city:昆明市,addr:云南省昆明市 电信,err:}Python 版注意那行encodingimportrequestsdefquery_pconline(ip):rrequests.get(https://whois.pconline.com.cn/ipJson.jsp,params{ip:ip,json:true},timeout5)r.encodinggbk# ← 关键漏了就是乱码returnr.json()4. ip-api.com —— 字段最全的那个免费接口里唯一同时给经纬度、时区、ASN 的。curlhttp://ip-api.com/json/114.114.114.114?langzh-CN实测返回{status:success,country:中国,countryCode:CN,region:SD,regionName:山东,city:济南市,zip:250000,lat:36.6518,lon:117.12,timezone:Asia/Shanghai,isp:China Unicom Shandong Province network,org:NanJing XinFeng Information Technologies, Inc.,as:AS137702 Nanjing, Jiangsu Province, P.R.China.,query:114.114.114.114}字段丰富度确实是第一档的。但代价也明显免费版不支持 HTTPS。实测https://ip-api.com/...直接连接失败不是证书问题是根本不监听。这意味着如果你的站点跑在 HTTPS 上前端直连会被浏览器的混合内容策略拦掉只能放到服务端调。限速 45 次/分钟按来源 IP 计。好在它把余量放在响应头里了实测X-Rl: 44 ← 本窗口剩余次数 X-Ttl: 60 ← 窗口重置倒计时秒有这两个头就能做自适应限流不用瞎猜。这点比那些一声不吭直接封你的接口友好得多。国内精度是短板。上面那个例子它把江苏南京的114.114.114.114判成了山东济南——省都错了。反倒是海外 IP 准得多。定位一句话海外看它国内别指望。批量查询也支持一次最多 100 个同样计入限速curl-XPOSThttp://ip-api.com/batch-HContent-Type: application/json\-d[{query:114.114.114.114,lang:zh-CN},{query:8.8.8.8,lang:zh-CN}]5. ipinfo.io —— 海外场景的选择curlhttps://ipinfo.io/8.8.8.8/json实测返回{ip:8.8.8.8,hostname:dns.google,city:Mountain View,region:California,country:US,loc:37.4056,-122.0775,org:AS15169 Google LLC,postal:94043,timezone:America/Los_Angeles,anycast:true}字段设计是这批里最规范的给 hostname给 ASN给邮编甚至标了anycast: true——对做网络分析的人来说这个字段挺有用。HTTPS 原生支持匿名就能调。缺点也直接全英文没有中文地名要展示给国内用户得自己做映射。国内定位偏差同样明显114.114.114.114被它判成了上海。匿名调用有配额限制量大需要注册 token。定位很清楚做海外业务用它做国内业务别碰。6. ShowAPI「全球IP归属地查询」—— 有服务商兜底的一个选项接口页https://www.showapi.com/apiGateway/view/20服务商昆明秀派科技有限公司官方自营 分类交通地理免费服务注册即用无需单独购买前面 4 个免费接口好用归好用但有一个现实问题没有 SLA也没有人对它负责。太平洋和百度本质是人家自家业务的副产品——不是对外开放的产品随时可能加验证、加频控甚至某天就没了而且不会有任何通知。ShowAPI 这个接口是商业化托管的有服务商主体有工单售后有 OpenAPI 规范文档定位精确到县区前面几个最多到市。它的代价也要说清楚要注册拿 appKey、有调用额度、免费额度用完后要付费。把它当成多花一点接入成本、换来更稳一点的备选就行。6.1 接入点接入点地址入参用途超时全球IP地址查询https://route.showapi.com/20-1?appKey{appKey}ipIP → 地理位置5sPOST / GET 都支持实测都能打通网关。6.2 调用示例# IP 查地理位置curl-XPOSThttps://route.showapi.com/20-1?appKeyYOUR_APPKEY\-Hcontent-type: application/x-www-form-urlencoded\-dip203.0.113.220返回结构{showapi_res_code:0,showapi_res_error:,showapi_res_id:ce135f6739294c63be0c021b76b6fbff,showapi_fee_num:1,showapi_res_body:{country:中国,region:广东,city:东莞,county:,isp:电信,area:华南,continents:亚洲,en_name:China,en_name_short:CN,city_code:441900,lnt:113.760234,lat:23.048884,ret_code:0}}字段是这批里最全的中英文国家名、片区、洲、行政区划码、经纬度、运营商一次给齐。⚠️ 必须判两层状态码外层showapi_res_code网关级0为成功内层showapi_res_body.ret_code业务级0为成功只判外层会漏掉业务层面的失败。这是网关型 API 的通用模式不熟悉的人很容易只判一层。6.3 鉴权与错误码鉴权走URL query 参数appKeyOpenAPI 里定义为apiKey / in: query。appKey 在控制台 https://www.showapi.com/console#/myApp 获取。我用无效 key 探了一下网关错误语义分得很清楚场景showapi_res_codeshowapi_res_errorHTTP完全不传 appKey-1002appKey err200appKey 无效-1004appKey err200正常0200-1002和-1004区分了没传和传错排查时能省事。但注意最后一列HTTP 状态码恒为 200无论成功失败。这和文末附录里那两个假活接口是同一个道理——判断成败必须解析 bodyHTTP code 在这里没有信息量。6.4 免费额度与计费页面标注「免费服务 / 免费接口注册即用无需单独购买」。返回体里的showapi_fee_num是本次调用的计费次数可以直接拿来对账。剩余额度在控制台「免费接口额度」看。7. 横向对比维度百度opendata太平洋ip-apiipinfo.ioShowAPI 20-1HTTPS✔✔✘✔✔中文✔✔✔✘✔编码UTF-8GBKUTF-8UTF-8UTF-8国内精度省市省市准省市有误判差县区海外精度仅国家仅国家好好好经纬度✘✘✔✔✔运营商✔✔✔✘✔行政区划码✘✔✘✘✔限速未公示未公示45/分匿名限额按额度正式文档✘✘✔✔✔ OpenAPISLA/售后✘✘✘付费版✔ 官方自营需要 Key✘✘✘✘✔这张表里的行各有取舍免费接口胜在零成本、即开即用短板是没文档、没售后、精度或协议有缺ShowAPI 胜在字段全、有服务商兜底、精度到县区代价是要 key、有额度。按自己场景挑就行没有哪个是全能最优。8. 选型建议场景推荐本地调试 / 一次性脚本百度 opendata无 key、HTTPS、UTF-8最省事只查国内、要省市准确太平洋 pconline记得 HTTPS GBK 转码要经纬度 / 时区 / ASNip-api服务端调用注意 45/分限速与无 HTTPS纯海外业务ipinfo.io只想知道自己的公网 IPcurl https://ifconfig.me/ip生产环境 / 县区精度ShowAPI 20-1需 appKey注意额度一句话总结免费接口零成本、即开即用适合脚本和轻量场景真要上生产要么选有服务商兜底的商业接口要么自己做好多源降级留好后路。9. 生产环境参考实现多源降级比较务实的做法免费接口当能用就用的加速层商业接口兜底。既压住了成本又不至于全线挂掉。importrequests TIMEOUT5SHOWAPI_KEYYOUR_APPKEY# 从 https://www.showapi.com/console#/myApp 获取def_baidu(ip):rrequests.get(https://opendata.baidu.com/api.php,params{query:ip,co:,resource_id:6006,oe:utf8},timeoutTIMEOUT)dr.json()ifstr(d.get(status))0andd.get(data):locd[data][0].get(location)ifloc:return{src:baidu,addr:loc}returnNonedef_pconline(ip):rrequests.get(https://whois.pconline.com.cn/ipJson.jsp,params{ip:ip,json:true},timeoutTIMEOUT)r.encodinggbk# GBK必须dr.json()ifd.get(addr)andnotd.get(err):# err 非空说明只查到国家return{src:pconline,addr:d[addr],province:d.get(pro),city:d.get(city),city_code:d.get(cityCode)}returnNonedef_ipapi(ip):rrequests.get(fhttp://ip-api.com/json/{ip},params{lang:zh-CN},timeoutTIMEOUT)dr.json()ifd.get(status)success:return{src:ip-api,addr:f{d.get(country,)}{d.get(regionName,)}{d.get(city,)},lat:d.get(lat),lon:d.get(lon),isp:d.get(isp)}returnNonedef_showapi(ip):rrequests.post(fhttps://route.showapi.com/20-1?appKey{SHOWAPI_KEY},data{ip:ip},headers{content-type:application/x-www-form-urlencoded},timeoutTIMEOUT)dr.json()ifd.get(showapi_res_code)!0:# -1002 缺key / -1004 key无效returnNonebd.get(showapi_res_body)or{}ifstr(b.get(ret_code))!0:# 业务级状态必须再判一层returnNonereturn{src:showapi,addr:f{b.get(country,)}{b.get(region,)}{b.get(city,)}{b.get(county,)},isp:b.get(isp),lat:b.get(lat),lon:b.get(lnt),city_code:b.get(city_code)}defquery_ip(ip):按 免费源 → 商业源 顺序降级任一成功即返回forfnin(_baidu,_pconline,_ipapi,_showapi):try:resfn(ip)ifres:returnresexceptException:continuereturn{src:None,addr:未知}if__name____main__:foripin(114.114.114.114,8.8.8.8):print(ip,-,query_ip(ip))注意每个函数的返回判断——没有一个是只看 HTTP 状态码的全部落到了业务字段上。这是这次实测最重要的一条经验。10. 踩坑清单HTTP 200 不等于调用成功。ShowAPI 鉴权失败返回 200附录里两个失效接口也返回 200 但数据全空。判断必须落到业务字段。太平洋必须走 HTTPS。http://是 403而网上示例几乎全写的http://。太平洋返回 GBK。不转码就是乱码。百度 opendata 参数是query不是apiquery。后者明确返回「参数错误」但错误写法流传甚广。ip-api 免费版没有 HTTPS。前端直连会被混合内容策略拦截。别抄别人示例里的第三方 key。实测那些流传的腾讯地图 key 已停用、百度地图 ak 已禁用全都会报错。要用就自己申请。网关型 API 要判两层状态码。外层网关 内层业务缺一不可。免费接口的稳定性要心里有数。这类接口随时可能加验证、加频控甚至下线上线前务必自行复测上线后最好加监控。附录实测不可用请勿使用网上流传的 IP 查询接口不少但大多需要自备 key 或已不稳定本文只收录实测稳定可用的几个。用任何接口时有一条要牢记最该警惕的是假活接口返回 HTTP 200、JSON 字段齐全但内容恒为空例如恒返回127.0.0.1或0.0.0.0。彻底挂掉的接口会当场暴露而假活接口会安静地污染你的数据直到某天有人问为什么这批用户的归属地全是未知。所以无论用哪个接口判断成败一定要落到业务字段上别只看 HTTP 状态码。本文所有接口状态均为 2026-08-10 实测结果。免费接口变动频繁请以自测为准。