如何用Puppeteer获取Discord Token?执行代码遇未定义错误
解决Puppeteer获取Discord Token时的webpackChunkdiscord_app未定义错误
问题原因
你写的代码错误地将浏览器环境的webpackChunkdiscord_app变量直接暴露在了Node.js上下文里,导致Node.js找不到这个变量报错。另外Discord的webpack chunk变量名可能随版本更新变化,硬写变量名也容易失效。
修复方案
1. 修正page.evaluate的使用逻辑
所有要在浏览器内执行的代码必须封装成函数传入page.evaluate,这样代码才会在浏览器上下文运行,能正常访问Discord页面的全局变量。
2. 动态查找webpack chunk变量
通过遍历window对象找到以webpackChunk开头的变量,避免硬写变量名导致的适配问题。
完整代码示例
const puppeteer = require('puppeteer'); (async () => { // 启动浏览器并添加反检测参数,避免被Discord识别为自动化工具 const browser = await puppeteer.launch({ headless: 'new', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled' ], ignoreDefaultArgs: ['--enable-automation'] }); const page = await browser.newPage(); // 跳转至Discord登录页,需自行补充登录逻辑(如输入账号密码、点击登录) await page.goto('https://discord.com/login'); // 等待登录完成,以用户设置按钮出现作为登录成功标识 await page.waitForSelector('[aria-label="User Settings"]'); // 获取Token const token = await page.evaluate(() => { // 动态定位webpack chunk变量 let webpackChunk; for (const key in window) { if (key.startsWith('webpackChunk')) { webpackChunk = window[key]; break; } } if (!webpackChunk) return null; let modules = []; webpackChunk.push([ "", {}, (e) => { for (const c in e.c) modules.push(e.c[c]); } ]); // 查找包含getToken方法的模块 const tokenModule = modules.find(m => m?.exports?.default?.getToken); return tokenModule?.exports?.default.getToken() || null; }); console.log('获取到的Token:', token); await browser.close(); })();
额外提示
- 必须使用
await处理page.evaluate,因为它是异步函数,返回Promise对象。 - 登录逻辑需要自行补充,比如通过
page.type输入账号密码、page.click触发登录按钮等操作。 - 如果仍无法获取Token,可能是Discord更新了webpack模块结构,需要重新定位存储Token的模块。
内容的提问来源于stack exchange,提问作者Haruke Sensei
相关产品推荐
相关产品推荐

