如何在Puppeteer中获取浏览器window变量并调用回调函数
解决Puppeteer获取turnstile.render参数并调用callback的问题
问题原因
你之前用page.evaluate()没生效,核心是调用时机不对——turnstile.render还没被触发,window上的目标属性还未生成,导致获取不到数据。
方案一:标记等待+全局变量获取
1. 修改注入的file.js脚本
捕获到目标对象后,添加完成标记并保存完整数据:
const i = setInterval(()=>{ if (window.turnstile) { clearInterval(i) window.turnstile.render = (a,b) => { b.userAgent = navigator.userAgent window.tsCallback = b.callback window.action = b.action window.data = b.cData window.capturedTurnstileData = b; // 保存完整对象 window.bCaptured = true; // 设置捕获完成标记 console.log(b) return 'foo' } } },50)
2. Puppeteer端等待并处理数据
// 等待目标对象被捕获 await page.waitForFunction('window.bCaptured === true'); // 获取完整的捕获数据 const capturedData = await page.evaluate(() => window.capturedTurnstileData); console.log('捕获到turnstile参数:', capturedData); // 在浏览器上下文调用callback(必须在evaluate内执行,因为callback属于浏览器环境) await page.evaluate((token) => { if (window.tsCallback) { window.tsCallback(token); // 传入实际验证token,这里用示例值 } }, 'fake-valid-token');
方案二:自定义事件通知(更灵活)
1. 修改file.js触发自定义事件
const i = setInterval(()=>{ if (window.turnstile) { clearInterval(i) window.turnstile.render = (a,b) => { b.userAgent = navigator.userAgent window.tsCallback = b.callback window.action = b.action window.data = b.cData // 触发自定义事件传递数据 window.dispatchEvent(new CustomEvent('turnstileCaptured', { detail: b })); console.log(b) return 'foo' } } },50)
2. Puppeteer端监听事件并处理
// 监听自定义事件获取数据 const capturedData = await page.evaluate(() => { return new Promise(resolve => { window.addEventListener('turnstileCaptured', (e) => { resolve(e.detail); }, { once: true }); // 仅监听一次 }); }); console.log('捕获到turnstile参数:', capturedData); // 调用callback await page.evaluate(() => { if (window.tsCallback) { window.tsCallback('your-actual-token'); } });
关键注意点
- 浏览器上下文的函数(如
tsCallback)无法在Node.js环境直接调用,必须通过page.evaluate()在浏览器内部执行。 - 必须等待
turnstile.render触发后再获取数据,否则会拿到undefined。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

