You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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 });
  }
});

关键说明

  1. getChats()方法:返回所有聊天会话的数组,每个会话对象包含id、name、unreadCount、archived等属性,可根据需求自定义过滤规则(比如只保留有未读消息的会话)。
  2. 客户端存储:用Map保存已就绪的客户端,避免重复创建实例,同时方便后续接口调用。
  3. 事件时机:必须在ready事件触发后调用getChats(),此时客户端已完成初始化和认证,才能正常读取会话数据。

内容的提问来源于stack exchange,提问作者E. Zahra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:10:15