mirror of
https://github.com/LightZirconite/Microsoft-Rewards-Bot.git
synced 2026-01-10 01:06:17 +00:00
feat: Implement account creation module with realistic data generation
- Add DataGenerator class for generating emails, passwords, birthdates, and names. - Create README.md detailing features, usage, and process flow for account creation. - Develop CLI for initiating account creation with optional referral URL. - Introduce nameDatabase for realistic first and last name generation. - Define CreatedAccount interface for structured account data.
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,6 +5,7 @@ node_modules/
|
||||
.github/
|
||||
diagnostics/
|
||||
reports/
|
||||
accounts-created/
|
||||
accounts.json
|
||||
accounts.jsonc
|
||||
notes
|
||||
|
||||
30
README.md
30
README.md
@@ -150,6 +150,36 @@ npm run buy 1 # By account number
|
||||
|
||||
---
|
||||
|
||||
## 🆕 Account Creator
|
||||
|
||||
Automatically create new Microsoft accounts with referral link support:
|
||||
|
||||
```bash
|
||||
# Create account without referral
|
||||
npm run creator
|
||||
|
||||
# Create account with your referral link
|
||||
npm run creator https://rewards.bing.com/welcome?rh=YOUR_CODE&ref=rafsrchae
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- 🎯 Language-independent (works in any language)
|
||||
- 🔐 Generates strong passwords automatically
|
||||
- 📧 Creates unique email addresses
|
||||
- 🎂 Realistic birthdates (18-50 years old)
|
||||
- 🤖 CAPTCHA support (manual solving required)
|
||||
- 💾 Saves all account details to `accounts-created/` directory
|
||||
|
||||
**What happens:**
|
||||
1. Opens browser to Microsoft signup page
|
||||
2. Automatically fills email, password, birthdate, and name
|
||||
3. Waits for you to solve CAPTCHA
|
||||
4. Saves complete account info to file
|
||||
|
||||
**[📖 Full Account Creator Guide](src/account-creation/README.md)**
|
||||
|
||||
---
|
||||
|
||||
## ⏰ Automatic Scheduling
|
||||
|
||||
Configure automatic task scheduling directly from `config.jsonc` - **perfect for Raspberry Pi!**
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
"ts-start": "node --loader ts-node/esm ./src/index.ts",
|
||||
"dev": "ts-node ./src/index.ts -dev",
|
||||
"buy": "node --enable-source-maps ./dist/index.js -buy",
|
||||
"creator": "ts-node ./src/account-creation/cli.ts",
|
||||
"dashboard": "node --enable-source-maps ./dist/index.js -dashboard",
|
||||
"dashboard-dev": "ts-node ./src/index.ts -dashboard",
|
||||
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
||||
|
||||
1615
src/account-creation/AccountCreator.ts
Normal file
1615
src/account-creation/AccountCreator.ts
Normal file
File diff suppressed because it is too large
Load Diff
104
src/account-creation/DataGenerator.ts
Normal file
104
src/account-creation/DataGenerator.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import { getRandomFirstName, getRandomLastName } from './nameDatabase'
|
||||
|
||||
export class DataGenerator {
|
||||
|
||||
generateEmail(customFirstName?: string, customLastName?: string): string {
|
||||
const firstName = customFirstName || getRandomFirstName()
|
||||
const lastName = customLastName || getRandomLastName()
|
||||
|
||||
const cleanFirst = firstName.toLowerCase().replace(/[^a-z]/g, '')
|
||||
const cleanLast = lastName.toLowerCase().replace(/[^a-z]/g, '')
|
||||
|
||||
// More realistic patterns
|
||||
const randomNum = Math.floor(Math.random() * 9999)
|
||||
const randomYear = 1985 + Math.floor(Math.random() * 20)
|
||||
|
||||
const patterns = [
|
||||
`${cleanFirst}.${cleanLast}`,
|
||||
`${cleanFirst}${cleanLast}`,
|
||||
`${cleanFirst}_${cleanLast}`,
|
||||
`${cleanFirst}.${cleanLast}${randomNum}`,
|
||||
`${cleanFirst}${randomNum}`,
|
||||
`${cleanLast}${cleanFirst}`,
|
||||
`${cleanFirst}.${cleanLast}${randomYear}`,
|
||||
`${cleanFirst}${randomYear}`
|
||||
]
|
||||
|
||||
const username = patterns[Math.floor(Math.random() * patterns.length)]
|
||||
return `${username}@outlook.com`
|
||||
}
|
||||
|
||||
generatePassword(): string {
|
||||
const uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
const lowercase = 'abcdefghijklmnopqrstuvwxyz'
|
||||
const numbers = '0123456789'
|
||||
const symbols = '!@#$%^&*'
|
||||
|
||||
let password = ''
|
||||
|
||||
// Ensure at least one of each required type
|
||||
password += uppercase[Math.floor(Math.random() * uppercase.length)]
|
||||
password += lowercase[Math.floor(Math.random() * lowercase.length)]
|
||||
password += numbers[Math.floor(Math.random() * numbers.length)]
|
||||
password += symbols[Math.floor(Math.random() * symbols.length)]
|
||||
|
||||
// Fill the rest (total length: 14-18 chars for better security)
|
||||
const allChars = uppercase + lowercase + numbers + symbols
|
||||
const targetLength = 14 + Math.floor(Math.random() * 5)
|
||||
|
||||
for (let i = password.length; i < targetLength; i++) {
|
||||
password += allChars[Math.floor(Math.random() * allChars.length)]
|
||||
}
|
||||
|
||||
// Shuffle to mix required characters
|
||||
password = password.split('').sort(() => Math.random() - 0.5).join('')
|
||||
|
||||
return password
|
||||
}
|
||||
|
||||
generateBirthdate(): { day: number; month: number; year: number } {
|
||||
const currentYear = new Date().getFullYear()
|
||||
|
||||
// Age between 20 and 45 years old (safer range)
|
||||
const minAge = 20
|
||||
const maxAge = 45
|
||||
|
||||
const age = minAge + Math.floor(Math.random() * (maxAge - minAge + 1))
|
||||
const year = currentYear - age
|
||||
|
||||
const month = 1 + Math.floor(Math.random() * 12)
|
||||
const daysInMonth = new Date(year, month, 0).getDate()
|
||||
const day = 1 + Math.floor(Math.random() * daysInMonth)
|
||||
|
||||
return { day, month, year }
|
||||
}
|
||||
|
||||
generateNames(email: string): { firstName: string; lastName: string } {
|
||||
const username = email.split('@')[0] || 'user'
|
||||
|
||||
// Split on numbers, dots, underscores, hyphens
|
||||
const parts = username.split(/[0-9._-]+/).filter(p => p.length > 1)
|
||||
|
||||
if (parts.length >= 2) {
|
||||
return {
|
||||
firstName: this.capitalize(parts[0] || getRandomFirstName()),
|
||||
lastName: this.capitalize(parts[1] || getRandomLastName())
|
||||
}
|
||||
} else if (parts.length === 1 && parts[0]) {
|
||||
return {
|
||||
firstName: this.capitalize(parts[0]),
|
||||
lastName: getRandomLastName()
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
firstName: getRandomFirstName(),
|
||||
lastName: getRandomLastName()
|
||||
}
|
||||
}
|
||||
|
||||
private capitalize(str: string): string {
|
||||
if (!str || str.length === 0) return ''
|
||||
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()
|
||||
}
|
||||
}
|
||||
285
src/account-creation/README.md
Normal file
285
src/account-creation/README.md
Normal file
@@ -0,0 +1,285 @@
|
||||
# Account Creation Module
|
||||
|
||||
Automatically create new Microsoft accounts with **realistic email generation**, **human-like delays**, **interactive mode**, and **referral link support**.
|
||||
|
||||
## 🎯 Key Features
|
||||
|
||||
### ✨ Stealth & Realism
|
||||
- **200+ Name Database**: Generates natural emails like `james.wilson1995@outlook.com`
|
||||
- **Human-like Delays**: Random 0.5-4s delays between actions to avoid bot detection
|
||||
- **Interactive Mode**: Choose auto-generate or enter your own email
|
||||
- **Microsoft Suggestions**: Automatically handles "email taken" with Microsoft's alternatives
|
||||
- **Badge Reading**: Always reads final email from identity badge for accuracy
|
||||
|
||||
### 🔧 Technical Features
|
||||
- **Referral Support**: Create accounts from your referral links
|
||||
- **Language-Independent**: CSS selectors work in any language
|
||||
- **CAPTCHA Detection**: Pauses automatically, waits for human solving
|
||||
- **Auto-Save**: Organized daily JSONC files in `accounts-created/`
|
||||
|
||||
## 📦 Installation
|
||||
|
||||
Already integrated - no additional setup needed!
|
||||
|
||||
## 🚀 Usage
|
||||
|
||||
### Command Line
|
||||
|
||||
```bash
|
||||
# Without referral (standalone account)
|
||||
npm run creator
|
||||
|
||||
# With referral link (earns you referral credit)
|
||||
npm run creator https://rewards.bing.com/welcome?rh=YOUR_CODE&ref=rafsrchae
|
||||
```
|
||||
|
||||
### Interactive Flow
|
||||
|
||||
When you run the creator:
|
||||
|
||||
```
|
||||
=== Email Configuration ===
|
||||
Generate email automatically? (Y/n):
|
||||
```
|
||||
|
||||
**Press Y or Enter**: Auto-generates realistic email
|
||||
- Example: `sarah.martinez1998@hotmail.com`
|
||||
- Uses 200+ names from database
|
||||
- Multiple formats (firstname.lastname, firstnamelastname, etc.)
|
||||
|
||||
**Press n**: Manual email input
|
||||
- You type the email you want
|
||||
- Example: `mycoolemail@outlook.com`
|
||||
|
||||
## 📧 Email Generation
|
||||
|
||||
### Auto-Generation System
|
||||
|
||||
The system creates **realistic, human-like emails**:
|
||||
|
||||
```javascript
|
||||
// Old (obvious bot pattern):
|
||||
user1730970000abc@outlook.com ❌
|
||||
|
||||
// New (looks like real person):
|
||||
james.wilson@outlook.com ✅
|
||||
emily.brown95@hotmail.com ✅
|
||||
alex_taylor@outlook.fr ✅
|
||||
michael.garcia1998@outlook.com ✅
|
||||
```
|
||||
|
||||
### Name Database
|
||||
|
||||
- **150+ First Names**: Male, female, gender-neutral
|
||||
- **90+ Last Names**: Common surnames worldwide
|
||||
- **Smart Formatting**: Varies patterns to look natural
|
||||
|
||||
### Email Formats
|
||||
|
||||
The system randomly uses these patterns:
|
||||
- `firstname.lastname@domain.com`
|
||||
- `firstnamelastname@domain.com`
|
||||
- `firstname_lastname@domain.com`
|
||||
- `firstnamelastname95@domain.com` (random number 0-99)
|
||||
- `firstname.lastname1995@domain.com` (birth year style)
|
||||
|
||||
### Domains
|
||||
|
||||
Randomly selects from:
|
||||
- `outlook.com`
|
||||
- `hotmail.com`
|
||||
- `outlook.fr`
|
||||
|
||||
## 🎭 Human-like Delays
|
||||
|
||||
All actions have **random delays** to mimic human behavior:
|
||||
|
||||
| Action | Delay Range |
|
||||
|--------|-------------|
|
||||
| After navigation | 1.5-3s |
|
||||
| After button click | 2-4s |
|
||||
| After dropdown select | 0.8-1.5s |
|
||||
| After text input | 0.8-2s |
|
||||
| Waiting for page load | 2-4s |
|
||||
|
||||
This prevents Microsoft's bot detection from flagging your accounts.
|
||||
|
||||
## 🔄 Microsoft Suggestions Handling
|
||||
|
||||
**Problem**: Email already exists
|
||||
**Microsoft's Response**: Shows alternative suggestions (e.g., `john.smith247@outlook.com`)
|
||||
|
||||
**How the system handles it**:
|
||||
1. ✅ Detects error message automatically
|
||||
2. ✅ Finds suggestion toolbar
|
||||
3. ✅ Clicks first suggestion
|
||||
4. ✅ Reads final email from identity badge
|
||||
5. ✅ Saves correct email to file
|
||||
|
||||
**Example Flow**:
|
||||
```
|
||||
You input: john.smith@outlook.com
|
||||
Microsoft: ❌ Email taken
|
||||
Microsoft: 💡 Suggestions: john.smith247@outlook.com, john.smith89@hotmail.com
|
||||
System: ✅ Clicks first suggestion
|
||||
Identity Badge: john.smith247@outlook.com
|
||||
Saved Account: john.smith247@outlook.com ← Correct!
|
||||
```
|
||||
|
||||
## 🔧 Complete Process Flow
|
||||
|
||||
1. **Navigation**
|
||||
- With referral: Goes to your referral URL → Clicks "Join Microsoft Rewards"
|
||||
- Without referral: Goes directly to `https://login.live.com/`
|
||||
|
||||
2. **Email Configuration** (Interactive)
|
||||
- Asks: Auto-generate or manual?
|
||||
- Auto: Generates realistic email from name database
|
||||
- Manual: You type the email
|
||||
|
||||
3. **Email Submission**
|
||||
- Fills email with human delays
|
||||
- Clicks Next button
|
||||
- Checks for "email taken" error
|
||||
|
||||
4. **Suggestion Handling** (if needed)
|
||||
- Detects error automatically
|
||||
- Clicks Microsoft's first suggestion
|
||||
- Continues smoothly
|
||||
|
||||
5. **Identity Badge Reading**
|
||||
- Reads final email from badge
|
||||
- Ensures accuracy (especially after suggestions)
|
||||
|
||||
6. **Password Generation**
|
||||
- 12-16 characters
|
||||
- Uppercase, lowercase, numbers, symbols
|
||||
- Meets all Microsoft requirements
|
||||
|
||||
7. **Birthdate**
|
||||
- Random age: 18-50 years old
|
||||
- Realistic distribution
|
||||
|
||||
8. **Names**
|
||||
- Extracted from email OR
|
||||
- Generated from name database
|
||||
- Capitalized properly
|
||||
|
||||
9. **CAPTCHA Detection**
|
||||
- Automatically detects CAPTCHA page
|
||||
- Pauses and waits for human solving
|
||||
- Up to 10 minutes timeout
|
||||
- Logs progress every 30 seconds
|
||||
|
||||
10. **Save Account**
|
||||
- Saves to `accounts-created/created_accounts_YYYY-MM-DD.jsonc`
|
||||
- Daily files for organization
|
||||
- All details preserved
|
||||
|
||||
## 📄 Output Format
|
||||
|
||||
```jsonc
|
||||
// accounts-created/created_accounts_2025-01-09.jsonc
|
||||
[
|
||||
{
|
||||
"email": "james.wilson1995@outlook.com",
|
||||
"password": "Xyz789!@#AbcDef",
|
||||
"birthdate": {
|
||||
"day": 17,
|
||||
"month": 5,
|
||||
"year": 1995
|
||||
},
|
||||
"firstName": "James",
|
||||
"lastName": "Wilson",
|
||||
"createdAt": "2025-01-09T10:30:00.000Z",
|
||||
"referralUrl": "https://rewards.bing.com/welcome?rh=YOUR_CODE&ref=rafsrchae"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## 📂 File Structure
|
||||
|
||||
```
|
||||
src/account-creation/
|
||||
├── AccountCreator.ts # Main orchestration with delays & interaction
|
||||
├── DataGenerator.ts # Generates realistic data
|
||||
├── nameDatabase.ts # 200+ names for email generation
|
||||
├── cli.ts # Command-line interface with banner
|
||||
├── types.ts # TypeScript interfaces
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
## 🔍 Technical Selectors (Language-Independent)
|
||||
|
||||
| Element | Selector |
|
||||
|---------|----------|
|
||||
| Create Account | `span[role="button"].fui-Link, a[id*="signup"]` |
|
||||
| Email Input | `input[type="email"]` |
|
||||
| Password Input | `input[type="password"]` |
|
||||
| Next Button | `button[data-testid="primaryButton"], button[type="submit"]` |
|
||||
| Birth Day | `button[name="BirthDay"]` |
|
||||
| Birth Month | `button[name="BirthMonth"]` |
|
||||
| Birth Year | `input[name="BirthYear"]` |
|
||||
| First Name | `input[id*="firstName"]` |
|
||||
| Last Name | `input[id*="lastName"]` |
|
||||
| Identity Badge | `#bannerText, div[data-testid="identityBanner"]` |
|
||||
| Error Message | `div[id*="Error"], div[class*="error"]` |
|
||||
| Suggestions | `div[role="toolbar"][data-testid="suggestions"]` |
|
||||
| CAPTCHA Title | `h1[data-testid="title"]` |
|
||||
|
||||
## ⚠️ Important Notes
|
||||
|
||||
- **Browser stays open** during CAPTCHA - intentional (human solving required)
|
||||
- **No CAPTCHA automation** - Microsoft detects and bans bots
|
||||
- **Referral URL must be full URL** starting with `https://`
|
||||
- **Multiple runs** append to same daily file
|
||||
- **Badge reading is critical** - final email may differ from input (suggestions)
|
||||
- **Human delays are mandatory** - prevents bot detection
|
||||
|
||||
## 🎯 Why This Approach?
|
||||
|
||||
### Old System (Bot-Like)
|
||||
```
|
||||
❌ Email: user1730970000abc@outlook.com (obvious timestamp)
|
||||
❌ Speed: Instant form filling (< 1 second)
|
||||
❌ Errors: Didn't handle email-taken scenarios
|
||||
❌ Badge: Ignored identity badge (wrong email saved)
|
||||
```
|
||||
|
||||
### New System (Human-Like)
|
||||
```
|
||||
✅ Email: james.wilson1995@outlook.com (looks real)
|
||||
✅ Speed: 0.5-4s delays between actions (natural)
|
||||
✅ Errors: Handles suggestions automatically
|
||||
✅ Badge: Always reads final email (accurate)
|
||||
✅ Choice: User can choose auto or manual
|
||||
```
|
||||
|
||||
## 📊 Success Tips
|
||||
|
||||
1. **Use auto-generate** for fastest creation
|
||||
2. **Use manual mode** if you have specific email format requirements
|
||||
3. **Let the script handle suggestions** - don't worry about "email taken" errors
|
||||
4. **Solve CAPTCHA within 10 minutes** when prompted
|
||||
5. **Check accounts-created/ folder** for all saved accounts
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
**Q: Email generation too fast?**
|
||||
A: System uses 0.8-2s delays after each input - looks human.
|
||||
|
||||
**Q: Email already taken?**
|
||||
A: System automatically clicks Microsoft's suggestion and reads from badge.
|
||||
|
||||
**Q: Want specific email format?**
|
||||
A: Press 'n' when asked "Generate automatically?" and type your email.
|
||||
|
||||
**Q: CAPTCHA timeout?**
|
||||
A: You have 10 minutes to solve it. If timeout, run script again.
|
||||
|
||||
**Q: Where are accounts saved?**
|
||||
A: `accounts-created/created_accounts_YYYY-MM-DD.jsonc` (auto-created folder).
|
||||
|
||||
---
|
||||
|
||||
**Made with ❤️ for Microsoft Rewards automation**
|
||||
109
src/account-creation/cli.ts
Normal file
109
src/account-creation/cli.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
import Browser from '../browser/Browser'
|
||||
import { AccountCreator } from './AccountCreator'
|
||||
import { log } from '../util/Logger'
|
||||
import { MicrosoftRewardsBot } from '../index'
|
||||
|
||||
async function main() {
|
||||
// Get referral URL from command line args
|
||||
const args = process.argv.slice(2)
|
||||
const referralUrl = args[0] // Optional referral URL
|
||||
|
||||
// Validate URL format if provided
|
||||
if (referralUrl && !referralUrl.startsWith('http')) {
|
||||
log(false, 'CREATOR-CLI', '❌ Invalid URL format', 'error')
|
||||
log(false, 'CREATOR-CLI', 'Usage: npm run creator [referralUrl]', 'log')
|
||||
log(false, 'CREATOR-CLI', 'Example: npm run creator https://rewards.bing.com/welcome?rh=E3DCB441&ref=rafsrchae', 'log', 'cyan')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// Banner
|
||||
console.log('\n' + '='.repeat(60))
|
||||
log(false, 'CREATOR-CLI', '🚀 Microsoft Account Creator', 'log', 'cyan')
|
||||
console.log('='.repeat(60) + '\n')
|
||||
|
||||
if (referralUrl) {
|
||||
log(false, 'CREATOR-CLI', `✅ Using referral URL: ${referralUrl}`, 'log', 'green')
|
||||
} else {
|
||||
log(false, 'CREATOR-CLI', '⚠️ No referral URL provided - account will NOT be linked to rewards', 'warn', 'yellow')
|
||||
}
|
||||
|
||||
// Create a temporary bot instance to access browser creation
|
||||
const bot = new MicrosoftRewardsBot(false)
|
||||
const browserFactory = new Browser(bot)
|
||||
|
||||
try {
|
||||
// Create browser (non-headless for user interaction with CAPTCHA)
|
||||
log(false, 'CREATOR-CLI', 'Opening browser (required for CAPTCHA solving)...', 'log')
|
||||
|
||||
// Create empty proxy config (no proxy for account creation)
|
||||
const emptyProxy = {
|
||||
proxyAxios: false,
|
||||
url: '',
|
||||
port: 0,
|
||||
password: '',
|
||||
username: ''
|
||||
}
|
||||
|
||||
const browserContext = await browserFactory.createBrowser(emptyProxy, 'account-creator')
|
||||
|
||||
log(false, 'CREATOR-CLI', '✅ Browser opened successfully', 'log', 'green')
|
||||
|
||||
// Create account
|
||||
const creator = new AccountCreator(referralUrl)
|
||||
const result = await creator.create(browserContext)
|
||||
|
||||
if (result) {
|
||||
// Success banner
|
||||
console.log('\n' + '='.repeat(60))
|
||||
log(false, 'CREATOR-CLI', '✅ ACCOUNT CREATED SUCCESSFULLY!', 'log', 'green')
|
||||
console.log('='.repeat(60))
|
||||
|
||||
// Display account details
|
||||
log(false, 'CREATOR-CLI', `📧 Email: ${result.email}`, 'log', 'cyan')
|
||||
log(false, 'CREATOR-CLI', `🔐 Password: ${result.password}`, 'log', 'cyan')
|
||||
log(false, 'CREATOR-CLI', `👤 Name: ${result.firstName} ${result.lastName}`, 'log', 'cyan')
|
||||
log(false, 'CREATOR-CLI', `🎂 Birthdate: ${result.birthdate.day}/${result.birthdate.month}/${result.birthdate.year}`, 'log', 'cyan')
|
||||
|
||||
if (result.referralUrl) {
|
||||
log(false, 'CREATOR-CLI', '🔗 Referral: Linked', 'log', 'green')
|
||||
}
|
||||
|
||||
console.log('='.repeat(60))
|
||||
log(false, 'CREATOR-CLI', '💾 Account details saved to accounts-created/ directory', 'log', 'green')
|
||||
console.log('='.repeat(60) + '\n')
|
||||
|
||||
// Keep browser open - don't close
|
||||
log(false, 'CREATOR-CLI', '✅ Account creation complete! Browser will remain open.', 'log', 'green')
|
||||
log(false, 'CREATOR-CLI', 'You can now use the account or close the browser manually.', 'log', 'cyan')
|
||||
log(false, 'CREATOR-CLI', 'Press Ctrl+C to exit the script.', 'log', 'yellow')
|
||||
|
||||
// Keep process alive indefinitely
|
||||
await new Promise(() => {}) // Never resolves
|
||||
} else {
|
||||
// Failure
|
||||
console.log('\n' + '='.repeat(60))
|
||||
log(false, 'CREATOR-CLI', '❌ ACCOUNT CREATION FAILED', 'error')
|
||||
console.log('='.repeat(60) + '\n')
|
||||
|
||||
await browserContext.close()
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
const msg = error instanceof Error ? error.message : String(error)
|
||||
console.log('\n' + '='.repeat(60))
|
||||
log(false, 'CREATOR-CLI', `❌ Fatal error: ${msg}`, 'error')
|
||||
console.log('='.repeat(60) + '\n')
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
// Run if executed directly
|
||||
if (require.main === module) {
|
||||
main().catch(error => {
|
||||
log(false, 'CREATOR-CLI', `Unhandled error: ${error}`, 'error')
|
||||
process.exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
export { main as createAccountCLI }
|
||||
46
src/account-creation/nameDatabase.ts
Normal file
46
src/account-creation/nameDatabase.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
// Realistic name database for account creation
|
||||
export const NAME_DATABASE = {
|
||||
firstNames: {
|
||||
male: [
|
||||
'James', 'John', 'Robert', 'Michael', 'William', 'David', 'Richard', 'Joseph', 'Thomas', 'Charles',
|
||||
'Daniel', 'Matthew', 'Anthony', 'Mark', 'Donald', 'Steven', 'Paul', 'Andrew', 'Joshua', 'Kenneth',
|
||||
'Kevin', 'Brian', 'George', 'Timothy', 'Ronald', 'Edward', 'Jason', 'Jeffrey', 'Ryan', 'Jacob',
|
||||
'Nicolas', 'Lucas', 'Nathan', 'Benjamin', 'Samuel', 'Alexander', 'Christopher', 'Dylan', 'Logan',
|
||||
'Ethan', 'Mason', 'Liam', 'Noah', 'Oliver', 'Elijah', 'Aiden', 'Jackson', 'Sebastian', 'Jack'
|
||||
],
|
||||
female: [
|
||||
'Mary', 'Patricia', 'Jennifer', 'Linda', 'Barbara', 'Elizabeth', 'Jessica', 'Susan', 'Sarah', 'Karen',
|
||||
'Lisa', 'Nancy', 'Betty', 'Margaret', 'Sandra', 'Ashley', 'Kimberly', 'Emily', 'Donna', 'Michelle',
|
||||
'Carol', 'Amanda', 'Dorothy', 'Melissa', 'Deborah', 'Stephanie', 'Rebecca', 'Sharon', 'Laura', 'Cynthia',
|
||||
'Emma', 'Olivia', 'Ava', 'Isabella', 'Sophia', 'Mia', 'Charlotte', 'Amelia', 'Harper', 'Evelyn',
|
||||
'Abigail', 'Emily', 'Madison', 'Ella', 'Scarlett', 'Grace', 'Chloe', 'Victoria', 'Riley', 'Aria'
|
||||
],
|
||||
neutral: [
|
||||
'Alex', 'Jordan', 'Taylor', 'Morgan', 'Casey', 'Riley', 'Avery', 'Jamie', 'Quinn', 'Reese',
|
||||
'Skylar', 'Cameron', 'Drew', 'Blake', 'Sage', 'River', 'Phoenix', 'Charlie', 'Dakota', 'Rowan'
|
||||
]
|
||||
},
|
||||
lastNames: [
|
||||
'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez',
|
||||
'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson', 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin',
|
||||
'Lee', 'Perez', 'Thompson', 'White', 'Harris', 'Sanchez', 'Clark', 'Ramirez', 'Lewis', 'Robinson',
|
||||
'Walker', 'Young', 'Allen', 'King', 'Wright', 'Scott', 'Torres', 'Nguyen', 'Hill', 'Flores',
|
||||
'Green', 'Adams', 'Nelson', 'Baker', 'Hall', 'Rivera', 'Campbell', 'Mitchell', 'Carter', 'Roberts',
|
||||
'Turner', 'Phillips', 'Evans', 'Collins', 'Stewart', 'Morris', 'Rogers', 'Reed', 'Cook', 'Morgan',
|
||||
'Bell', 'Murphy', 'Bailey', 'Cooper', 'Richardson', 'Cox', 'Howard', 'Ward', 'Peterson', 'Gray',
|
||||
'James', 'Watson', 'Brooks', 'Kelly', 'Sanders', 'Price', 'Bennett', 'Wood', 'Barnes', 'Ross',
|
||||
'Henderson', 'Coleman', 'Jenkins', 'Perry', 'Powell', 'Long', 'Patterson', 'Hughes', 'Flores', 'Washington'
|
||||
]
|
||||
}
|
||||
|
||||
export function getRandomFirstName(): string {
|
||||
const categories = ['male', 'female', 'neutral']
|
||||
const category = categories[Math.floor(Math.random() * categories.length)] as keyof typeof NAME_DATABASE.firstNames
|
||||
const names = NAME_DATABASE.firstNames[category]
|
||||
return names[Math.floor(Math.random() * names.length)] || 'Alex'
|
||||
}
|
||||
|
||||
export function getRandomLastName(): string {
|
||||
const names = NAME_DATABASE.lastNames
|
||||
return names[Math.floor(Math.random() * names.length)] || 'Smith'
|
||||
}
|
||||
14
src/account-creation/types.ts
Normal file
14
src/account-creation/types.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
export interface CreatedAccount {
|
||||
email: string
|
||||
password: string
|
||||
birthdate: {
|
||||
day: number
|
||||
month: number
|
||||
year: number
|
||||
}
|
||||
firstName: string
|
||||
lastName: string
|
||||
createdAt: string
|
||||
referralUrl?: string
|
||||
notes?: string
|
||||
}
|
||||
Reference in New Issue
Block a user