如何使用Puppeteer处理Facebook OAuth2的双因素认证(2FA)
解决Puppeteer自动登录Facebook的2FA验证问题
针对你用Puppeteer自动登录Facebook获取User Access Token时遇到的2FA自动输入瓶颈,这里提供三个实用方案,均无需关闭2FA:
方案1:基于TOTP算法自动生成Microsoft Authenticator验证码
Microsoft Authenticator本质是基于**TOTP(时间-based一次性密码)**算法生成验证码,只要能拿到账号绑定2FA时的原始密钥,就能用代码实时生成验证码,完全不需要操作APP。
操作步骤:
- 获取TOTP密钥:在Meta账号的2FA设置页面,选择「无法使用验证器应用」,系统会显示一串Base32格式的密钥(类似
JBSWY3DPEHPK3PXP),将其存入.env文件(比如命名为FB_TOTP_SECRET)。 - 安装依赖库:使用
speakeasy生成TOTP验证码:
npm install speakeasy
- 修改Puppeteer代码:在点击登录按钮后,添加2FA处理逻辑:
// 点击登录按钮后,等待2FA输入框加载完成 await page.waitForSelector('input[name="approvals_code"]'); // 生成实时TOTP验证码 const speakeasy = require('speakeasy'); const totpCode = speakeasy.totp({ secret: process.env.FB_TOTP_SECRET, encoding: 'base32' }); // 填入验证码并提交 await page.type('input[name="approvals_code"]', totpCode); await page.click('button[name="submit[Continue]"]'); // 继续等待跳转至回调URL await page.waitForNavigation();
方案2:通过短信转发API自动读取SMS验证码
如果账号用SMS接收验证码,可以借助第三方短信接收服务的API,自动获取最新验证码并填入。
操作步骤:
- 选择短信服务:注册支持短信接收+API查询的服务,绑定你的测试手机号。
- 调用API获取验证码:登录后调用服务API提取6位数字验证码,再填入2FA输入框:
// 点击登录后等待2FA输入框出现 await page.waitForSelector('input[name="approvals_code"]'); // 调用短信API获取验证码(示例,需替换为实际服务的接口) const fetch = require('node-fetch'); const smsResponse = await fetch(`https://your-sms-service-api/get-latest-code?phone=${process.env.FB_TEST_USER_PHONE}`); const smsData = await smsResponse.json(); const smsCode = smsData.code; // 填入验证码并提交 await page.type('input[name="approvals_code"]', smsCode); await page.click('button[name="submit[Continue]"]'); await page.waitForNavigation();
方案3:利用Facebook信任设备机制跳过2FA
登录一次后将设备标记为「信任」,后续使用同一个浏览器会话登录时,Facebook会跳过2FA验证。Puppeteer可通过保存用户数据目录实现会话持久化。
修改Puppeteer启动代码:
// 启动浏览器时指定用户数据目录,保存会话信息 const browser = await puppeteer.launch({ headless: false, userDataDir: './facebook-session' // 自定义本地目录路径 });
使用说明:
- 第一次运行代码时,手动完成2FA验证,并在Facebook弹出「信任此设备」时确认。
- 后续运行代码时,Puppeteer会加载之前保存的会话,直接跳过2FA步骤。
额外注意事项:
- 所有操作尽量模拟人工行为,比如输入账号密码时添加随机延迟(
await page.waitForTimeout(Math.random() * 1000 + 500)),避免触发Facebook反爬机制。 - 优先使用Meta开发者后台创建的官方测试用户,降低主账号被封风险。
内容的提问来源于stack exchange,提问作者marciodosanjos
相关产品推荐
相关产品推荐

