使用Headless Chrome/Puppeteer登录Google时Heroku环境遇验证挑战
我之前也碰到过完全一样的问题!Heroku的云服务器环境对Google来说就是典型的“陌生可疑设备”,所以会跳出验证挑战。下面是我试过有效的几个解决办法,按优先级推荐:
解决Heroku上Puppeteer登录Google触发验证的方案
1. 复用本地已验证的Cookie(最省心的方案)
既然你本地已经能成功登录并存储Cookie,那直接把本地生成的已通过验证的完整Cookie迁移到Heroku就行,完全跳过登录流程:
- 步骤:
- 本地登录成功后,把Cookie导出成JSON文件(比如
google-valid-cookies.json) - 可以把这个文件上传到Heroku项目目录(记得不要加到.gitignore里),或者把Cookie序列化成字符串存在Heroku的Config Vars里
- Puppeteer启动后,先调用
page.setCookie(...cookies)加载Cookie,再导航到业务门户,就能直接处于登录状态
- 本地登录成功后,把Cookie导出成JSON文件(比如
2. 调整Puppeteer配置模拟真实浏览器
Google会检测浏览器指纹,Heroku默认的Puppeteer配置太“机器化”,得改得更像真实用户:
- 启动浏览器时添加这些参数:
const browser = await puppeteer.launch({ args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled', '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' ], headless: 'new', // 新版无头模式更接近真实浏览器行为 ignoreDefaultArgs: ['--enable-automation'] // 去掉暴露自动化的标志 });
- 页面加载前注入脚本隐藏自动化特征:
await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); });
3. 应急方案:启用Google“不太安全的应用”访问(不推荐长期用)
注意:这个选项现在Google已经逐步淘汰,只有部分旧账号还能开启。如果上面的方法暂时没效果,可以试试:
- 登录Google账号安全设置,找到“不太安全的应用访问权限”并开启
- 但这个方法有账号安全风险,只建议临时测试用
4. 生产环境最优解:使用Google服务账号
如果业务允许,用Google服务账号认证是最稳定的,完全不会触发人机验证:
- 去Google Cloud Console创建服务账号,下载密钥JSON文件
- 用
google-auth-library库获取认证令牌,然后在Puppeteer中设置对应的请求头,或者根据业务门户的认证逻辑直接用服务账号模拟登录
如果以上方法还是触发验证,你可以尝试在Heroku上临时启动非无头模式的Puppeteer,配合远程终端工具手动完成一次验证,然后保存Cookie复用,之后再切回无头模式。
内容的提问来源于stack exchange,提问作者sam4815
相关产品推荐
相关产品推荐

