如何批量校验 WhatsApp 号码(每次请求最多 10 个)
逐个调用 API 校验号码,对单次注册来说没有问题,但当你需要清洗成千上万条线索名单时,这就不是合适的做法了。批量校验让你每次请求检测多个号码,既节省整体耗时,也减少 HTTP 调用的次数。
本文介绍 batch-check-10 接口,它能在单次请求中校验最多 10 个 WhatsApp 号码,并给出一个可以安全处理整份文件的 Python 脚本:先去重、失败会重试、中断后可以续跑。
为什么批量校验很重要
- 速度。 每次调用 10 个号码,同样一份名单大约减少十倍的网络往返。
- 更易管理限流。 需要调度、控速和重试的请求更少。
- 管道更干净。 一次调用为批次里的每个号码都返回结果,可以直接写入数据库或 CSV。
第一步:获取 API Key
注册后在控制台复制一个有效 Key。账户赠送免费点数,可以先用小文件测试。
第二步:发起批量请求
把完整国际号码用逗号分隔,传给 accounts 参数:
curl "https://api.opendata-api.com/api/project/whatsapp/batch-check-10?key=YOUR_API_KEY&accounts=15551234567,15557654321,442071234567"
响应会为批次里的每个号码分别报告它是否在 WhatsApp 上,以及它是不是企业账号。企业信息相当于免费的附加内容,方便你在同一轮处理中把名单分成个人和企业两类。
第三步:用 Python 扩展到整份名单
把名单切成每组 10 个,每组调用一次接口,并且边处理边写入磁盘。下面的脚本会先去重,失败的批次会退避重试,每个批次写一行 JSON,所以中断的任务可以接着跑,已经完成的工作不会重做。
import json
import os
import time
import requests
API_KEY = "YOUR_API_KEY"
URL = "https://api.opendata-api.com/api/project/whatsapp/batch-check-10"
OUT = "whatsapp_results.jsonl"
def chunks(items, size=10):
for i in range(0, len(items), size):
yield items[i:i + size]
def load_done():
done = set()
if os.path.exists(OUT):
with open(OUT) as fh:
for line in fh:
done.update(json.loads(line)["requested"])
return done
def check_batch(batch, attempts=4):
for attempt in range(attempts):
try:
resp = requests.get(
URL,
params={"key": API_KEY, "accounts": ",".join(batch)},
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
except (requests.RequestException, ValueError):
time.sleep(2 ** attempt) # 1s, 2s, 4s, 8s
return None
def run(numbers):
unique = sorted({n.strip() for n in numbers if n.strip()})
done = load_done()
todo = [n for n in unique if n not in done]
failed = []
with open(OUT, "a") as out:
for batch in chunks(todo):
result = check_batch(batch)
if result is None:
failed.extend(batch)
continue
out.write(json.dumps({"requested": batch, "result": result}) + "\n")
out.flush()
return failed
numbers = [line.strip() for line in open("numbers.txt")]
print("still to retry:", run(numbers))
有几个细节值得带进你自己的实现:
- 请求的号码列表和原始结果一起保存。 这样你随时可以核对「问了什么」与「返回了什么」,脚本也不依赖响应里每个号码的结果具体怎么排布。
- 每个批次之后调用
flush()。 进程崩溃时,最多只会重复一个批次。 - 失败的号码会返回,而不是被吞掉。 重新运行脚本时,只会重新发送还没有保存结果的号码。
节省点数和时间的技巧
- 先去重。 去掉重复号码,同一个号码永远不要查两遍。
- 分批前先归一化。 保留数字和国家区号,剔除明显不是手机号的值。
- 保存结果。 保存结果时带上时间戳,按周期(比如每月)复查,不必每次营销前都重查。
- 优雅处理失败。 对失败的批次做退避重试,对反复失败的号码做记录,方便单独重跑。
- 控制节奏。 先用顺序请求,测量之后再按需要增加并行的工作线程。
- 只补全留下来的号码。 清洗完成后,只对通过的号码做资料查询,见 WhatsApp 号码查询指南。
单个检测与批量检测
如果是在实时注册表单中校验号码,请用单号码的 check-exist-by-phone 或更快的 check-active,两者都不必等凑够 10 个号码。如果是离线清洗名单,就用 batch-check-10 来提高吞吐量。单个号码的完整说明,包括三态的 isExist 结果,请看如何检测号码是否在用 WhatsApp。
跨渠道的批量检测
不在 WhatsApp 上的号码,可能在别的渠道仍然能够触达。清洗后的名单正好可以作为线索核验工作流的起点,把剩下的号码送去做 Telegram、Viber 和 Signal 的检测。如果你的受众也用 Snapchat,可以看看 Snapchat 号码查询是怎么处理批量请求的。
常见问题
一次请求最多能检测多少个号码?
batch-check-10 最多 10 个。把它们用逗号分隔,放进 accounts 参数。名单更长时,拆成每组 10 个并循环处理。
每个结果包含什么? 响应会为每个号码分别报告它是否在 WhatsApp 上,以及它是不是企业账号。
批量请求失败了怎么办? 用指数退避重试,如果仍然失败,就记录这些号码,之后单独重跑。上面的脚本会返回失败的号码,下次运行时跳过已完成的批次。
注册表单里该用批量还是单个检测?
用单个检测。check-exist-by-phone 或 check-active 对一个号码立即作答,而批量接口是为离线清洗较大的名单设计的。
名单多久复查一次比较合适? 请按名单变化的快慢来定复查周期,活跃名单例如每月复查一次;对即将用于重要用途的号码,则应更早复查。
立即体验
在 WhatsApp 号码校验页面在线测试批量查询,或阅读 batch-check-10 接口文档。查看定价可估算你名单规模所需的点数成本。