From 47f0d2b94be6de5887c86dbcb29d411ee1e4f022 Mon Sep 17 00:00:00 2001 From: dengqichen Date: Mon, 17 Nov 2025 00:56:17 +0800 Subject: [PATCH] aaaaa --- .../email-verification/index.js | 16 +++++-- src/tools/account-register/sites/windsurf.js | 42 ++++++++++++------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/tools/account-register/email-verification/index.js b/src/tools/account-register/email-verification/index.js index ba69768..d583e78 100644 --- a/src/tools/account-register/email-verification/index.js +++ b/src/tools/account-register/email-verification/index.js @@ -85,12 +85,22 @@ class EmailVerificationService { logger.info('EmailVerification', '='.repeat(60)); // 查找匹配的邮件并提取验证码 - // 注意:QQ邮箱转发邮件后,收件人字段会被改写为QQ邮箱地址,所以不能检查收件人 - // 改为只检查发件人和主题,并按时间取最新的 + // 必须检查收件人是否匹配,避免获取到旧邮件的验证码 for (const email of emails) { if (isResolved) return; - logger.info('EmailVerification', `检查邮件: 发件人="${email.from}", 主题="${email.subject}", 时间="${email.date}"`); + logger.info('EmailVerification', `检查邮件: 发件人="${email.from}", 主题="${email.subject}", 收件人="${email.to}", 时间="${email.date}"`); + + // 提取收件人邮箱地址(可能包含名字,如 "Name ") + const emailToMatch = email.to.match(/<(.+?)>/); + const actualRecipient = emailToMatch ? emailToMatch[1] : email.to; + + // 检查收件人是否匹配 + if (!actualRecipient.includes(recipientEmail)) { + logger.info('EmailVerification', ` ✗ 跳过:收件人不匹配(期望:${recipientEmail},实际:${actualRecipient})`); + continue; + } + logger.success('EmailVerification', ` ✓ 收件人匹配!`); for (const parser of this.parsers) { if (parser.canParse(email)) { diff --git a/src/tools/account-register/sites/windsurf.js b/src/tools/account-register/sites/windsurf.js index 7fe9e9a..cb087b1 100644 --- a/src/tools/account-register/sites/windsurf.js +++ b/src/tools/account-register/sites/windsurf.js @@ -131,13 +131,12 @@ class WindsurfRegister { } /** - * 初始化浏览器(使用rebrowser-puppeteer,自带反检测) + * 初始化浏览器(使用 puppeteer-real-browser 自动绕过 Cloudflare) */ async initBrowser() { - // rebrowser-puppeteer 已经打好补丁,无需额外配置 - const puppeteer = require('puppeteer'); + const { connect } = require('puppeteer-real-browser'); - logger.info(this.siteName, '启动浏览器(反检测模式)...'); + logger.info(this.siteName, '启动浏览器(Cloudflare 自动绕过模式)...'); // 随机视口大小(模拟不同设备) const viewports = [ @@ -148,23 +147,34 @@ class WindsurfRegister { ]; const viewport = viewports[Math.floor(Math.random() * viewports.length)]; - this.browser = await puppeteer.launch({ - headless: false, // 非无头模式更难被检测 + // 使用 puppeteer-real-browser 连接,启用 turnstile 自动处理 Cloudflare + const result = await connect({ + turnstile: true, // 自动处理 Cloudflare Turnstile + headless: false, args: [ '--no-sandbox', '--disable-setuid-sandbox', - '--disable-blink-features=AutomationControlled', - '--disable-dev-shm-usage', `--window-size=${viewport.width},${viewport.height}` - ], - ignoreDefaultArgs: ['--enable-automation'] + ] }); - - this.page = await this.browser.newPage(); - // 设置随机视口 + this.browser = result.browser; + this.page = result.page; + + // 监听新页面创建(防止支付页面跳转时丢失page引用) + this.browser.on('targetcreated', async (target) => { + if (target.type() === 'page') { + const newPage = await target.page(); + if (newPage) { + logger.info(this.siteName, '检测到新页面,切换到新页面'); + this.page = newPage; + } + } + }); + + // 设置视口 await this.page.setViewport(viewport); - + // 随机用户代理 const userAgents = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', @@ -181,6 +191,10 @@ class WindsurfRegister { }); logger.success(this.siteName, `浏览器启动成功 (${viewport.width}x${viewport.height})`); + + // 等待浏览器完全准备 + logger.info(this.siteName, '等待浏览器完全准备...'); + await this.human.randomDelay(2000, 3000); } /**