180 lines
6.2 KiB
JavaScript
180 lines
6.2 KiB
JavaScript
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);
|