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

如何绕过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();

关键操作步骤

  1. 第一次运行:启动程序后,手动扫码登录WhatsApp Web,登录完成后关闭浏览器,会话数据会自动保存到./whatsapp-session目录中。
  2. 后续运行:再次启动程序时,浏览器会直接加载之前的会话,进入已登录状态,无需扫码,自动执行发消息逻辑。

注意事项

  • 不要删除指定的userDataDir目录,否则登录状态会丢失,需要重新扫码。
  • 如果WhatsApp在其他设备登录导致当前会话失效,需重新扫码更新会话数据。
  • 若使用headless: true无头模式,部分会话处理可能有差异,建议先保持headless: false测试,稳定后再尝试无头模式。

内容的提问来源于stack exchange,提问作者Daniel Raviv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:40:17