如何绕过WhatsApp扫码?实现Puppeteer持久化登录发送定时消息
解决WhatsApp Web Puppeteer自动登录复用问题
当然可以实现,不用数据库,直接利用Puppeteer的**用户数据目录(userDataDir)**就能保存登录状态,后续启动时自动复用,不用每次扫码。
原理说明
WhatsApp Web的登录状态存在浏览器的本地存储和会话Cookie里,Puppeteer允许你指定一个本地目录作为浏览器的用户数据目录,所有会话数据(包括登录状态)都会持久化在这里。第一次运行时扫码登录,关闭浏览器后数据会保留在目录中,下次启动浏览器时直接加载这些数据,就能跳过扫码步骤。
修改后的代码实现
const puppeteer = require("puppeteer"); const path = require("path"); // 指定用户数据目录,用绝对路径避免路径问题 const userDataDir = path.resolve(__dirname, "./whatsapp-session"); async function sendMorningMessage() { const browser = await puppeteer.launch({ headless: false, // 核心配置:指定目录保存会话数据 userDataDir: userDataDir }); const page = await browser.newPage(); await page.goto("https://web.whatsapp.com/"); // 等待联系人加载,超时设为60秒(第一次运行需要扫码登录) await page.waitForSelector("div[title='my_love']", { timeout: 60000 }); // 点击目标联系人 const targetContact = await page.$("div[title='my_love']"); await targetContact.click(); // 等待输入框加载完成 await page.waitForSelector("#main footer div.copyable-area p", { timeout: 10000 }); const inputBox = await page.$("#main footer div.copyable-area p"); await inputBox.type("Good Morning Beautiful"); // 发送消息 await page.keyboard.press("Enter"); // 延迟关闭浏览器,确保消息发送完成 setTimeout(async () => { await browser.close(); }, 3000); } sendMorningMessage();
关键操作步骤
- 第一次运行:启动程序后,手动扫码登录WhatsApp Web,登录完成后关闭浏览器,会话数据会自动保存到
./whatsapp-session目录中。 - 后续运行:再次启动程序时,浏览器会直接加载之前的会话,进入已登录状态,无需扫码,自动执行发消息逻辑。
注意事项
- 不要删除指定的
userDataDir目录,否则登录状态会丢失,需要重新扫码。 - 如果WhatsApp在其他设备登录导致当前会话失效,需重新扫码更新会话数据。
- 若使用
headless: true无头模式,部分会话处理可能有差异,建议先保持headless: false测试,稳定后再尝试无头模式。
内容的提问来源于stack exchange,提问作者Daniel Raviv
相关产品推荐
相关产品推荐

