CarrierLookup 归属运营商与携号转网的流程示意
本文所述流程的可视化概览。

关于运营商查询,最重要的一句话,也是最常被跳过的一句:结果是最初归属的运营商。它是号码发放时被分配到的那家运营商,不一定是今天承载它的那张网。

这篇文章其余所有内容,都是从这一个区分推出来的。

携号转网让"归属"和"当前"变成两个答案

在大多数市场里,用户可以保留号码、把它转到另一家运营商。发生之后,号码分配记录仍然显示它来自原来那个号段,而实际流量由别处承载。

运营商查询报告的是分配。它观测不到这次转网。所以对一个已转网的号码,你拿到的答案在历史上正确、在当下过时——而且重跑多少次都不会变,这不是数据新鲜度的问题,这就是这份数据源所描述的东西。

这让它非常适合一些用途,也彻底不适合另一些。按原始归属运营商给名单分段、理解一个国家号码空间的结构、按号段分配路由记录,这些都成立。决定把一条消息交给哪张网去发、或者断言某人可以在某家运营商上被联系到,这些不成立。

而且运营商查询完全不能确立可达性:电话不能、短信不能、任何消息应用都不能,更不能说明应用注册状态、账号活跃度或营销同意。那是另外的问题,有另外的答案。

读字段,但别读过头

同步结果可能带 carriernumber_typecountry_coderegioncity。取不到的字段返回的是空字符串,而不是把键省略掉,所以你的解析要把空字符串当作"未提供",而不是当作一个有意义的值。

regioncity 值得单独提醒。它们描述的是号码分配地理——号段被分配在哪里——不是某个人或某台设备现在在哪。一个在某城市分配的号码,被一个住在国家另一头的人使用,查询仍然会报那个分配城市。把这两个字段当作关于某个人的位置信号,是一个会带来真实后果的误读。

还有两个看起来像布尔的结果经常被误读。registered: true 表示找到了分配数据;registered: false 表示没找到分配数据——这是一个正常结果,不能当作号码已停机、不存在或非法的证明。在同步多号响应里,每一行的 exists 标志表示这一行是否产出了正常结果,exists: false 同样不是一个否定性的运营商结论。

选择请求形态

POST /api/v1/check 用 API key 做单号查询。POST /api/v1/batch-check 同步接受 1 到 100 个标识,并按输入顺序返回——如果你是按位置而不是按标识把结果拼回原行,这一点很关键。

更大的名单走 carrier_batch 服务类型的批量任务,单次接受同一个国家的 1,000 到 100,000 个有效号码,完成后异步下载。"同一个国家"这个约束值得在设计早期就考虑进去:一个混了多国号码的文件,是一个你迟早要拆开的文件。

参考来源