手机归属地查询在电商风控里能做什么:可用维度与不成立的用法

约 11 分钟 进阶手机号码归属地查询电商风控地域一致性号段分布
# 手机归属地查询在电商风控里能做什么:可用维度与不成立的用法 接口:手机归属地查询(apiCode=6,接入点 6-1)|是否免费:是,注册后默认可调用,设使用档次限制|请求方式:POST / GET|返回格式:JSON|适用人群:电商风控、数据分析和增长团队|阅读时间:约 8 分钟|最后实测核对:2026-09-18 一笔订单进来,收货地址写的是广东,手机号归属地是北京。这个信号能不能进风控特征?能,但要先分清哪些用法站得住、哪些只是看起来合理。这篇把可用的维度和不成立的用法分开讲清楚,避免把归属地当成它承担不了的东西。 ## 核心要点 - 归属地返回省和市两级,实测粒度不到区县,做地域判断时按这个精度设计。 - 手机号归属地反映的是号段归属,号码可以异地使用,它不等于用户当前所在地。 - 匹配粒度是前 7 位号段,同一号段的多个订单不必然构成异常信号。 ## 可用的三类维度 ### 一、号段归属地与申报地域的一致性 用户填的收货省份和号码归属省份不一致,是一个可以计算的信号。做法是把两边都归到编码再比。 ```python import requests def region_consistency(phone_seg: str, declared_prov_code: str) -> dict: """比对号码归属省份与用户申报省份是否同源。""" resp = requests.get( "https://route.showapi.com/6-1", params={"appKey": "YOUR_APPKEY", "num": phone_seg}, timeout=10, # 对齐官方 x-read-timeout ) data = resp.json() if data.get("showapi_res_code") != 0: return {"ok": False, "reason": "gateway_error"} body = data.get("showapi_res_body", {}) if body.get("ret_code") != 0: # -1 / -5 / -6 表示号段异常或查不到,这类号码本身值得单独记录 return {"ok": False, "ret_code": body.get("ret_code")} prov_code = str(body.get("provCode") or "") declared = str(declared_prov_code or "") return { "ok": True, "prov": body.get("prov"), "city": body.get("city"), "same_prov": bool(prov_code) and prov_code[:2] == declared[:2], "carrier_type": body.get("type"), "city_code": body.get("cityCode"), } ``` 用 `provCode` 做比对而不是用省名文字,原因是省名有多种写法。`provCode` 的文档口径是「本省身份证的前几位编码」,实测北京返回 `110000`,取前两位做前缀比对就够用。字段细节见[返回字段全解](https://www.showapi.com/guides/phone-attribution-response-fields-6)。 这个信号只适合当辅助特征。用户出差、异地收货、给父母下单,都会产生不一致。把它做成硬性拦截条件,会挡住真实订单。 ### 二、号段维度的批量特征 同一批注册或下单里,如果号码集中在少数几个号段,这个分布本身是可以统计的。做法是先取前 7 位去重再聚合。 实测确认归属地结果只跟前 7 位号段有关,`13800130000` 和 `13800139999` 返回完全一致。所以统计号段分布时,键取前 7 位: ```python import re from collections import Counter def to_segment(phone: str) -> str | None: cleaned = re.sub(r"[-\s]", "", (phone or "").strip()) if not re.fullmatch(r"\d{7,}", cleaned) or cleaned[0] == "0": return None return cleaned[:7] segments = [s for s in (to_segment(p) for p in order_phones) if s] dist = Counter(segments) top = dist.most_common(10) print(f"订单 {len(order_phones)} 笔,不同号段 {len(dist)} 个") print("集中度最高的号段:", top) ``` 号段集中度高不等于异常。真实的批量采购、企业客户、同一地区用户集中的活动,都会出现号段集中。这个指标适合用来观察趋势和分层,不适合直接下判定。 ### 三、运营商维度 `type` 返回 1 到 4 的数字枚举,可用于触达通道选择和运营分层。短信通道按运营商配置、不同运营商的到达率差异观察,这类用途不依赖地域信息,也不会因为号码异地使用而失效。 枚举取值与实测样本见 [type 字段全解](https://www.showapi.com/guides/phone-attribution-type-field-6)。 ## 不成立的三种用法 ### 当作实时位置 归属地是号段归属,跟号码当前使用地不是一回事。用户在北京办的号,人可以在广州下单,返回的 `prov` 仍然是北京。拿它做实时位置判断,结论会在跨城场景下失效。 ### 当作单一判定条件 「归属地与收货地不一致就拦单」这条规则拦不住真正想绕过的行为,因为换个号码的成本很低。它挡住的反而是异地收货的正常用户。可以作为加权特征,不要作为独立判据。 ### 当作地域销量的直接口径 要分析区域销售表现,用收货地址比用号码归属地准。归属地适合做补充维度,用来观察号码来源地和收货地之间的偏差分布。 ## 落地时的两个工程点 批量校验订单时,同一号段只需查一次。先把订单号码取前 7 位去重,再循环调用,最后按号段回填到订单上。完整的脚本写法见[用 Python 给 Excel 号码表批量补归属地](https://www.showapi.com/guides/phone-attribution-excel-batch-6)。 风控链路对延迟敏感,缓存要跟上。同一号段的重复查询直接命中本地缓存,缓存的粒度与实现见[按前 7 位号段做缓存](https://www.showapi.com/guides/phone-attribution-cache-6)。 计费方面,手机归属地查询是免费接口,注册后默认可调用,设使用档次限制;失败时 `showapi_fee_num` 为 0,输入的格式问题不会消耗额度。档位与并发上限见[免费接口与档位说明](https://www.showapi.com/free-api)。 ## FAQ **Q1:归属地能精确到区县吗?** 不能。返回的粒度是省和市两级,`city` 的文档定义就是「市」。需要区县维度时得配合其他数据源。 **Q2:号码归属地与用户所在地是一回事吗?** 不是。归属地反映号段归属,号码可以异地使用。适合做展示和辅助特征,不适合作为实时位置的判据。 **Q3:同一号段多笔订单算异常吗?** 不必然。企业客户、集中活动、同一地区用户聚集都会出现号段集中。这个指标适合观察趋势和分层,不适合单独下判定。 **Q4:归属地和收货地址不一致就拦单吗?** 不建议拦。异地收货、代下单、出差下单都会产生不一致。可以做成加权特征参与评分,同时保留人工审核入口。 **Q5:批量校验订单要调多少次接口?** 按不同号段数计算,不是订单数。实测归属地结果只跟前 7 位号段有关,同一号段查一次就能覆盖该号段下所有订单。 **Q6:查询失败会占用调用额度吗?** 不会。失败时 `showapi_fee_num` 为 0,文档口径是失败不扣点数。 ## 下一步阅读 - [手机归属地查询返回字段全解:11 个字段的类型、取值与粒度](https://www.showapi.com/guides/phone-attribution-response-fields-6) —— `provCode` 与 `cityCode` 的取值口径 - [手机归属地查询:用 Python 给 Excel 号码表批量补归属地](https://www.showapi.com/guides/phone-attribution-excel-batch-6) —— 批量校验的脚本骨架 - [手机归属地查询:按 cityCode 给收货号码匹配派送区域](https://www.showapi.com/guides/phone-attribution-logistics-6) —— 地域维度的另一个落地场景 - **本系列共 12 篇**:查看[手机归属地查询指南总目录](https://www.showapi.com/guides/phone-attribution-guides-6)
加载中...