手机归属地查询 type 字段全解:1移动/2电信/3联通/4广电/-1未知怎么用
# 手机归属地查询 type 字段全解:1移动/2电信/3联通/4广电/-1未知怎么用
> **接口**:手机归属地查询 `6-1` | **是否免费**:是(注册默认可免费调用,有使用档次限制)| **请求方式**:POST / GET | **返回格式**:JSON | **适用人群**:后端开发、风控/客服系统接入者 | **阅读时间**:约 6 分钟
## TL;DR
- `type` 是**运营商枚举数字**(1移动/2电信/3联通/4广电/-1未知),`name` 是它的**中文名**,两者一一对应,建议同时取用。
- 广电对应 `type=4`(192 号段),是较新运营商,命中后即识别为广电,查不到归属地时回 `-1` 未知。
- 用一张 Python 映射表就能把 `type` 转成业务话术/风控标签,**失败不扣点数**,可放心批量识别。
## Why:为什么单独讲 type 字段?
很多系统接到归属地返回后,第一件事不是看省市,而是**判断运营商**——客服弹屏要切对应话术、风控要标记异网号码、短信网关要分通道发送。这时候你有两个字段可用:`name`("移动"/"电信"/… 的中文名)和 `type`(1/2/3/4/-1 的枚举数字)。
`name` 读起来直观,但做条件分支时字符串比对容易拼错、还多语言时难维护;`type` 是稳定枚举,switch/字典映射更干净。**本文帮你把 `type` 的取值、与 `name` 的关系、广电识别的坑、以及一段可直接抄的映射代码**一次讲清,避免你在自己的业务代码里重新造轮子。
## What:前置条件与接口速览
| 项目 | 内容 |
|------|------|
| 接口名称 | 手机归属地查询 |
| 接入点 | `6-1`(仅 1 个接入点,同步请求-响应) |
| 接口地址 | `https://route.showapi.com/6-1?appKey={your_appKey}` |
| 必填参数 | `num`(手机号,字符串),无其他必填项 |
| 返回中与运营商相关的字段 | `type`(枚举数字)、`name`(中文名) |
| 计费 | 免费服务;**失败不扣点数** |
| 能力边界 | **不支持携号转网**,返回按原号段归属 |
### type 枚举取值表
| type 值 | 含义 | 对应 name | 典型号段示例 |
|---------|------|-----------|--------------|
| `1` | 中国移动 | 移动 | 139 / 138 / 188 |
| `2` | 中国电信 | 电信 | 189 / 133 / 199 |
| `3` | 中国联通 | 联通 | 130 / 131 / 186 |
| `4` | 中国广电 | 广电 | 192 |
| `-1` | 未知 | 未知(或无 name) | 找不到归属地时返回 |
> 注意:`type` 与 `name` 是**同一事实的两种表达**——`type` 是机器友好的枚举,`name` 是人类可读的中文运营商名。官方示例里出现过 `type=1` 但 `name` 为占位符 `test` 的情况,以及参数表示例 `type=1`、返回示例 `type=2` 的冲突;**以枚举定义为准**:数字定运营商,中文名跟随。本文后续映射以枚举表为唯一事实来源。
## How:把 type 用进你的业务
### 步骤 1 · 先拿到返回里 type 和 name
以 `18908711111`(云南 昆明 电信)为例,先发一次请求取 `showapi_res_body`:
```python
import requests
API_URL = "https://route.showapi.com/6-1"
APP_KEY = "YOUR_APPKEY"
PHONE = "18908711111"
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:
print("查询失败,错误码:", body.get("ret_code"), "(失败不扣点数)")
raise SystemExit(1)
t = body.get("type") # 此处为 2
n = body.get("name") # 此处为 "电信"
print("type =", t, "name =", n)
```
### 步骤 2 · 用映射表把 type 转成业务标签
`type` 是枚举,最稳的做法是用字典一次性映射,不要在代码里散落一堆 `if str == "移动"` 的字符串比较:
```python
# type 枚举 → (中文名, 业务标签, 是否本网)
TYPE_MAP = {
1: ("移动", "cmcc", True),
2: ("电信", "ctcc", True),
3: ("联通", "cucc", True),
4: ("广电", "cBN", True), # 广电 192 号段
-1: ("未知", "unknown", False),
}
def classify(t):
name, tag, home = TYPE_MAP.get(t, ("未知", "unknown", False))
return name, tag, home
name, tag, home = classify(t)
print(f"运营商:{name}(标签 {tag}),本网={home}")
```
这样无论你要做**话术分流**(home 网走标准话术、异网走关怀话术)、**风控标记**(type=-1 进入人工复核)、还是**短信通道选择**(按 tag 落不同网关),都只要改 `TYPE_MAP` 与下游调用,不碰判断逻辑。
### 步骤 3 · 广电(192 号段)识别注意点
- 广电是较新运营商,号段以 `192` 开头,命中时 `type=4`、`name="广电"`。
- 若号码归属地查不到(如全新号段尚未入库),接口返回 `type=-1` 且 `name` 可能为"未知"——**不要当成"查到了但无运营商",而是"查不到归属地"**,应走错误/未知分支。
- 广电与移动/电信/联通三网共享部分基站,但**接口只按号段判定,不涉及网络实测**,所以结果稳定可缓存(详见本系列缓存篇)。
## 返回示例与解析
```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": "昆明"
}
}
```
| 字段 | 类型 | 含义 | 本例值 | 与 type 的关系 |
|------|------|------|--------|----------------|
| `type` | Number | 运营商枚举(1移动/2电信/3联通/4广电/-1未知) | `2` | 机器可读的运营商标识 |
| `name` | String | 运营商中文名 | `电信` | 与 `type=2` 一一对应 |
| `ret_code` | Number | 0 成功,其他失败 | `0` | 非 0 时 type/name 不可信 |
> 字段完整含义见 [《手机归属地返回字段全解:prov/city/type/postCode 一文读懂》](https://www.showapi.com/guides/phone-attribution-response-fields-6)。
## 进阶 / 边界
- **type 与 name 必须同源校验**:建议以 `type` 为准、用本地映射生成中文名,而不是直接信任返回的 `name`,可规避文档中 `name` 占位符/示例冲突带来的脏数据。
- **不支持携号转网**:用户携号转网后,接口仍按原号段返回 `type`,不会反映实际在用网络。这是能力边界,不是字段不准。
- **失败不扣点数**:`ret_code != 0` 时 type/name 不可信且**不扣额度**,做运营商识别前先做格式校验更省心。
- **免费档位限制**:免费调用有使用档次上限,批量识别运营商请配合本地缓存(按号段前 7 位缓存 type 结果)。
## FAQ
**Q1:type 和 name 用哪个更好?**
用 `type` 做逻辑判断,`name` 仅做展示。推荐像本文那样用本地映射表以 `type` 为准生成中文名,避免字符串比对与文档示例冲突带来的脏数据。
**Q2:广电号码会返回 type=4 吗?**
会。广电(192 号段)命中时 `type=4`、`name="广电"`。查不到归属地时返回 `type=-1`(未知),需与"查到但无运营商"区分开。
**Q3:携号转网的用户 type 会变吗?**
不会。接口按原号段判定,`type` 反映号段归属网络,不反映实际在用网络,这是官方明确的能力边界。
**Q4:type=-1 是什么情况?**
表示无法判定运营商/找不到归属地,通常与 `ret_code` 非 0(如 -5/-6 找不到归属地)一起出现,应走未知分支,不要当成某家运营商。
**Q5:能否只用 type 做短信通道分流?**
可以,把 `TYPE_MAP` 的 tag 接到你的网关路由即可。但注意免费档位限制与失败不扣点数,建议配合客户端格式校验与本地缓存控制调用量。
**Q6:返回的 name 出现 test 之类占位符怎么办?**
以 `type` 枚举为准,用本地映射生成中文名。文档参数表/返回示例存在占位符与数值冲突,枚举定义是唯一事实来源。
## 相关能力 / 下一步阅读
- [《手机归属地查询:从注册到第一条返回》](https://www.showapi.com/guides/phone-attribution-quickstart-6) —— 还没跑通接口先看这篇
- [《手机归属地返回字段全解:prov/city/type/postCode 一文读懂》](https://www.showapi.com/guides/phone-attribution-response-fields-6) —— 每个字段类型与坑位
- [《错误码排查:-2 非11位 / -3 非数字 / -4 格式 / -5-6 找不到》](https://www.showapi.com/guides/phone-attribution-error-codes-6) —— type 异常多半伴随这些错误码
- [《CRM/客服系统接入:来电即显示归属地与运营商》](https://www.showapi.com/guides/phone-attribution-crm-6) —— 把 type 用于话术分流的实战
- **本系列共 12 篇**:查看[手机归属地查询 · 官方指南总目录](https://www.showapi.com/guides/phone-attribution-guides-6)