【发布时间】:2022-07-15 23:45:50
【问题描述】:
我正在使用 puppeteer 执行一些动作并拍摄屏幕截图。整个过程有多重身份验证,首先是 Gmail 登录,然后 SSO 重定向到 Microsoft,然后我们从它们进入应用程序。我面临的问题是,当我设置我的浏览器 - 无头:假时,一切正常,但是当我设置无头:真时,Gmail 开始要求验证码,有时它说,浏览器不安全。
我已经尝试解决这个问题很长一段时间了,但我完全被蒙蔽了。我已经通过互联网阅读并找到了很多选项,例如设置用户代理、添加首选项等,但它们都不起作用。
这是我的简单代码和屏幕截图。
// puppeteer-extra is a drop-in replacement for puppeteer,
// it augments the installed puppeteer with plugin functionality
const puppeteer = require('puppeteer-extra');
//puppeteer.use(require('puppeteer-extra-plugin-stealth')());
// add stealth plugin and use defaults (all evasion techniques)
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
console.log(StealthPlugin.availableEvasions);
puppeteer.use(StealthPlugin());
//const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha')
//const puppeteer = require('puppeteer')
// puppeteer usage as normal
puppeteer.launch({ headless: true, executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', setUserAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36' }).then(async browser => {
console.log('Running tests..')
const page = await browser.newPage()
//await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36')
await page.goto('https://accounts.google.com/signin/v2/identifier?service=mail&passive=1209600&osid=1&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&followup=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&emr=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin')
await page.waitForTimeout(5000)
await page.setViewport({ width: 1300, height: 950 });
await page.waitForTimeout(1000)
await page.screenshot({path: '1.png', fullPage: true})
await page.waitForSelector('[type="email"]')
await page.type('[type="email"]', 'nxxxx@xxxx.com');
await page.keyboard.press('Enter');
await page.waitForTimeout(1000);
//await page.solveRecaptchas()
//await page.waitForNavigation({'waitUntil':'domcontentloaded'});
await page.screenshot({path: '2.png', fullPage: true})
await page.screenshot({ path: 'testresult.png', fullPage: true })
await browser.close()
console.log(`All done, check the screenshot. ✨`)
})
我只更新了部分代码,但结果还是一样,除非我绕过检测,否则我无法继续前进。请找到随附的屏幕截图。
我只想通过这个阶段并进入下一个屏幕.....
请帮忙.... :(
【问题讨论】:
-
好吧,这不是你应该做的。如果 Google 不希望您使用自动化工具登录,请接受它。而且,即使您今天绕过了它,谷歌很有可能在将来以安全的名义注册时添加新页面。在这里玩猫鼠游戏是徒劳的:)。
-
另外,它适用于有头为什么你甚至需要无头?您可以使用 xfvb 等工具在 ci 中运行。
-
嗨,谢谢您的回复,是的,但是整个 puppeteer 都在 docker 容器中运行,我也不能使用 xfvb....
-
那就没有好的解决办法了。谷歌有时会怀疑由于IP、指纹数据等不同的变量……无头模式和有头模式有不同的细微差别。例如 -- 自动化标志等被传递,导航器的属性被改变等等。有时谷歌会显示验证屏幕,如电话号码确认等。因此,我认为你以错误的方式解决问题。
-
也试试火狐。
标签: puppeteer headless-browser