WhatsApp 号码查询 API:校验与补全手机号数据
WhatsApp 号码查询 API 能把一个原始手机号变成结构化数据:这个号码在 WhatsApp 上吗?如果在,它的公开资料显示了什么——头像、「关于」签名、企业信息,还是在线信号?你不必围着客户端搭建脆弱的自动化流程,只要调用一个 HTTP 接口,就能拿到 JSON 结果。
本文介绍「WhatsApp 号码校验与资料查询」项目里的各个接口、把它们串起来的 userHash 两段式流程,以及如何用 Python 调用而不浪费点数。
API 能做什么
这个项目围绕一个目标来组织接口,就是了解一个号码:
- 注册校验:
check-exist-by-phone、check-exist-by-cc-phone和check-active告诉你号码是否有可用的 WhatsApp 账号。 - 资料数据:
get-avatar和get-about返回头像与「关于」文本。 - 在线状态:
get-presence返回在线或最后在线信号,受对方隐私设置的限制。 - 企业资料:
get-biz-profile返回 WhatsApp 企业账号的商家信息。 - 批量校验:
batch-check-10一次请求最多校验 10 个号码。 - 稀疏的附加信息:
get-device-name、get-email和get-wa-old-device-name仅在校验结果表明存在时才可用。
第一步:获取 API Key
注册后打开控制台,复制一个有效的 API Key。新账户赠送免费点数,可以马上开始试验。
第二步:校验号码
check-exist-by-phone 是针对单个号码的轻量存在性检查,比完整的资料查询便宜。传入完整的国际号码即可:带不带 +、有没有空格或连字符、用不用 00 前缀都可以,接口会自动解析国家区号。
curl "https://api.opendata-api.com/api/project/whatsapp/check-exist-by-phone?key=YOUR_API_KEY&phoneNumber=15551234567"
结果字段 isExist 是三态值:true、false 或 null。null 表示结果不确定,正确的做法是稍后退避重试,而不是把号码标成未注册。isExist 为 true 时,响应还会包含:
userHash:用来授权下面几个较重查询的标识,有效期 24 小时。hasExtra:这个号码有哪些补充字段。已注册号码一定有头像和签名;deviceName、email和waOldDeviceName只在已知时才出现。
如果你本来就把国家区号和本地号码分开存储,check-exist-by-cc-phone 把它们作为 cc(不带 + 的拨号前缀,1 到 4 位)和 phone(本地号码,6 到 15 位,不带前导零)两个参数。如果只需要快速得到是或否,并且不打算做补全,check-active 对完整的国际号码直接返回一个活跃标志,不需要 userHash。
第三步:用资料数据补全
传入上一步得到的 userHash。号码本身由服务端解析,所以这些接口不接受电话号码参数,无效或过期的 hash 会被拒绝。
curl "https://api.opendata-api.com/api/project/whatsapp/get-avatar?key=YOUR_API_KEY&userHash=USER_HASH"
curl "https://api.opendata-api.com/api/project/whatsapp/get-about?key=YOUR_API_KEY&userHash=USER_HASH"
curl "https://api.opendata-api.com/api/project/whatsapp/get-biz-profile?key=YOUR_API_KEY&userHash=USER_HASH"
每个接口分别返回什么,以及空结果意味着什么:
get-avatar:pictureSet=true时返回临时的照片链接,以及头像变化时会跟着变化的版本 ID。pictureSet=false表示用户没有头像或隐藏了头像,reason会说明原因。get-about:返回「关于」文本和头像版本 ID。about为空表示没有签名文本,或者对方隐藏了它。get-biz-profile:商家名称、认证等级、简介、地址、邮箱、网站和入驻时间。个人号码会返回isBusiness=false。get-presence:在线状态或最后在线时间。如果对方不是你的联系人,并且隐私设置不是「所有人」,就不会返回在线信息,此时visible=false。这是真实的结果,无法绕过。单次调用最长可能需要约 17 秒,所以只在确实需要时才调用。
在做依赖这些字段的功能之前,请先阅读WhatsApp 头像、签名与在线状态能拿到什么。
不浪费点数的 Python 示例
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://api.opendata-api.com/api/project/whatsapp"
def get(operation, **params):
params["key"] = API_KEY
resp = requests.get(f"{BASE}/{operation}", params=params, timeout=60)
resp.raise_for_status()
body = resp.json()
# A reply can be wrapped more than once as {"code": ..., "data": {...}}
while isinstance(body, dict) and "code" in body and isinstance(body.get("data"), (dict, list)):
body = body["data"]
return body
def whatsapp_profile(number):
found = get("check-exist-by-phone", phoneNumber=number)
exists = found.get("isExist")
if exists is None:
return {"number": number, "status": "retry"}
if not exists:
return {"number": number, "status": "not_on_whatsapp"}
user_hash = found.get("userHash")
if not user_hash:
raise RuntimeError(f"no userHash in reply: {found}")
avatar = get("get-avatar", userHash=user_hash)
about = get("get-about", userHash=user_hash)
business = get("get-biz-profile", userHash=user_hash)
return {
"number": number,
"status": "registered",
"has_photo": bool(avatar.get("pictureSet")),
"about": about.get("about") or None,
"is_business": bool(business.get("isBusiness")),
"extras": found.get("hasExtra"),
}
print(whatsapp_profile("15551234567"))
只有已注册的号码才会走到资料查询那一步,校验结果不确定的号码会被标记为待重试,而不是被丢弃。
我该用哪个接口?
| 目标 | 接口 |
|---|---|
| 在注册表单里校验单个号码 | check-exist-by-phone 或 check-active |
| 一次校验一小批号码 | batch-check-10 |
| 清洗大型名单 | 每 10 个一批,见批量校验指南 |
| 展示头像或「关于」文本 | check-exist-by-phone,再调 get-avatar / get-about |
| 识别企业账号 | get-biz-profile,或 batch-check-10(同时报告是否为企业账号) |
如果你还在几个通讯工具之间做选择,WhatsApp 与 Telegram 查询对比会比较两者各自能返回什么。单个号码的基础步骤,请看如何检测号码是否在用 WhatsApp。
应用场景
- 线索资格审查:在线索分配给销售之前先校验并补全。
- 名单清洗:让 CRM 联系人只保留 WhatsApp 可触达的号码。
- 注册引导:在切换到 WhatsApp 渠道前,确认用户能收到消息。
- 数据研究与补全:规模化地为已知号码补充公开资料。
最佳实践
- 先校验,再补全。 没通过注册校验的号码,跳过资料查询。
null当作重试。 不确定的结果只是暂时性的。- 缓存校验结果。 保存
isExist、userHash和时间戳,24 小时内直接复用 hash,不要重复校验。 - 不要承诺字段一定有。 头像、签名和在线状态取决于每个人自己的隐私设置。
- 保持合规。 只处理你有合法依据使用的号码,并遵守 WhatsApp 的条款。
常见问题
userHash 是什么,为什么需要它? 它是注册校验针对已注册号码返回的标识。头像、签名、企业资料、在线状态以及附加信息这些资料接口,都需要它来授权较重的查询,有效期 24 小时。
isExist 返回 null 是什么意思? 说明结果不确定,比如出现了临时性的故障。请稍后退避重试,不要把它当作「没有 WhatsApp」。
怎么判断一个号码是不是 WhatsApp 企业账号?
用 userHash 调用 get-biz-profile,个人号码会返回 isBusiness=false。如果要一次判断很多号码,batch-check-10 会为每个号码同时报告注册状态和是否为企业账号。
使用这些查询需要我自己有 WhatsApp 账号吗?
不需要。这些接口只要 API Key,加上号码或 userHash,你不需要创建会话,也不用绑定账号。发送消息是另一套流程,那套流程才需要会话。
为什么「关于」文本是空的? 空值表示对方没有设置签名文本,或者隐藏了它。这是正常的结果,不是错误。
立即开始
在 WhatsApp 号码校验页面直接在线体验,阅读 check-exist-by-phone 与 get-avatar 接口文档,准备超出免费点数时再查看定价。