如何在Heroku服务器保存whatsapp.web.js登录信息实现重启自动重连
解决Heroku部署whatsapp.web.js自动重连问题
可以实现服务器重置后自动重新连接,核心是把多设备模式下的会话数据持久化存储,而不是依赖Heroku的临时文件系统(重启后本地文件会全部丢失)。
关键思路
WhatsApp多设备模式下,登录会话不是存在单一的session.json文件,而是由WABrowserId、WASecretBundle、WAToken1、WAToken2等核心字段组成的对象。只要把这个对象存在持久化存储中,重启后客户端就能读取并自动恢复登录状态。
具体实现步骤
选择持久化存储服务
Heroku支持多种Add-ons来做持久化,推荐用Heroku Redis(轻量、适合存储小体积的会话数据),或者PostgreSQL。自定义认证策略
替换whatsapp.web.js默认的LocalAuth(本地文件存储),实现自己的认证策略,从持久化存储中读取和写入会话数据。以Redis为例,先安装依赖:
npm install ioredis然后编写自定义认证类:
const { Client } = require('whatsapp-web.js'); const Redis = require('ioredis'); // 初始化Redis客户端,Heroku会自动把Redis URL注入环境变量 const redisClient = new Redis(process.env.REDIS_URL); class RedisAuth { // 读取会话数据 async getSession() { const sessionData = await redisClient.get('whatsapp_session'); return sessionData ? JSON.parse(sessionData) : null; } // 保存会话数据 async saveSession(session) { await redisClient.set('whatsapp_session', JSON.stringify(session)); } // 清除会话(可选,用于登出场景) async clearSession() { await redisClient.del('whatsapp_session'); } } // 初始化WhatsApp客户端,使用自定义的Redis认证策略 const client = new Client({ authStrategy: new RedisAuth() }); client.on('ready', () => { console.log('客户端已就绪,自动登录成功'); }); client.on('auth_failure', () => { console.log('认证失败,需重新扫码登录'); // 这里可以添加清理旧会话的逻辑 redisClient.del('whatsapp_session'); }); client.initialize();配置Heroku环境
- 安装Heroku Redis Add-on:在Heroku控制台的应用页面,进入"Resources"标签,搜索并添加Heroku Redis。
- 确保
REDIS_URL环境变量已自动配置(Heroku会自动设置)。
注意事项
- Heroku的dyno每天会自动重启一次,只要会话数据在Redis中存在,重启后客户端会自动读取并恢复连接,无需手动扫码。
- 多设备会话的有效期较长,但如果超过30天未使用可能失效,此时需要重新扫码并更新存储的会话数据。
- 绝对不要依赖Heroku的本地文件系统存储任何需要持久化的数据,所有关键数据都要存在外部存储服务中。
内容的提问来源于stack exchange,提问作者yossi lerer
相关产品推荐
相关产品推荐

