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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:52:37