aaaaa
This commit is contained in:
parent
c9e24bbb85
commit
47f0d2b94b
@ -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)) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user