Appearance
手机基站IP查出来不对?试试IPv6二次查询
"为什么我的手机IP归属地查出来总是不对?"这是我在技术群里被问得最多的问题之一。
不是接口坏了,也不是数据错了,问题出在手机基站网络这个特殊的网络环境上。这篇讲清楚原因,以及一个立竿见影的解决办法:IPv6二次查询。
为什么手机IP会"不对"
手机走蜂窝网络(4G/5G)时,你的流量要经过运营商的基站、汇聚节点、再到核心网。而运营商给手机用户分配的IPv4地址,往往是从省级或市级的核心节点统一出口的。
于是就会出现这种情况:
- 你人在苏州的某个区,但IP归属地显示在"南京"(省会出口);
- 你手机连着基站,基站可能跨了区,IP就跟着"跳"了;
- 更极端的情况,同一部手机在不同的时间,IP归属地能显示不同的城市。
这不是"查错了",而是蜂窝网络IPv4的天然特性。 数据源再准也改不了这个事实。
为什么IPv6会好一些
这几年运营商大规模推IPv6,给移动用户分配IPv6地址时,分配机制相对更贴近实际接入的基站/汇聚节点。
打个不严谨但好懂的比方:
IPv4像是在"省城邮政总局"统一给你发件,所以从哪儿看都在省会;IPv6更像是"就近的邮局"给你发件,能更接近你所在的位置。
所以同样的手机,用IPv6查归属地,通常比IPv4准一个级别(能到市甚至区)。
具体怎么操作
方案A:优先用IPv6
如果你的应用能同时拿到用户的IPv4和IPv6(比如用户同时通过v4和v6访问),那就优先查IPv6:
python
def query_user_location(ipv4, ipv6):
target = ipv6 or ipv4 # 优先v6
r = requests.get(f"https://ip9.com.cn/get?ip={target}", timeout=3)
d = r.json()
if d.get("ret") == 200:
return d["data"]
return None方案B:IPv6二次确认
如果你已经用IPv4查了一次,结果跟用户实际位置差得离谱,可以再拿IPv6查一次对比:
python
def double_check(ipv4, ipv6):
info_v4 = query(ipv4)
info_v6 = query(ipv6) if ipv6 else None
if info_v6 and info_v6.get("city") != info_v4.get("city"):
# 以v6为准,更接近真实位置
return info_v6
return info_v4方案C:判断是否蜂窝网络
接口返回里如果能看到运营商信息(isp),再结合"是不是移动网络"判断。不过更实用的做法是:只要用户IP是IPv6,就默认按IPv6查询,不用纠结。
一个重要的提醒
IPv6二次查询不是万能的。以下几种情况,IPv6也救不了:
- 用户开了VPN/代理:查出来是代理服务器位置,跟用户无关;
- 用户走的企业WIFI:出口在企业,位置是企业所在地;
- 运营商IPv6出口也集中在某几个节点:部分场景仍有偏差。
所以我的建议是:IPv6二次查询作为"提升准确率的手段",而不是"绝对正确的保证"。
什么时候该用这套
- 做同城推荐、本地生活这类对位置敏感的,值得用;
- 做属地展示的,能准一点是一点;
- 做风控的,注意:位置不准会导致误判,IPv6二次查询能减少一部分误伤。
说在最后
手机基站IP的问题,是整个行业的通病,不是你一个人遇到。搞清楚原理,用对方法(IPv6优先),你的"手机用户IP不准"困扰能解决一大半。
剩下的那点误差,就交给时间——等IPv6普及率再高一点,这个问题会越来越小。
IP9 支持IPv4和IPv6查询:https://www.ip9.com.cn