验证这个词背后隐藏着三个不同的问题。一个问号码的格式是否像真实号码。一个问是否有网络为它应答。一个问与你交互的人是否持有它。每个问题需要不同的检查方式,每种方式都留有未知。
格式检查能告诉你什么?
号码属于运营商被允许分配的号段。
Google 的 libphonenumber 在运营商可以自由将号码分配给订户时,将号段视为有效。其 FAQ 写道:
A valid number range is one from which numbers can be freely assigned by carriers to users.
有效性不能说明某个具体号码是否已被分配或是否能应答。同一页面写道:
Do not rely on libphonenumber to determine whether numbers are currently assigned to a specific user and reachable.
因此,格式检查回答的是关于编号计划的问题。它既不能说明号段是否已分配给任何人,也不能说明电话是否会响。
拨号也不是替代测试。FAQ 给出了呼叫可以接通无效号码的两个原因。有些国家会忽略末尾多余的数字,因此 1800 MICROSOFT 实际接通的是一个较短的号码。在号码重编期间,有些运营商会在旧号码已普遍停用后仍保持其可用。
网络查询能增加什么?
只有网络才掌握的那部分答案。
查询向运营商和号码情报来源询问特定号码,而非号段。这将若干问题从未知变为已回答:
| 检查项 | 返回内容 | 仍然未知的内容 |
|---|---|---|
| 格式 | 号码可解析且位于可分配的号段内 | 该号段是否已分配给任何人 |
| 线路类型 | 号码是移动号码、固定电话、VoIP、免费电话还是机器对机器 | 在更精细的粒度上该号段分配给了什么服务 |
| 服务网络 | 当前为该号码提供服务的网络,以及发放该号码的网络 | 终端是否已开机 |
| 携号转网状态 | 号码上次转网的时间 | 关于订户的任何信息 |
| 在线状态 | 号码是否已注册并能立即接收流量 | 谁在使用该终端 |
| 持有关系 | 无。查询从不询问本人 | 你的用户是否控制该号码 |
最后一行是注册流程中最关键的。没有任何查询能确认持有关系,因为查询从不涉及本人。
只有验证质询才能证明什么?
在你流程中的人能在该号码上接收流量。
libphonenumber FAQ 将质询视为唯一可行的答案,因为各国的编号实践差异太大,其他方式无法解决这个问题:
This is not technically feasible without such a verification step given the complicated international world we live in, with varying standardization practices in different regions.
发送验证码并接收回来,因此是与上述两种截然不同的检查方式。它需要一条消息和一个往返。它也是唯一能将号码与你面前的人关联起来的方式。OTP 是什么意思介绍了验证码本身,Verify 指南介绍了如何执行质询。
如何解读无人能回答的检查?
视为未知,这与否定不同。
无法确定在线状态的号码不等于不可达的号码。将二者等同对待会阻断那些网络只是未应答的客户。
Bird 在响应中将它们区分开来。你请求的每个属性都报告各自的 status:
ok:属性已被回答,其值存在。unavailable:没有收到回答,因此该块为null。inconclusive:收到了回答,但未能解析该属性。
只有 ok 携带值。在线状态块具有 status: ok 和 reachable: false 时是真正的否定,因为网络已回答并报告该号码不可达。
因此先对 ok 进行分支判断,其他情况一律视为未回答。状态词汇表是开放枚举,因此无法识别的值是未来的状态而非错误。对 ok 进行分支判断会随着词汇表扩展而始终正确。
如何选择电话号码查询服务商?
选择字段、市场覆盖和计费规则与你的决策需求匹配的服务商。
| 决策要点 | Bird Lookup | 对其他服务商应提出的问题 |
|---|---|---|
| 语法与有效性 | 要求国际号码格式,并报告号码是否符合编号计划。 | 它是否规范化输入并在不猜测的情况下拒绝格式错误的号码? |
| 线路类型与运营商 | 在基本结果中返回线路类型、服务网络和发放网络。 | 包含哪些运营商和线路类型字段,它们是当前值还是分配值? |
| 携号转网 | 在基本结果中报告携号转网状态,并可返回额外的携号转网数据。 | 它显示的是当前运营商、原始运营商还是转网历史? |
| 时效性 | 在线状态和漫游查询的是当前网络状况;其他字段描述编号和分配信息。 | 哪些字段是实时的、缓存的还是带时间戳的? |
| 未知结果 | 每个请求的属性具有 ok、unavailable 或 inconclusive 状态。 | 能否区分未回答的属性与否定结果? |
| 市场覆盖 | 即使查询成功,某些属性也可能对特定号码或运营商不可用。 | 哪些国家和运营商支持每个属性? |
| 计费 | 基本查询计费一次。可选属性仅在交付时计费,失败的属性不计费。 | 未回答的属性收费多少,哪些附加项会影响账单? |
排名列表中的替代方案展示了不同的权衡取舍。Twilio Lookup 提供基本的格式化和验证。可选包涵盖线路类型、线路状态、SIM 卡更换、身份信息、来电显示名称、已重新分配号码和风险信号。覆盖范围和审批条件因包和市场而异。
Abstract API 的电话号码验证文档介绍了有效性、国家、运营商和线路类型字段。Veriphone 的验证和运营商查询页面介绍了有效性、国家、运营商、线路类型和当前运营商结果。两者分别发布了覆盖范围和额度规则。每个服务商所记录的覆盖范围、未知结果行为和计费方式决定了它是否适合注册或路由决策。
如何在 Bird 上查询号码?
将号码发送到查询端点,读取你请求的数据块。
POST /v1/lookup/phone-number 接受一个 phone_number 和一个可选的 type 数组。每次查询都会返回服务网络和发放网络、携号转网状态、国家和线路类型。type 数组可添加 classification、porting、presence、roaming、sim_swap 或 score,每项单独计费且仅在交付时收费。查询不会联系该号码。
重复使用 Idempotency-Key 会返回已存储的结果,而不是执行并计费第二次查询。查询指南介绍了流程,API 参考文档介绍了各字段。
简而言之
有效意味着号段存在,而非号码正在使用。
Google 的电话号码库将有效号段定义为运营商可以自由分配给用户的号段。
接通的电话不能证明号码有效。
有些国家会忽略多余的尾部数字,有些运营商在号码重编期间会让旧号码继续工作,远超其他地方停止使用的时间。
只有质询才能证明持有关系。
发送验证码并收回它是唯一能确认谁持有该号码的检查方式,这就是验证作为独立步骤存在的原因。
未应答的检查不等于否定回答。
Bird 为每个请求的属性报告各自的状态,因此无人能回答的属性与被明确回答为否的属性始终可区分。