auto-register-verdent/index.js
2025-11-13 15:55:52 +08:00

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);