如何在JavaScript中创建会话存储WhatsApp二维码以避免重复扫码?
解决WhatsApp聊天机器人重复扫描二维码的问题
核心思路
会话数据是whatsapp-web.js用来验证已登录状态的凭证,我们需要把首次登录后的会话数据保存到本地文件,下次启动时加载这个文件,就能跳过扫码步骤。
完整实现代码
先确保安装必要依赖:
npm install whatsapp-web.js qrcode-terminal dotenv fs
替换你的初始代码为以下内容:
const { Client } = require('whatsapp-web.js'); const qrcode = require('qrcode-terminal'); const fs = require('fs'); require('dotenv').config(); // 定义会话数据存储的本地文件路径 const SESSION_FILE_PATH = './session.json'; // 尝试读取已保存的会话数据 let sessionData; try { sessionData = require(SESSION_FILE_PATH); } catch (err) { // 文件不存在时会话数据为undefined sessionData = undefined; } // 初始化客户端,传入会话数据(如果有) const client = new Client({ session: sessionData, multidevice: true // 必须启用,适配新版WhatsApp多设备协议 }); // 监听认证成功事件,保存会话数据到本地文件 client.on('authenticated', (session) => { sessionData = session; fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), (err) => { if (err) { console.error('保存会话数据失败:', err); } else { console.log('会话数据已保存,下次启动无需扫码'); } }); }); // 监听二维码生成事件,输出到终端 client.on('qr', (qr) => { qrcode.generate(qr, { small: true }); console.log('请扫描上方二维码完成登录'); }); // 监听认证失败事件,删除失效的会话文件 client.on('auth_failure', () => { console.log('会话已过期或无效,请重新扫码登录'); if (fs.existsSync(SESSION_FILE_PATH)) { fs.unlinkSync(SESSION_FILE_PATH); } }); // 客户端就绪提示 client.on('ready', () => { console.log('客户端已就绪!'); }); // 启动客户端 client.initialize();
代码说明
- 会话数据读取:启动时自动读取本地
session.json文件,若文件存在则直接复用会话,跳过扫码流程。 - 会话持久化:首次登录成功后,
authenticated事件会返回有效会话数据,我们将其写入本地文件保存。 - 失效处理:若会话过期或无效,
auth_failure事件触发时自动删除旧会话文件,下次启动会重新生成二维码。 - 多设备支持:
multidevice: true是必填配置,适配新版WhatsApp的多设备协议,否则会话存储功能会失效。
你之前代码的问题
你使用的create({session: ...})并非whatsapp-web.js的正确用法,正确方式是在实例化Client时,通过构造函数传入session配置项,而非调用create方法。
内容的提问来源于stack exchange,提问作者Phillip Souza
相关产品推荐
相关产品推荐

