手机归属地查询:物流/外卖场景,收货号码归属地校验与派送分区
# 手机归属地查询:物流/外卖场景,收货号码归属地校验与派送分区
> **接口**:手机归属地查询 `6-1` | **是否免费**:是(注册默认可免费调用,有使用档次限制)| **请求方式**:POST / GET | **返回格式**:JSON | **适用人群**:物流 / 外卖 / 仓储调度同学 | **阅读时间**:约 8 分钟
## TL;DR
- 用 `areaCode` / `cityCode` / `prov` / `city` 把收货号码映射到派送区与配送站,做分区与时效预估。
- 接口**不返回经纬度**,地图标点或路径规划需配合外部地理编码服务;归属地只给"文字省市区号"。
- **携号转网不支持**(官方能力边界),收货人真实所在地请以物流轨迹 / 收货地址为准。
## Why:物流调度为什么看归属地
外卖和物流在接单、分单时,常常需要一个"先把订单归类到哪个配送站/区域"的初判。收货号码的归属地(省、市、区号、城市编码)是一组**标准化、零维护**的结构化字段,可以直接拿来和你的配送站点表做匹配:号码归属在"昆明",就大概率归入昆明仓/昆明配送站管辖,便于提前做运力预估和时效承诺。
需要明确边界:归属地是**号段归属**,不是收货人当前 GPS 位置。它最适合做"初分"和"校验"——比如用户填的收货城市与号码归属城市明显跨省,可以提示地址疑似填错;或作为区域件量统计的低成本维度。真正决定派送路径的,仍然是收货地址和物流轨迹。
## What:接入前准备与接口速览
前置条件:
1. 在 [易源官网](https://www.showapi.com) 注册账号(免费服务,注册默认可调用)。
2. 进入 [AppKey 管理页](https://www.showapi.com/console#/myApp) 复制 AppKey,替换下方 `YOUR_APPKEY`。
3. 准备一张"城市编码→配送站"的映射表(你们内部维护)。
| 项目 | 内容 |
|------|------|
| 接口名称 | 手机归属地查询 |
| 接入点 | `6-1`(仅 1 个接入点,同步请求-响应) |
| 接口地址 | `https://route.showapi.com/6-1?appKey={your_appKey}` |
| 请求方式 | POST 或 GET |
| 必填参数 | `num`(手机号,字符串) |
| 返回格式 | JSON,业务数据在 `showapi_res_body` |
| 计费 | 免费服务(设使用档次限制);**失败不扣点数** |
| 更新频率 | 半年更新一次新号段归属地 |
| 注意 | **不支持携号转网**;**无经纬度** |
## How:号码映射到配送分区
### 步骤 1 · 查询归属地
```python
import requests
API_URL = "https://route.showapi.com/6-1"
APP_KEY = "YOUR_APPKEY" # 替换为你的真实 AppKey
def query_attribution(phone: str):
try:
resp = requests.get(
API_URL,
params={"appKey": APP_KEY, "num": phone},
timeout=10,
)
data = resp.json()
body = data.get("showapi_res_body", {})
if body.get("ret_code") == 0:
return body
return None # 失败不扣点数,可放心重试/跳过
except Exception:
return None
```
### 步骤 2 · 按 `cityCode` 匹配配送站
用返回的 `cityCode`(城市编码,本城市身份证前几位)和内部站点表匹配,命中即归入对应配送站。
```python
# 示例:城市编码 -> 配送站/区域(你们内部维护)
STATION_MAP = {
"530100": "昆明主城站",
"530300": "曲靖站",
"310100": "上海站",
}
def route_to_station(phone: str) -> dict:
body = query_attribution(phone)
if body is None:
return {"station": None, "reason": "查询失败/号码格式错"}
city_code = body.get("cityCode") # 如 "530100"
city = body.get("city") # 如 "昆明"
prov = body.get("prov") # 如 "云南"
area_code = body.get("areaCode") # 如 "0871"
station = STATION_MAP.get(city_code)
return {
"prov": prov,
"city": city,
"cityCode": city_code,
"areaCode": area_code,
"station": station, # 未命中为 None,可兜底到省份仓
"flag": "ROUTED" if station else "FALLBACK_PROV",
}
print(route_to_station("18908711111"))
# -> {'prov': '云南', 'city': '昆明', 'cityCode': '530100',
# 'areaCode': '0871', 'station': '昆明主城站', 'flag': 'ROUTED'}
```
### 步骤 3 · 时效预估与异常提示
`areaCode`(城市区号,如昆明 `0871`)可用于展示"本地件/跨区件"标签,辅助时效承诺话术;当收货城市与号码归属城市不一致时,提示地址疑似填错。
```python
def check_city_consistency(phone: str, ship_city: str) -> dict:
body = query_attribution(phone)
if body is None:
return {"match": None}
matched = (body.get("city") == ship_city)
return {
"phone_city": body.get("city"),
"ship_city": ship_city,
"match": matched,
"hint": "OK" if matched else "ADDRESS_MAYBE_WRONG",
}
```
> 量大时同样是"用户侧脚本循环调用",受免费档位限制。建议先做 11 位/纯数字客户端校验,命中站点结果做本地缓存(详见系列缓存篇)。
## 返回示例与解析
```json
{
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_id": "ce135f6739294c63be0c021b76b6fbff",
"showapi_res_body": {
"num": 1890871,
"prov": "云南",
"ret_code": 0,
"areaCode": "0871",
"name": "电信",
"cityCode": "530100",
"postCode": "650000",
"provCode": "530000",
"type": 2,
"city": "昆明"
}
}
```
| 字段 | 含义 | 调度用途 |
|------|------|----------|
| `prov` | 省 | 省份仓兜底、区域统计 |
| `city` | 市 | 与收货城市比对、初分 |
| `cityCode` | 城市编码(本城市身份证前几位) | 精准匹配配送站/区域 |
| `areaCode` | 城市区号(如 0871) | 本地/跨区件标签、时效话术 |
| `postCode` | 邮政编码(来源:返回示例/产品说明) | 辅助邮区归类 |
| `ret_code` | 0 成功其他失败 | 失败不扣点数 |
> 字段完整含义见 [《手机归属地返回字段全解》](https://www.showapi.com/guides/phone-attribution-response-fields-6)。
## 进阶 / 边界
- **无经纬度**:接口只返回文字省市、区号、编码,**没有经纬度**。要做地图标点、路径规划或电子围栏,必须用 `prov` / `city` 配合外部地理编码服务转坐标。
- **携号转网不支持**:号码携转后归属仍按原号段,可能和用户实际收件城市不同。调度初分允许偏差,真实派送以收货地址和物流轨迹为准。
- **失败不扣点数**:`ret_code != 0` 时不消耗额度,可在循环里对每个号码做格式前置校验。
- **免费档位限制**:循环调用受免费档位上限约束,量大务必做客户端校验 + 本地缓存。
- **`areaCode` 取值以真实区号为准**:文档参数表曾有 `0810` 笔误,官方返回示例为昆明 `0871`,本文以真实区号 `0871` 为准。
## FAQ
**Q1:能直接用归属地做精确派送路径规划吗?**
不能。接口无经纬度,只能给出省市/区号/编码文字。路径规划需外部地理编码把 `city` 转坐标后再算。
**Q2:携号转网的用户,归属地会跟着变吗?**
不会。这是官方能力边界,携转后仍以原号段归属为准,调度时不要把归属地等同于"当前所在地"。
**Q3:`cityCode` 和 `areaCode` 有什么区别?**
`cityCode` 是城市编码(本城市身份证前几位,如 `530100`),适合和内部站点表做精确匹配;`areaCode` 是城市区号(如 `0871`),适合做本地/跨区标签与话术。
**Q4:大批量订单循环调用会超免费额度吗?**
会。免费服务有使用档次限制,且 ShowAPI 没有官方批量查询。请先做号码格式校验,再循环调用并缓存结果。
**Q5:收货城市填错能靠归属地发现吗?**
可以做一个"软提示":号码归属城市与填写收货城市不一致时,标记为"地址疑似填错"进入复核,但不要强制拦截。
**Q6:`postCode` 字段可靠吗?**
可靠,它出现在返回示例与产品说明("省、市、邮编、区号")中,可辅助邮区归类;官方参数表未登记,本文标注其来源为返回示例/产品说明。
## 相关能力 / 下一步阅读
- [《手机归属地返回字段全解:prov/city/type/postCode 一文读懂》](https://www.showapi.com/guides/phone-attribution-response-fields-6) —— 每个字段类型、取值与坑位
- [《type 字段全解:1移动/2电信/3联通/4广电/-1未知怎么用》](https://www.showapi.com/guides/phone-attribution-type-field-6) —— 运营商枚举实战用法
- [《电商风控:用归属地识别异常下单与区域分布》](https://www.showapi.com/guides/phone-attribution-ecommerce-6) —— 归属地做一致性比对与区域聚合
- **本系列共 12 篇**:查看[手机归属地查询 · 官方指南总目录](https://www.showapi.com/guides/phone-attribution-guides-6)