import { chromium } from 'playwright'; import { config } from './config.js'; import { setupTempMail, waitForVerificationCode, updateBaseline } from './emailModule.js'; import { registerOnVerdent, completeRegistration } from './registerModule.js'; import { getBrowserAndContexts } from './browser.js'; import { generateUsername } from './util.js'; import { saveAccount } from './db.js'; /** * 单次注册流程 */ async function registerOnce(emailPage, registerPage, email) { // ========== 开始 Verdent 注册 ========== console.log('\n🌐 === 步骤 1: 开始 Verdent.ai 注册 ==='); const { sentAtMs } = await registerOnVerdent(registerPage, email); // ========== 等待验证码邮件 ========== console.log('\n📬 === 步骤 2: 等待验证码邮件 ==='); const verificationCode = await waitForVerificationCode(emailPage, sentAtMs, email); if (!verificationCode) { throw new Error('未能获取验证码'); } // ========== 完成注册 ========== console.log('\n✅ === 步骤 3: 完成注册 ==='); const success = await completeRegistration(registerPage, verificationCode); return success; } /** * 主自动注册流程(循环模式) */ async function main() { console.log('🚀 开始自动注册流程(循环模式)...\n'); let browser; let emailContext; let registerContext; let emailPage; let registerPage; let successCount = 0; let failureCount = 0; try { // 启动浏览器 console.log('🌐 启动浏览器...'); ({ browser, emailContext, registerContext } = await getBrowserAndContexts({ headless: config.browser.headless, slowMo: config.browser.slowMo, })); // 创建邮箱页面(保持不关) emailPage = await emailContext.newPage(); registerPage = await registerContext.newPage(); // ========== 初始化:设置临时邮箱 ========== console.log('\n📧 === 初始化: 设置临时邮箱 ==='); const { inboxReady } = await setupTempMail(emailPage); if (!inboxReady) { throw new Error('未能成功创建临时邮箱'); } // 获取初始基线时间 await updateBaseline(emailPage); console.log('✅ 临时邮箱初始化完成\n'); // ========== 循环注册 ========== while (true) { try { console.log('\n' + '='.repeat(60)); console.log(`🔄 第 ${successCount + failureCount + 1} 次注册尝试 | 成功: ${successCount} | 失败: ${failureCount}`); console.log('='.repeat(60)); // 生成新邮箱(纯随机) const localPart = generateUsername(); const email = `${localPart}@${config.tempmail.domain}`; console.log('📧 本次注册邮箱:', email); // 执行注册 const result = await registerOnce(emailPage, registerPage, email); // 关闭注册页,准备下次 try { await registerPage.close(); } catch {} registerPage = await registerContext.newPage(); if (result && result.success) { successCount++; console.log('\n🎉 ============================================'); console.log(' 注册成功!'); console.log('============================================'); console.log('📧 邮箱:', email); console.log('🔑 密码:', config.verdent.password); if (result.credits) { console.log('💳 额度:', result.credits); } console.log('============================================\n'); // 邮件页面回退到收件箱 try { console.log('[邮箱] 回退到收件箱列表...'); await emailPage.goBack({ waitUntil: 'domcontentloaded', timeout: 5000 }); await emailPage.waitForTimeout(1500); console.log('[邮箱] ✅ 已回退到收件箱'); } catch (e) { console.log('[邮箱] 回退失败,尝试直接跳转:', e.message); await emailPage.goto('https://tempmail.plus/zh/', { waitUntil: 'domcontentloaded', timeout: 10000 }).catch(() => {}); await emailPage.waitForTimeout(1500); } // 更新基线 await updateBaseline(emailPage); // 保存到数据库 const createdAt = new Date(); const expiresAt = new Date(createdAt.getTime() + 7 * 24 * 60 * 60 * 1000); try { await saveAccount({ email, password: config.verdent.password, createdAt, expiresAt, status: 'active', credits: result.credits || null }); console.log('[DB] ✅ 账号已写入数据库'); } catch (e) { console.log('[DB] ⚠️ 写入失败:', e.message); } } else { failureCount++; console.log('\n❌ 注册失败'); } // 等待 10 秒后继续下一次 console.log('\n⏳ 等待 10 秒后开始下一次注册...'); await new Promise(resolve => setTimeout(resolve, 10000)); } catch (error) { failureCount++; console.error('\n❌ 注册过程出错:', error.message); console.log('⏳ 等待 10 秒后重试...'); await new Promise(resolve => setTimeout(resolve, 10000)); } } } catch (error) { console.error('\n❌ 初始化失败:', error.message); console.error(error.stack); // 初始化失败时保持浏览器打开以便调试 console.log('⏰ 浏览器将在 60 秒后关闭,请检查问题...'); await new Promise(resolve => setTimeout(resolve, 60000)); } finally { // 清理资源 try { if (!config.browser.keepEmailOpen) { if (emailContext && emailContext.close) await emailContext.close(); } else { console.log('[INFO] 已根据配置保留临时邮箱窗口,未关闭 emailContext'); } } catch {} try { if (registerContext && registerContext.close) await registerContext.close(); } catch {} try { if (!config.browser.keepEmailOpen) { if (browser && browser.close) await browser.close(); } } catch {} console.log('👋 程序结束'); } } // 运行主程序 main().catch(console.error);