使用whatsapp-web.js批量发消息时出现wid无效错误求助
解决whatsapp-web.js批量发送消息时的"invalid wid"错误
问题根源
- forEach的异步并发陷阱:forEach不会等待内部async函数执行完成,所有发送请求会同时发起,干扰WhatsApp Web的Puppeteer上下文,导致生成无效的wid(WhatsApp内部用户ID)。
- 批量号码存在无效值:拆分后的号码可能混入空字符串、长度不足的无效号码,触发格式错误。
- 频率限制触发:短时间内大量请求触发WhatsApp的反爬机制,导致接口返回异常。
修复方案
1. 改用顺序执行的循环(替代forEach)
用for...of循环替代forEach,确保每个异步操作完成后再执行下一个,避免并发冲突:
app.post("/send", async (req, res) => { const numbersBox = req.body.mobiles; // 拆分后过滤空号码,避免无效处理 const numbers = numbersBox.split(",").map(num => num.trim()).filter(num => num); const message = req.body.message; // 顺序处理每个号码 for (const eachNumber of numbers) { try { const sanitized_number = eachNumber.toString().replace(/[- )(]/g, ""); // 提前检查号码长度,避免生成无效格式 if (sanitized_number.length < 10) { console.log(`无效号码:${eachNumber},长度不足`); continue; } const final_number = `91${sanitized_number.substring(sanitized_number.length - 10)}`; const number_details = await client.getNumberId(final_number); if (number_details) { // 使用WhatsWeb认可的标准格式发送,避免wid错误 const sendMessageData = await client.sendMessage(number_details._serialized, message); console.log(`消息发送成功:${final_number}`); } else { console.log(`${final_number} 未注册WhatsApp`); } // 添加延迟,降低频率限制风险,可根据情况调整时长 await new Promise(resolve => setTimeout(resolve, 1000)); } catch (error) { console.error(`发送失败 ${eachNumber}:`, error.message); } } res.status(200).send("批量发送任务已启动"); });
2. 关键优化点
- 过滤无效号码:拆分后先去除空格、过滤空字符串,避免处理无效值。
- 使用标准格式发送:
number_details._serialized是WhatsApp Web内部认可的用户ID格式(如91xxxxxxxxx@c.us),比直接拼接号码更可靠。 - 添加请求延迟:每个请求后加1秒左右的延迟,降低触发频率限制的概率。
- 单个错误隔离:用try/catch包裹每个号码的处理逻辑,避免单个失败导致整个批量任务中断。
3. 额外检查项
- 确保
client实例已完全初始化(需在ready事件触发后再处理发送请求)。 - 验证传入的
mobiles参数格式,避免多余分隔符或无效字符。
内容的提问来源于stack exchange,提问作者prudhvi
相关产品推荐
相关产品推荐

