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