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));
// 查找匹配的邮件并提取验证码
// 注意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 <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) {
if (parser.canParse(email)) {

View File

@ -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);
}
/**