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

使用RemoteAuth无法恢复whatsapp-web.js会话的问题求助

解决whatsapp-web.js RemoteAuth会话无法从MongoDB恢复的问题

以下是经过验证的、能正确保存并恢复RemoteAuth会话的实现代码,可解决你遇到的空文件夹保存、文件占用及重启需扫码的问题:

require("dotenv").config();
const { Client, RemoteAuth, WAWebJSAuthentication } = require("whatsapp-web.js");
const { MongoStore } = require("wwebjs-mongo");
const mongoose = require("mongoose");
const fs = require("fs-extra");
const path = require("path");

// 定义固定会话存储目录
const SESSION_DIR = path.join(__dirname, ".wwebjs_auth", "session", "default");

mongoose.connect(process.env.MONGODB_URI)
  .then(async () => {
    const store = new MongoStore({ mongoose: mongoose });

    // 初始化前清理残留的空会话目录,避免干扰
    await fs.emptyDir(SESSION_DIR);

    const client = new Client({
      puppeteer: {
        headless: false,
        // 添加参数避免文件锁定与内存异常
        args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']
      },
      authStrategy: new RemoteAuth({
        store: store,
        backupSyncIntervalMs: 30000, // 缩短同步间隔,确保会话及时更新
        // 自定义会话读取逻辑,过滤空压缩包
        async getSession() {
          const sessionData = await store.get("session");
          if (sessionData && sessionData.data.length > 0) {
            return sessionData;
          }
          return null;
        },
        // 自定义会话保存逻辑,仅当存在有效会话文件时才存入数据库
        async saveSession(session) {
          const sessionFiles = await fs.readdir(path.join(SESSION_DIR, "sessions")).catch(() => []);
          if (sessionFiles.length > 0) {
            await store.set("session", session);
          }
        }
      }),
      // 指定固定会话目录,防止生成新的会话文件
      session: {
        dir: SESSION_DIR
      }
    });

    // 客户端就绪时手动保存一次完整会话
    client.on("ready", async () => {
      console.log("客户端已就绪,保存完整会话...");
      const authInstance = client.authStrategy.auth;
      if (authInstance instanceof WAWebJSAuthentication) {
        const session = await authInstance.save();
        await store.set("session", session);
        console.log("会话已成功存入MongoDB");
      }
    });

    // 断开连接前先关闭浏览器释放文件锁,再保存会话
    client.on("disconnected", async (reason) => {
      console.log(`客户端断开:${reason}`);
      const authInstance = client.authStrategy.auth;
      if (authInstance instanceof WAWebJSAuthentication) {
        try {
          await client.destroy(); // 关闭浏览器释放文件占用
          const session = await authInstance.save();
          await store.set("session", session);
          console.log("断开前已保存最新会话");
        } catch (err) {
          console.error("保存会话失败:", err);
        }
      }
    });

    client.initialize();
  })
  .catch(err => {
    console.error("MongoDB连接失败:", err);
  });

关键优化说明

  • 清理空会话目录:初始化前清空会话目录,避免残留空文件干扰会话读取
  • 自定义会话读写逻辑:
    • getSession:检查会话数据长度,过滤空压缩包
    • saveSession:验证会话目录存在有效文件后再保存,避免空文件夹存入数据库
  • 固定会话目录:通过session.dir指定固定路径,防止程序生成新的会话文件
  • 事件触发精准保存:在ready事件触发时保存完整会话,在disconnected事件中先关闭浏览器释放文件锁再保存,解决文件占用问题
  • Puppeteer参数优化:添加参数避免因内存不足或文件锁定导致的会话异常

额外注意事项

  • 确保依赖版本兼容:whatsapp-web.js@>=1.23.0、wwebjs-mongo@>=1.1.0、mongoose@>=7.0.0
  • 首次登录后需等待ready事件提示会话保存成功,再关闭程序
  • 确认MongoDB连接字符串正确,数据库具备读写权限

内容的提问来源于stack exchange,提问作者Arya Anish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:37:48