基于whatsapp-web.js与Express实现多会话:如何获取所有活跃会话?
获取WhatsApp机器人的所有活跃会话(whatsapp-web.js + Express)
先修正你代码里的一个小问题:await client.on('qr', ...) 是无效的,on是事件监听方法,不返回Promise,不需要用await修饰。
要获取所有活跃会话,你需要用到whatsapp-web.js提供的getChats()方法,且必须在客户端处于ready状态后调用这个方法——未就绪时无法获取有效会话数据。另外,你当前的代码每次请求/newWhatsappClient都会创建新的Client实例,建议把已初始化完成的客户端实例存储起来,方便后续管理和调用会话接口。
解决方案步骤
- 用全局存储(比如Map)保存已就绪的客户端实例
- 在客户端
ready事件触发后,调用getChats()获取所有会话 - 新增接口用于获取指定客户端的活跃会话
修改后的代码示例
// 全局存储已就绪的客户端实例 const activeClients = new Map(); app.post('/newWhatsappClient', async function (req, res) { const clientName = req.query.name; if (!clientName) { return res.status(400).json({ error: 'clientId is required' }); } // 如果客户端已存在,直接返回状态 if (activeClients.has(clientName)) { return res.json({ message: 'Client already active' }); } const client = new Client({ authStrategy: new LocalAuth({ clientId: clientName }), }); // 监听QR码事件,返回给前端 client.on('qr', (qr) => { res.json({ qrCode: qr }); }); // 客户端就绪后,存入全局存储并可立即获取会话 client.on('ready', () => { console.log(`${clientName} Client is ready!`); activeClients.set(clientName, client); // 可选:就绪后立即获取一次会话 client.getChats().then(chats => { console.log(`获取到${chats.length}个会话`); // 这里可将会话存入数据库或做其他处理 }).catch(err => { console.error('获取会话失败:', err); }); }); client.on('authenticated', () => { // LocalAuth策略下session返回undefined是正常的,它会将会话存在本地文件中 console.log('客户端已认证'); }); client.on('auth_failure', () => { console.log(`${clientName} 认证失败`); activeClients.delete(clientName); }); client.initialize(); }); // 新增接口:获取指定客户端的活跃会话 app.get('/getActiveChats', async function (req, res) { const clientName = req.query.name; if (!clientName || !activeClients.has(clientName)) { return res.status(400).json({ error: '客户端不存在或未就绪' }); } const client = activeClients.get(clientName); try { const chats = await client.getChats(); // 过滤活跃会话:排除已归档的,也可根据未读消息数、最后消息时间筛选 const activeChats = chats.filter(chat => !chat.archived); res.json({ totalChats: chats.length, activeChatsCount: activeChats.length, chats: activeChats.map(chat => ({ id: chat.id._serialized, name: chat.name || chat.id.user, unreadCount: chat.unreadCount, lastMessageTime: chat.lastMessage?.timestamp })) }); } catch (err) { res.status(500).json({ error: '获取会话失败', message: err.message }); } });
关键说明
getChats()方法:返回所有聊天会话的数组,每个会话对象包含id、name、unreadCount、archived等属性,可根据需求自定义过滤规则(比如只保留有未读消息的会话)。- 客户端存储:用
Map保存已就绪的客户端,避免重复创建实例,同时方便后续接口调用。 - 事件时机:必须在
ready事件触发后调用getChats(),此时客户端已完成初始化和认证,才能正常读取会话数据。
内容的提问来源于stack exchange,提问作者E. Zahra
相关产品推荐
相关产品推荐

