使用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
相关产品推荐
相关产品推荐

