This commit is contained in:
dengqichen 2025-11-17 00:56:17 +08:00
parent c9e24bbb85
commit 47f0d2b94b
2 changed files with 41 additions and 17 deletions

View File

@ -85,12 +85,22 @@ class EmailVerificationService {
logger.info('EmailVerification', '='.repeat(60)); logger.info('EmailVerification', '='.repeat(60));
// 查找匹配的邮件并提取验证码 // 查找匹配的邮件并提取验证码
// 注意QQ邮箱转发邮件后收件人字段会被改写为QQ邮箱地址所以不能检查收件人 // 必须检查收件人是否匹配,避免获取到旧邮件的验证码
// 改为只检查发件人和主题,并按时间取最新的
for (const email of emails) { for (const email of emails) {
if (isResolved) return; if (isResolved) return;
logger.info('EmailVerification', `检查邮件: 发件人="${email.from}", 主题="${email.subject}", 时间="${email.date}"`); logger.info('EmailVerification', `检查邮件: 发件人="${email.from}", 主题="${email.subject}", 收件人="${email.to}", 时间="${email.date}"`);
// 提取收件人邮箱地址(可能包含名字,如 "Name <email@example.com>"
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) { for (const parser of this.parsers) {
if (parser.canParse(email)) { if (parser.canParse(email)) {

View File

@ -131,13 +131,12 @@ class WindsurfRegister {
} }
/** /**
* 初始化浏览器使用rebrowser-puppeteer自带反检测 * 初始化浏览器使用 puppeteer-real-browser 自动绕过 Cloudflare
*/ */
async initBrowser() { async initBrowser() {
// rebrowser-puppeteer 已经打好补丁,无需额外配置 const { connect } = require('puppeteer-real-browser');
const puppeteer = require('puppeteer');
logger.info(this.siteName, '启动浏览器(反检测模式)...'); logger.info(this.siteName, '启动浏览器(Cloudflare 自动绕过模式)...');
// 随机视口大小(模拟不同设备) // 随机视口大小(模拟不同设备)
const viewports = [ const viewports = [
@ -148,21 +147,32 @@ class WindsurfRegister {
]; ];
const viewport = viewports[Math.floor(Math.random() * viewports.length)]; const viewport = viewports[Math.floor(Math.random() * viewports.length)];
this.browser = await puppeteer.launch({ // 使用 puppeteer-real-browser 连接,启用 turnstile 自动处理 Cloudflare
headless: false, // 非无头模式更难被检测 const result = await connect({
turnstile: true, // 自动处理 Cloudflare Turnstile
headless: false,
args: [ args: [
'--no-sandbox', '--no-sandbox',
'--disable-setuid-sandbox', '--disable-setuid-sandbox',
'--disable-blink-features=AutomationControlled',
'--disable-dev-shm-usage',
`--window-size=${viewport.width},${viewport.height}` `--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); await this.page.setViewport(viewport);
// 随机用户代理 // 随机用户代理
@ -181,6 +191,10 @@ class WindsurfRegister {
}); });
logger.success(this.siteName, `浏览器启动成功 (${viewport.width}x${viewport.height})`); logger.success(this.siteName, `浏览器启动成功 (${viewport.width}x${viewport.height})`);
// 等待浏览器完全准备
logger.info(this.siteName, '等待浏览器完全准备...');
await this.human.randomDelay(2000, 3000);
} }
/** /**