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

WhatsApp Web JS已关联会话初始化却出现二维码问题求助

会话二维码1
会话二维码2

问题描述

各位技术同仁好:我尝试调用数据库中已在WhatsApp上处于活跃状态的所有会话,但启动这些已完成认证的会话时,却出现了二维码,这不符合预期,请问该如何解决?

(注:远程会话已存储在数据库中,我可以看到相关文件)

WhatsApp客户端类代码

class WhatsappClient {
  constructor(id, store) {
    this.client = new Client({
      restartOnAuthFail: true,
      puppeteer: {
        headless: true,
        args: [
          '--no-sandbox',
          '--disable-setuid-sandbox',
          '--disable-dev-shm-usage',
          '--disable-accelerated-2d-canvas',
          '--no-first-run',
          '--no-zygote',
          '--disable-gpu',
        ],
      },
      authStrategy: new RemoteAuth({
        clientId: id,
        store: store,
        backupSyncIntervalMs: 400000,
      }),
    });
  }

会话启动逻辑代码

const getAllSessions = await sessionsModel
    .find({
      status: 'connected',
      remoteSessionSaved: true,
      groupid: { $ne: null },
    })
    .lean();
  logger.info(
    `${JSON.stringify(getAllSessions)} all sessions to listen to `
  );
  let store;
  if (mongoStoreForWhatsappSessions[0]) {
    store = mongoStoreForWhatsappSessions[0];
  } else {
    store = new MongoStore({ mongoose });
  }

  getAllSessions.map(async (session) => {
    const { client } = new WhatsappClient(session?.id, store);
    client.on(QR, async (qr) => {
      logger.info('qr recieved the session is logged out ', session?.id);
      const sessionsUpdate = await sessionsModel.findOneAndUpdate(
        {
          id: session?.id,
        },
        {
          loggedOutStatus: 'logout',
        }
      );
      client.destroy();
    });
    client.on(READY, async () => {
      logger.info(
        'Whatsapp is ready! for session and to store all the data',
        session?.id
      );
      const messagesSent = await getAllMessagesInfoAndStoreInDB(
        client,
        session?.groupid,
        session?.communityObjectId
      );
    });
    await client.initialize();
  });
解决思路与方案

1. 严格匹配RemoteAuth的clientId

确认session?.id和数据库中存储会话时使用的clientId完全一致,注意大小写、特殊字符,避免MongoDB返回的ID存在格式转换问题(比如ObjectId转字符串后的差异)。

2. 统一复用MongoStore实例

当前代码中Store实例的复用逻辑可能存在隔离问题,建议全局使用单例Store,确保所有客户端读取同一份会话数据:

// 改为全局单例模式,避免重复创建Store
const store = mongoStoreForWhatsappSessions[0] || new MongoStore({ mongoose });

3. 关闭认证失败自动重启

restartOnAuthFail: true会在认证失败时反复重启客户端,可能导致持续触发QR事件,先关闭该选项排查真实问题:

this.client = new Client({
  restartOnAuthFail: false, // 修改为false
  // 其余配置保持不变
});

4. 检查会话数据完整性

确认MongoDB中对应会话集合(默认wwebjs-sessions)里,匹配clientId的记录包含完整的auth字段(需包含WABrowserId、WASecretBundle、WAToken1、WAToken2),若数据损坏或过期,需重新认证后再存储。

5. 修正异步循环的资源竞争问题

map(async ...)会导致多客户端同时初始化,引发存储读取冲突,改用for...of循环确保顺序初始化:

// 替换原map循环
for (const session of getAllSessions) {
  const { client } = new WhatsappClient(session.id, store);
  // 绑定事件和初始化逻辑不变
  await client.initialize();
}

6. 添加认证失败事件监听

通过AUTH_FAILURE事件获取详细错误信息,精准定位问题:

client.on('AUTH_FAILURE', (msg) => {
  logger.error(`会话认证失败: ${session.id}, 原因: ${msg}`);
});

内容的提问来源于stack exchange,提问作者Mohammed Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:45:04