172 lines
4.3 KiB
JavaScript
172 lines
4.3 KiB
JavaScript
/**
|
|
* Account Register Tool - 账号注册工具入口
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const AccountDataGenerator = require('../../shared/libs/account-generator');
|
|
const logger = require('../../shared/logger');
|
|
const { OUTPUT_FORMATS } = require('./config');
|
|
|
|
const TOOL_NAME = 'account-register';
|
|
|
|
class AccountRegister {
|
|
constructor() {
|
|
this.sites = new Map();
|
|
this.dataGen = new AccountDataGenerator();
|
|
this.loadSites();
|
|
}
|
|
|
|
/**
|
|
* 加载所有网站脚本
|
|
*/
|
|
loadSites() {
|
|
const sitesDir = path.join(__dirname, 'sites');
|
|
|
|
try {
|
|
const files = fs.readdirSync(sitesDir);
|
|
|
|
files.forEach(file => {
|
|
if (file.endsWith('.js')) {
|
|
const siteName = file.replace('.js', '');
|
|
try {
|
|
const SiteClass = require(path.join(sitesDir, file));
|
|
this.sites.set(siteName, SiteClass);
|
|
logger.debug(TOOL_NAME, `Loaded site: ${siteName}`);
|
|
} catch (error) {
|
|
logger.warn(TOOL_NAME, `Failed to load site ${siteName}: ${error.message}`);
|
|
}
|
|
}
|
|
});
|
|
} catch (error) {
|
|
logger.warn(TOOL_NAME, `Failed to load sites: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 执行注册
|
|
*/
|
|
async execute(options) {
|
|
const { site, dryRun, format } = options;
|
|
|
|
try {
|
|
if (!site) {
|
|
logger.error(TOOL_NAME, '请指定网站名称');
|
|
this.listSites();
|
|
process.exit(1);
|
|
}
|
|
|
|
const SiteClass = this.sites.get(site);
|
|
if (!SiteClass) {
|
|
logger.error(TOOL_NAME, `未知的网站: ${site}`);
|
|
this.listSites();
|
|
process.exit(1);
|
|
}
|
|
|
|
const siteInstance = new SiteClass();
|
|
|
|
if (dryRun) {
|
|
// 干运行模式:只生成数据
|
|
logger.info(TOOL_NAME, '干运行模式:只生成账号数据');
|
|
const account = siteInstance.generateData(options);
|
|
|
|
const formatter = OUTPUT_FORMATS[format || 'simple'];
|
|
console.log('\n' + formatter.formatter(account) + '\n');
|
|
|
|
logger.success(TOOL_NAME, '账号数据生成完成');
|
|
} else {
|
|
// 真正执行注册
|
|
logger.info(TOOL_NAME, `开始注册 ${site} 账号...`);
|
|
const result = await siteInstance.register(options);
|
|
|
|
if (result.success) {
|
|
logger.success(TOOL_NAME, '注册流程完成');
|
|
|
|
if (options.output) {
|
|
// 保存到文件
|
|
fs.writeFileSync(
|
|
options.output,
|
|
JSON.stringify(result.account, null, 2)
|
|
);
|
|
logger.success(TOOL_NAME, `账号数据已保存到: ${options.output}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
logger.error(TOOL_NAME, error.message);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 只生成数据(不执行注册)
|
|
*/
|
|
generate(options) {
|
|
logger.info(TOOL_NAME, '生成账号数据...');
|
|
|
|
const account = this.dataGen.generateAccount({
|
|
name: options.name,
|
|
email: options.email,
|
|
username: options.username,
|
|
password: options.password,
|
|
phone: options.phone,
|
|
includeCard: options.includeCard
|
|
});
|
|
|
|
const formatter = OUTPUT_FORMATS[options.format || 'simple'];
|
|
console.log('\n' + formatter.formatter(account) + '\n');
|
|
}
|
|
|
|
/**
|
|
* 列出支持的网站
|
|
*/
|
|
listSites() {
|
|
const sites = Array.from(this.sites.keys());
|
|
|
|
if (sites.length === 0) {
|
|
console.log('\n暂无可用网站\n');
|
|
return;
|
|
}
|
|
|
|
console.log('\n支持的网站:\n');
|
|
sites.forEach(site => {
|
|
console.log(` ${site}`);
|
|
});
|
|
console.log('');
|
|
}
|
|
|
|
/**
|
|
* 列出支持的格式
|
|
*/
|
|
listFormats() {
|
|
console.log('\n支持的输出格式:\n');
|
|
for (const [key, config] of Object.entries(OUTPUT_FORMATS)) {
|
|
console.log(` ${key.padEnd(15)} - ${config.name}`);
|
|
}
|
|
console.log('');
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
name: TOOL_NAME,
|
|
alias: 'register',
|
|
description: '自动注册账号',
|
|
execute: async (options) => {
|
|
const tool = new AccountRegister();
|
|
await tool.execute(options);
|
|
},
|
|
listSites: () => {
|
|
const tool = new AccountRegister();
|
|
tool.listSites();
|
|
},
|
|
listFormats: () => {
|
|
const tool = new AccountRegister();
|
|
tool.listFormats();
|
|
},
|
|
generate: (options) => {
|
|
const tool = new AccountRegister();
|
|
tool.generate(options);
|
|
}
|
|
};
|