884 lines
37 KiB
HTML
Executable File
884 lines
37 KiB
HTML
Executable File
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
<title>Cloud Account Factory — Arsenal</title>
|
|
<style>
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
:root{--bg:#060a14;--s:#0c1220;--c:#111827;--cy:#22d3ee;--gn:#10b981;--rd:#ef4444;--or:#f59e0b;--pu:#a78bfa;--tx:#e2e8f0;--t2:#94a3b8}
|
|
body{background:var(--bg);color:var(--tx);font-family:'DM Sans',sans-serif;padding:24px}
|
|
.hd{font-size:22px;font-weight:700;margin-bottom:20px;display:flex;align-items:center;gap:10px}
|
|
.hd span{font-size:26px}
|
|
.g4{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:24px}
|
|
.g3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:24px}
|
|
.g2{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:24px}
|
|
.cd{background:var(--s);border:1px solid rgba(34,211,238,.08);border-radius:12px;padding:20px}
|
|
.cd h3{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--t2);margin-bottom:8px}
|
|
.sv{font-size:28px;font-weight:700;font-family:'JetBrains Mono',monospace}
|
|
.badge{display:inline-block;padding:3px 10px;border-radius:6px;font-size:11px;font-weight:600}
|
|
.badge.gn{background:rgba(16,185,129,.15);color:var(--gn)}
|
|
.badge.rd{background:rgba(239,68,68,.15);color:var(--rd)}
|
|
.badge.or{background:rgba(245,158,11,.15);color:var(--or)}
|
|
.badge.cy{background:rgba(34,211,238,.15);color:var(--cy)}
|
|
.badge.pu{background:rgba(167,139,250,.15);color:var(--pu)}
|
|
table{width:100%;border-collapse:collapse}
|
|
th{text-align:left;padding:12px;font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--t2);border-bottom:1px solid rgba(30,41,59,.5)}
|
|
td{padding:10px 12px;border-bottom:1px solid rgba(30,41,59,.3);font-size:13px;font-family:'JetBrains Mono',monospace}
|
|
tr:hover{background:rgba(34,211,238,.03)}
|
|
.btn{padding:8px 18px;border-radius:8px;border:none;cursor:pointer;font-size:13px;font-weight:600;transition:.2s}
|
|
.btn-cy{background:rgba(34,211,238,.15);color:var(--cy)}
|
|
.btn-cy:hover{background:rgba(34,211,238,.25)}
|
|
.btn-gn{background:rgba(16,185,129,.15);color:var(--gn)}
|
|
.btn-rd{background:rgba(239,68,68,.15);color:var(--rd)}
|
|
.bar{height:6px;border-radius:3px;background:rgba(30,41,59,.5);overflow:hidden;margin-top:6px}
|
|
.bar div{height:100%;border-radius:3px;transition:width .5s}
|
|
.log{background:var(--bg);border-radius:8px;padding:12px;max-height:200px;overflow-y:auto;font-family:'JetBrains Mono',monospace;font-size:12px;line-height:1.8}
|
|
.act{display:flex;gap:10px;margin-bottom:20px;flex-wrap:wrap}
|
|
.modal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.8);display:none;align-items:center;justify-content:center;z-index:1000}
|
|
.modal-content{background:var(--s);border-radius:12px;padding:30px;width:90%;max-width:1000px;border:1px solid rgba(34,211,238,.15)}
|
|
.input-group{margin-bottom:15px}
|
|
.input-group label{display:block;margin-bottom:8px;font-size:13px;color:var(--t2)}
|
|
.input-group input,.input-group select,.input-group textarea{width:100%;padding:10px;background:var(--bg);border:1px solid rgba(30,41,59,.5);border-radius:6px;color:var(--tx);font-family:'JetBrains Mono',monospace}
|
|
.checkbox-group{display:flex;flex-wrap:wrap;gap:15px;margin:10px 0}
|
|
.checkbox-item{display:flex;align-items:center;gap:8px}
|
|
.checkbox-item input{width:auto}
|
|
.tabs{display:flex;gap:2px;margin-bottom:20px}
|
|
.tab{flex:1;padding:12px;text-align:center;background:var(--bg);border:1px solid rgba(30,41,59,.5);cursor:pointer;font-size:13px;font-weight:600}
|
|
.tab.active{background:var(--s);border-color:var(--cy);color:var(--cy)}
|
|
.tab-content{display:none}
|
|
.tab-content.active{display:block}
|
|
.step-indicator{display:flex;justify-content:space-between;margin:20px 0;position:relative}
|
|
.step-indicator:before{content:'';position:absolute;top:15px;left:0;right:0;height:2px;background:rgba(30,41,59,.5);z-index:1}
|
|
.step{display:flex;flex-direction:column;align-items:center;position:relative;z-index:2}
|
|
.step-circle{width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;background:var(--bg);border:2px solid rgba(30,41,59,.5);margin-bottom:5px}
|
|
.step.active .step-circle{background:var(--cy);border-color:var(--cy);color:var(--bg)}
|
|
.step.completed .step-circle{background:var(--gn);border-color:var(--gn);color:var(--bg)}
|
|
.step-label{font-size:11px;color:var(--t2)}
|
|
.step.active .step-label{color:var(--tx)}
|
|
@media(max-width:1200px){.g4{grid-template-columns:repeat(2,1fr)}}
|
|
@media(max-width:768px){.g4,.g3,.g2{grid-template-columns:1fr}}
|
|
</style>
|
|
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
|
</head><body>
|
|
<div class="hd"><span>☁️</span> Cloud Account Factory</div>
|
|
|
|
<div class="g4">
|
|
<div class="cd">
|
|
<h3>Total Accounts</h3>
|
|
<div class="sv" style="color:var(--cy)" id="kpiTotal">0</div>
|
|
<div style="font-size:12px;color:var(--t2)">cloud accounts created</div>
|
|
</div>
|
|
<div class="cd">
|
|
<h3>Active Today</h3>
|
|
<div class="sv" style="color:var(--gn)" id="kpiActive">0</div>
|
|
<div style="font-size:12px;color:var(--t2)">accounts created today</div>
|
|
</div>
|
|
<div class="cd">
|
|
<h3>Success Rate</h3>
|
|
<div class="sv" style="color:var(--or)" id="kpiSuccess">0%</div>
|
|
<div class="bar"><div id="successBar" style="width:0%;background:var(--or)"></div></div>
|
|
</div>
|
|
<div class="cd">
|
|
<h3>Brain Launched</h3>
|
|
<div class="sv" style="color:var(--pu)" id="kpiBrain">0</div>
|
|
<div style="font-size:12px;color:var(--t2)">automated workflows</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tabs">
|
|
<div class="tab active" onclick="switchTab(1)">🚀 Brain Automation</div>
|
|
<div class="tab" onclick="switchTab(2)">👤 Manual Creation</div>
|
|
<div class="tab" onclick="switchTab(3)">📋 Account Inventory</div>
|
|
<div class="tab" onclick="switchTab(4)">⚙️ Configuration</div>
|
|
</div>
|
|
|
|
<div class="tab-content active" id="tab1">
|
|
<div class="cd">
|
|
<h3>🚀 Brain-Powered Account Creation</h3>
|
|
<div class="g2" style="margin-bottom:20px">
|
|
<div class="input-group">
|
|
<label>🎯 Target Platform</label>
|
|
<select id="targetPlatform">
|
|
<option value="office365">Office 365 (Microsoft)</option>
|
|
<option value="gmail">Gmail / Google Workspace</option>
|
|
<option value="cloudflare">Cloudflare</option>
|
|
<option value="freedns">FreeDNS</option>
|
|
<option value="scaleway">Scaleway</option>
|
|
<option value="aws">AWS (Amazon)</option>
|
|
<option value="digitalocean">DigitalOcean</option>
|
|
<option value="sendgrid">SendGrid</option>
|
|
<option value="mailgun">Mailgun</option>
|
|
<option value="mailchimp">Mailchimp</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-group">
|
|
<label>🔢 Quantity to Create</label>
|
|
<select id="quantity">
|
|
<option value="1">1 account</option>
|
|
<option value="5" selected>5 accounts</option>
|
|
<option value="10">10 accounts</option>
|
|
<option value="25">25 accounts</option>
|
|
<option value="50">50 accounts</option>
|
|
<option value="100">100 accounts</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<h4 style="margin:20px 0 15px 0">🔗 Resource Linking</h4>
|
|
<div class="step-indicator">
|
|
<div class="step active" id="step1">
|
|
<div class="step-circle">1</div>
|
|
<div class="step-label">Persona</div>
|
|
</div>
|
|
<div class="step" id="step2">
|
|
<div class="step-circle">2</div>
|
|
<div class="step-label">Temp Email</div>
|
|
</div>
|
|
<div class="step" id="step3">
|
|
<div class="step-circle">3</div>
|
|
<div class="step-label">CVC Card</div>
|
|
</div>
|
|
<div class="step" id="step4">
|
|
<div class="step-circle">4</div>
|
|
<div class="step-label">Cloud Account</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="g4" style="margin-top:25px">
|
|
<div class="input-group">
|
|
<label>👤 Persona Source</label>
|
|
<select id="personaSource">
|
|
<option value="auto">Auto-generate new personas</option>
|
|
<option value="existing">Use existing personas</option>
|
|
<option value="scraped">Use scraped leads</option>
|
|
<option value="custom">Custom personas</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-group">
|
|
<label>📧 Temp Email Provider</label>
|
|
<select id="emailProvider">
|
|
<option value="tempmail">Temp-Mail.org</option>
|
|
<option value="guerrilla">Guerrilla Mail</option>
|
|
<option value="10minutemail">10MinuteMail</option>
|
|
<option value="yopmail">YopMail</option>
|
|
<option value="maildrop">MailDrop</option>
|
|
<option value="tempmailo">TempMailo</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-group">
|
|
<label>💳 CVC Source</label>
|
|
<select id="cvcSource">
|
|
<option value="auto">Auto-generate cards</option>
|
|
<option value="vault">Use from CVC Vault</option>
|
|
<option value="bin">Generate from BIN</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-group">
|
|
<label>🌍 Geo Location</label>
|
|
<select id="geoLocation">
|
|
<option value="auto">Auto-match platform</option>
|
|
<option value="US">United States</option>
|
|
<option value="DE">Germany</option>
|
|
<option value="FR">France</option>
|
|
<option value="UK">United Kingdom</option>
|
|
<option value="NL">Netherlands</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="input-group" style="margin-top:20px">
|
|
<label>🧠 Brain Configuration</label>
|
|
<div class="checkbox-group">
|
|
<div class="checkbox-item"><input type="checkbox" id="brain_rotateip" checked><label for="brain_rotateip">Rotate IP per account</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="brain_useproxy" checked><label for="brain_useproxy">Use residential proxies</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="brain_antidetect"><label for="brain_antidetect">Anti-detect browser</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="brain_verifyphone"><label for="brain_verifyphone">Auto-verify phone</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="brain_warmup" checked><label for="brain_warmup">Auto-warmup accounts</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="brain_healthcheck"><label for="brain_healthcheck">Health check after creation</label></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="act" style="margin-top:25px">
|
|
<button class="btn btn-gn" onclick="launchBrain()" id="launchBtn">🚀 Launch Brain Automation</button>
|
|
<button class="btn btn-cy" onclick="previewBrain()">👁️ Preview Workflow</button>
|
|
<button class="btn btn-rd" onclick="stopBrain()">⏹️ Stop Brain</button>
|
|
</div>
|
|
|
|
<div id="brainStatus" style="margin-top:20px;display:none">
|
|
<h4>🧠 Brain Execution Status</h4>
|
|
<div style="display:flex;align-items:center;gap:10px;margin:10px 0">
|
|
<div class="bar" style="flex:1"><div id="brainProgress" style="width:0%;background:var(--cy)"></div></div>
|
|
<span id="brainProgressText" style="font-family:'JetBrains Mono'">0%</span>
|
|
</div>
|
|
<div id="brainMessage" style="font-size:12px;color:var(--t2)">Initializing Brain...</div>
|
|
|
|
<div class="g4" style="margin-top:15px">
|
|
<div><span style="color:var(--t2)">Accounts Created:</span> <span id="brainCreated">0</span></div>
|
|
<div><span style="color:var(--t2)">Accounts Failed:</span> <span id="brainFailed">0</span></div>
|
|
<div><span style="color:var(--t2)">Current Step:</span> <span id="brainStep">-</span></div>
|
|
<div><span style="color:var(--t2)">Time Elapsed:</span> <span id="brainTime">0s</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-content" id="tab2">
|
|
<div class="cd">
|
|
<h3>👤 Manual Account Creation</h3>
|
|
<div class="g2" style="margin-bottom:20px">
|
|
<div class="input-group">
|
|
<label>👤 Persona Details</label>
|
|
<div style="display:flex;gap:10px">
|
|
<input type="text" id="firstName" placeholder="First Name" style="flex:1">
|
|
<input type="text" id="lastName" placeholder="Last Name" style="flex:1">
|
|
</div>
|
|
</div>
|
|
<div class="input-group">
|
|
<label>📅 Date of Birth</label>
|
|
<input type="date" id="dob">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="g2" style="margin-bottom:20px">
|
|
<div class="input-group">
|
|
<label>📧 Email Address</label>
|
|
<div style="display:flex;gap:10px">
|
|
<input type="text" id="emailLocal" placeholder="username" style="flex:1">
|
|
<select id="emailDomain" style="width:150px">
|
|
<option value="@gmail.com">@gmail.com</option>
|
|
<option value="@outlook.com">@outlook.com</option>
|
|
<option value="@yahoo.com">@yahoo.com</option>
|
|
<option value="@protonmail.com">@protonmail.com</option>
|
|
<option value="@tutanota.com">@tutanota.com</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="input-group">
|
|
<label>🔑 Password</label>
|
|
<div style="display:flex;gap:10px">
|
|
<input type="text" id="password" placeholder="Password" style="flex:1">
|
|
<button class="btn" style="padding:8px 12px" onclick="generatePassword()">Generate</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="g2" style="margin-bottom:20px">
|
|
<div class="input-group">
|
|
<label>💳 CVC Details</label>
|
|
<div style="display:flex;gap:10px">
|
|
<input type="text" id="cardNumber" placeholder="Card Number" style="flex:2">
|
|
<input type="text" id="cardExpiry" placeholder="MM/YY" style="width:80px">
|
|
<input type="text" id="cardCVC" placeholder="CVC" style="width:60px">
|
|
</div>
|
|
</div>
|
|
<div class="input-group">
|
|
<label>📱 Phone Number</label>
|
|
<div style="display:flex;gap:10px">
|
|
<select id="phoneCountry" style="width:100px">
|
|
<option value="+1">USA +1</option>
|
|
<option value="+49">DE +49</option>
|
|
<option value="+33">FR +33</option>
|
|
<option value="+44">UK +44</option>
|
|
<option value="+31">NL +31</option>
|
|
</select>
|
|
<input type="text" id="phoneNumber" placeholder="Phone Number" style="flex:1">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
<label>☁️ Target Cloud Platform</label>
|
|
<select id="manualPlatform">
|
|
<option value="office365">Office 365</option>
|
|
<option value="gmail">Gmail</option>
|
|
<option value="cloudflare">Cloudflare</option>
|
|
<option value="aws">AWS</option>
|
|
<option value="digitalocean">DigitalOcean</option>
|
|
<option value="sendgrid">SendGrid</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="act" style="margin-top:25px">
|
|
<button class="btn btn-gn" onclick="createManualAccount()">✅ Create Account</button>
|
|
<button class="btn btn-cy" onclick="fillRandom()">🎲 Fill Random Data</button>
|
|
<button class="btn btn-rd" onclick="clearManualForm()">🗑️ Clear Form</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-content" id="tab3">
|
|
<div class="cd">
|
|
<h3>📋 Cloud Account Inventory</h3>
|
|
<div class="act">
|
|
<select id="inventoryPlatform" style="padding:8px 12px;background:var(--bg);border:1px solid rgba(30,41,59,.5);border-radius:6px;color:var(--tx);font-family:'JetBrains Mono',monospace">
|
|
<option value="">All Platforms</option>
|
|
<option value="office365">Office 365</option>
|
|
<option value="gmail">Gmail</option>
|
|
<option value="cloudflare">Cloudflare</option>
|
|
<option value="aws">AWS</option>
|
|
<option value="digitalocean">DigitalOcean</option>
|
|
<option value="sendgrid">SendGrid</option>
|
|
<option value="mailgun">Mailgun</option>
|
|
</select>
|
|
<select id="inventoryStatus" style="padding:8px 12px;background:var(--bg);border:1px solid rgba(30,41,59,.5);border-radius:6px;color:var(--tx);font-family:'JetBrains Mono',monospace">
|
|
<option value="">All Status</option>
|
|
<option value="active">Active</option>
|
|
<option value="warmup">Warmup</option>
|
|
<option value="suspended">Suspended</option>
|
|
<option value="new">New</option>
|
|
</select>
|
|
<button class="btn btn-cy" onclick="loadInventory()">🔄 Refresh</button>
|
|
<button class="btn btn-gn" onclick="exportInventory()">📥 Export</button>
|
|
</div>
|
|
|
|
<table>
|
|
<thead><tr><th>Email</th><th>Platform</th><th>Status</th><th>Persona</th><th>CVC</th><th>Created</th><th>Actions</th></tr></thead>
|
|
<tbody id="inventoryTable">
|
|
<tr><td colspan="7" style="text-align:center;padding:40px;color:var(--t2)">Loading inventory...</td></tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-content" id="tab4">
|
|
<div class="cd">
|
|
<h3>⚙️ Factory Configuration</h3>
|
|
<div class="g2" style="margin-bottom:20px">
|
|
<div class="input-group">
|
|
<label>🤖 Brain API Endpoint</label>
|
|
<input type="text" id="brainEndpoint" value="http://localhost:5890/api/brain-automation.php">
|
|
</div>
|
|
<div class="input-group">
|
|
<label>🔗 Persona API</label>
|
|
<input type="text" id="personaEndpoint" value="/api/mail-personas.php">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="g2" style="margin-bottom:20px">
|
|
<div class="input-group">
|
|
<label>📧 Temp Email API</label>
|
|
<input type="text" id="tempEmailEndpoint" value="/api/temp-email.php">
|
|
</div>
|
|
<div class="input-group">
|
|
<label>💳 CVC Vault API</label>
|
|
<input type="text" id="cvcEndpoint" value="/api/cvc-vault.php">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
<label>⚡ Proxies Configuration</label>
|
|
<textarea id="proxiesConfig" rows="3" placeholder="user:pass@ip:port\nuser2:pass2@ip2:port2"></textarea>
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
<label>🛡️ Security Settings</label>
|
|
<div class="checkbox-group">
|
|
<div class="checkbox-item"><input type="checkbox" id="sec_captcha" checked><label for="sec_captcha">Auto-solve captcha</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="sec_2captcha"><label for="sec_2captcha">Use 2Captcha</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="sec_fingerprint" checked><label for="sec_fingerprint">Randomize fingerprints</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="sec_delay" checked><label for="sec_delay">Random delays</label></div>
|
|
<div class="checkbox-item"><input type="checkbox" id="sec_retry" checked><label for="sec_retry">Auto-retry failed</label></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="act" style="margin-top:25px">
|
|
<button class="btn btn-gn" onclick="saveConfig()">💾 Save Configuration</button>
|
|
<button class="btn btn-cy" onclick="testConnections()">🔗 Test Connections</button>
|
|
<button class="btn btn-rd" onclick="resetConfig()">🔄 Reset to Default</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="cd" style="margin-top:20px">
|
|
<h3>📊 Factory Activity Log</h3>
|
|
<div class="log" id="factoryLog">
|
|
<div style="color:var(--t2)">Factory ready. Waiting for commands...</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
const API = '/api/cloud-factory.php';
|
|
let brainInterval = null;
|
|
let brainStartTime = null;
|
|
|
|
async function loadStats() {
|
|
try {
|
|
const r = await fetch(API + '?action=stats');
|
|
const d = await r.json();
|
|
if(d.status === 'success' && d.data) {
|
|
const s = d.data;
|
|
document.getElementById('kpiTotal').textContent = (s.total_accounts || 0).toLocaleString();
|
|
document.getElementById('kpiActive').textContent = s.created_today || 0;
|
|
document.getElementById('kpiSuccess').textContent = (s.success_rate || 0) + '%';
|
|
document.getElementById('kpiBrain').textContent = s.brain_launches || 0;
|
|
|
|
document.getElementById('successBar').style.width = (s.success_rate || 0) + '%';
|
|
document.getElementById('successBar').style.background =
|
|
(s.success_rate >= 90) ? 'var(--gn)' : (s.success_rate >= 70) ? 'var(--or)' : 'var(--rd)';
|
|
}
|
|
} catch(e) { console.error('Stats error:', e); }
|
|
}
|
|
|
|
async function launchBrain() {
|
|
const platform = document.getElementById('targetPlatform').value;
|
|
const quantity = parseInt(document.getElementById('quantity').value);
|
|
|
|
const config = {
|
|
action: 'brain_launch',
|
|
platform: platform,
|
|
quantity: quantity,
|
|
persona_source: document.getElementById('personaSource').value,
|
|
email_provider: document.getElementById('emailProvider').value,
|
|
cvc_source: document.getElementById('cvcSource').value,
|
|
geo_location: document.getElementById('geoLocation').value,
|
|
options: {
|
|
rotate_ip: document.getElementById('brain_rotateip').checked,
|
|
use_proxy: document.getElementById('brain_useproxy').checked,
|
|
anti_detect: document.getElementById('brain_antidetect').checked,
|
|
verify_phone: document.getElementById('brain_verifyphone').checked,
|
|
warmup: document.getElementById('brain_warmup').checked,
|
|
health_check: document.getElementById('brain_healthcheck').checked
|
|
}
|
|
};
|
|
|
|
const btn = document.getElementById('launchBtn');
|
|
btn.disabled = true;
|
|
btn.innerHTML = '⏳ Launching...';
|
|
|
|
// Show status panel
|
|
document.getElementById('brainStatus').style.display = 'block';
|
|
document.getElementById('brainProgress').style.width = '5%';
|
|
document.getElementById('brainProgressText').textContent = '5%';
|
|
document.getElementById('brainMessage').textContent = 'Initializing brain workflow...';
|
|
document.getElementById('brainCreated').textContent = '0';
|
|
document.getElementById('brainFailed').textContent = '0';
|
|
document.getElementById('brainStep').textContent = 'Initializing';
|
|
document.getElementById('brainTime').textContent = '0s';
|
|
|
|
// Reset steps
|
|
for(let i = 1; i <= 4; i++) {
|
|
document.getElementById('step' + i).className = 'step';
|
|
}
|
|
document.getElementById('step1').className = 'step active';
|
|
|
|
brainStartTime = Date.now();
|
|
|
|
try {
|
|
const r = await fetch(API, {
|
|
method: 'POST',
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: JSON.stringify(config)
|
|
});
|
|
const d = await r.json();
|
|
|
|
if(d.status === 'success') {
|
|
const brainId = d.brain_id;
|
|
document.getElementById('brainMessage').textContent = `Brain launched! ID: ${brainId}`;
|
|
document.getElementById('brainProgress').style.width = '10%';
|
|
document.getElementById('brainProgressText').textContent = '10%';
|
|
|
|
// Start polling brain progress
|
|
brainInterval = setInterval(() => pollBrainProgress(brainId), 2000);
|
|
|
|
// Update log
|
|
logFactory(`🧠 Brain launched for ${quantity} ${platform} accounts`);
|
|
|
|
} else {
|
|
alert(`❌ Failed: ${d.message || 'Unknown error'}`);
|
|
resetBrainUI();
|
|
}
|
|
} catch(e) {
|
|
alert(`❌ Error: ${e.message}`);
|
|
resetBrainUI();
|
|
} finally {
|
|
btn.disabled = false;
|
|
btn.innerHTML = '🚀 Launch Brain Automation';
|
|
}
|
|
}
|
|
|
|
async function pollBrainProgress(brainId) {
|
|
try {
|
|
const r = await fetch(API + '?action=brain_progress&brain_id=' + brainId);
|
|
const d = await r.json();
|
|
|
|
if(d.status === 'success' && d.data) {
|
|
const p = d.data;
|
|
const progress = p.progress || 0;
|
|
|
|
// Update progress bar
|
|
document.getElementById('brainProgress').style.width = progress + '%';
|
|
document.getElementById('brainProgressText').textContent = progress + '%';
|
|
|
|
// Update stats
|
|
document.getElementById('brainCreated').textContent = p.accounts_created || 0;
|
|
document.getElementById('brainFailed').textContent = p.accounts_failed || 0;
|
|
document.getElementById('brainStep').textContent = p.current_step || 'Processing';
|
|
document.getElementById('brainMessage').textContent = p.message || 'Running...';
|
|
|
|
// Update time elapsed
|
|
const elapsed = Math.floor((Date.now() - brainStartTime) / 1000);
|
|
document.getElementById('brainTime').textContent = elapsed + 's';
|
|
|
|
// Update steps
|
|
const steps = ['persona', 'temp_email', 'cvc', 'cloud_account'];
|
|
steps.forEach((step, index) => {
|
|
const stepNum = index + 1;
|
|
const stepDiv = document.getElementById('step' + stepNum);
|
|
if(p.step_completed && p.step_completed.includes(step)) {
|
|
stepDiv.className = 'step completed';
|
|
} else if(p.current_step === step) {
|
|
stepDiv.className = 'step active';
|
|
}
|
|
});
|
|
|
|
// Update log
|
|
if(p.logs) {
|
|
p.logs.forEach(log => logFactory(log.message, log.level));
|
|
}
|
|
|
|
// If brain completed or failed
|
|
if(p.status === 'completed' || p.status === 'failed') {
|
|
clearInterval(brainInterval);
|
|
|
|
// Final message
|
|
const msg = p.status === 'completed' ?
|
|
`✅ Brain completed! Created ${p.accounts_created} accounts` :
|
|
`❌ Brain failed! Created ${p.accounts_created} accounts, failed ${p.accounts_failed}`;
|
|
|
|
document.getElementById('brainMessage').textContent = msg;
|
|
document.getElementById('brainProgress').style.width = '100%';
|
|
document.getElementById('brainProgressText').textContent = '100%';
|
|
|
|
// Mark all steps as completed
|
|
for(let i = 1; i <= 4; i++) {
|
|
document.getElementById('step' + i).className = 'step completed';
|
|
}
|
|
|
|
logFactory(msg);
|
|
|
|
// Refresh stats and inventory
|
|
loadStats();
|
|
loadInventory();
|
|
}
|
|
}
|
|
} catch(e) {
|
|
console.error('Brain progress error:', e);
|
|
}
|
|
}
|
|
|
|
function stopBrain() {
|
|
if(!confirm('Stop the running brain automation?')) return;
|
|
|
|
if(brainInterval) {
|
|
clearInterval(brainInterval);
|
|
brainInterval = null;
|
|
}
|
|
|
|
document.getElementById('brainMessage').textContent = '❌ Brain stopped by user';
|
|
document.getElementById('brainProgress').style.background = 'var(--rd)';
|
|
|
|
logFactory('⏹️ Brain automation stopped by user');
|
|
}
|
|
|
|
function previewBrain() {
|
|
const platform = document.getElementById('targetPlatform').value;
|
|
const quantity = parseInt(document.getElementById('quantity').value);
|
|
|
|
let preview = '🧠 Brain Workflow Preview:\n\n';
|
|
preview += `Platform: ${platform}\n`;
|
|
preview += `Quantity: ${quantity} accounts\n`;
|
|
preview += `Persona Source: ${document.getElementById('personaSource').value}\n`;
|
|
preview += `Email Provider: ${document.getElementById('emailProvider').value}\n`;
|
|
preview += `CVC Source: ${document.getElementById('cvcSource').value}\n`;
|
|
preview += `Geo Location: ${document.getElementById('geoLocation').value}\n\n`;
|
|
preview += 'Steps:\n';
|
|
preview += '1. Generate/Acquire Persona\n';
|
|
preview += '2. Create Temp Email\n';
|
|
preview += '3. Generate/Acquire CVC Card\n';
|
|
preview += '4. Create Cloud Account\n';
|
|
preview += '5. Verify & Warmup\n';
|
|
|
|
alert(preview);
|
|
}
|
|
|
|
async function loadInventory() {
|
|
const platform = document.getElementById('inventoryPlatform').value;
|
|
const status = document.getElementById('inventoryStatus').value;
|
|
|
|
try {
|
|
let url = API + '?action=inventory';
|
|
if(platform) url += '&platform=' + encodeURIComponent(platform);
|
|
if(status) url += '&status=' + encodeURIComponent(status);
|
|
|
|
const r = await fetch(url);
|
|
const d = await r.json();
|
|
const accounts = d.data || [];
|
|
|
|
const tbody = document.getElementById('inventoryTable');
|
|
tbody.innerHTML = '';
|
|
|
|
if(accounts.length === 0) {
|
|
tbody.innerHTML = '<tr><td colspan="7" style="text-align:center;padding:40px;color:var(--t2)">No accounts found</td></tr>';
|
|
} else {
|
|
accounts.forEach(acc => {
|
|
const statusBadge = acc.status === 'active' ? 'badge gn' :
|
|
acc.status === 'warmup' ? 'badge or' :
|
|
acc.status === 'suspended' ? 'badge rd' : 'badge cy';
|
|
const statusText = acc.status ? acc.status.charAt(0).toUpperCase() + acc.status.slice(1) : 'Unknown';
|
|
|
|
const platformBadge = acc.platform === 'office365' ? 'badge cy' :
|
|
acc.platform === 'gmail' ? 'badge rd' :
|
|
acc.platform === 'cloudflare' ? 'badge or' : 'badge pu';
|
|
|
|
tbody.innerHTML += `
|
|
<tr>
|
|
<td><span style="font-family:JetBrains Mono">${acc.email || '-'}</span></td>
|
|
<td><span class="${platformBadge}">${acc.platform || '-'}</span></td>
|
|
<td><span class="${statusBadge}">${statusText}</span></td>
|
|
<td>${acc.persona_name || '-'}</td>
|
|
<td>${acc.cvc_last4 ? `****${acc.cvc_last4}` : '-'}</td>
|
|
<td>${acc.created_at ? new Date(acc.created_at).toLocaleDateString() : '-'}</td>
|
|
<td>
|
|
<button class="btn" style="padding:4px 8px;font-size:11px" onclick="checkAccount('${acc.id}')">Check</button>
|
|
<button class="btn" style="padding:4px 8px;font-size:11px" onclick="deleteAccount('${acc.id}')">Delete</button>
|
|
</td>
|
|
</tr>
|
|
`;
|
|
});
|
|
}
|
|
} catch(e) {
|
|
console.error('Inventory error:', e);
|
|
document.getElementById('inventoryTable').innerHTML =
|
|
'<tr><td colspan="7" style="text-align:center;padding:40px;color:var(--rd)">Error loading inventory</td></tr>';
|
|
}
|
|
}
|
|
|
|
async function createManualAccount() {
|
|
const firstName = document.getElementById('firstName').value.trim();
|
|
const lastName = document.getElementById('lastName').value.trim();
|
|
const email = document.getElementById('emailLocal').value.trim() + document.getElementById('emailDomain').value;
|
|
const password = document.getElementById('password').value.trim();
|
|
const platform = document.getElementById('manualPlatform').value;
|
|
|
|
if(!firstName || !lastName || !email || !password) {
|
|
alert('Please fill all required fields');
|
|
return;
|
|
}
|
|
|
|
const config = {
|
|
action: 'create_manual',
|
|
first_name: firstName,
|
|
last_name: lastName,
|
|
email: email,
|
|
password: password,
|
|
platform: platform,
|
|
dob: document.getElementById('dob').value,
|
|
card_number: document.getElementById('cardNumber').value.trim(),
|
|
card_expiry: document.getElementById('cardExpiry').value.trim(),
|
|
card_cvc: document.getElementById('cardCVC').value.trim(),
|
|
phone: document.getElementById('phoneCountry').value + document.getElementById('phoneNumber').value.trim()
|
|
};
|
|
|
|
try {
|
|
const r = await fetch(API, {
|
|
method: 'POST',
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: JSON.stringify(config)
|
|
});
|
|
const d = await r.json();
|
|
|
|
if(d.status === 'success') {
|
|
alert(`✅ Account created successfully!\nEmail: ${email}\nPlatform: ${platform}`);
|
|
clearManualForm();
|
|
loadStats();
|
|
loadInventory();
|
|
logFactory(`✅ Manual account created: ${email} on ${platform}`);
|
|
} else {
|
|
alert(`❌ Failed: ${d.message || 'Unknown error'}`);
|
|
logFactory(`❌ Failed to create account: ${d.message}`, 'error');
|
|
}
|
|
} catch(e) {
|
|
alert(`❌ Error: ${e.message}`);
|
|
logFactory(`❌ Error creating account: ${e.message}`, 'error');
|
|
}
|
|
}
|
|
|
|
function generatePassword() {
|
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*';
|
|
let password = '';
|
|
for(let i = 0; i < 12; i++) {
|
|
password += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
}
|
|
document.getElementById('password').value = password;
|
|
}
|
|
|
|
function fillRandom() {
|
|
// Random first names
|
|
const firstNames = ['John', 'Emma', 'Michael', 'Sarah', 'David', 'Lisa', 'Robert', 'Maria', 'William', 'Anna'];
|
|
// Random last names
|
|
const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez'];
|
|
|
|
document.getElementById('firstName').value = firstNames[Math.floor(Math.random() * firstNames.length)];
|
|
document.getElementById('lastName').value = lastNames[Math.floor(Math.random() * lastNames.length)];
|
|
|
|
// Random username
|
|
const randomNum = Math.floor(Math.random() * 10000);
|
|
document.getElementById('emailLocal').value =
|
|
document.getElementById('firstName').value.toLowerCase() +
|
|
document.getElementById('lastName').value.toLowerCase() + randomNum;
|
|
|
|
// Random date of birth (18-65 years old)
|
|
const today = new Date();
|
|
const minAge = 18 * 365 * 24 * 60 * 60 * 1000;
|
|
const maxAge = 65 * 365 * 24 * 60 * 60 * 1000;
|
|
const randomAge = minAge + Math.random() * (maxAge - minAge);
|
|
const randomDob = new Date(today.getTime() - randomAge);
|
|
document.getElementById('dob').value = randomDob.toISOString().split('T')[0];
|
|
|
|
// Generate password
|
|
generatePassword();
|
|
|
|
// Random card number (test BIN)
|
|
const bins = ['411111', '422222', '511111', '555555'];
|
|
const bin = bins[Math.floor(Math.random() * bins.length)];
|
|
let cardNum = bin;
|
|
for(let i = 0; i < 10; i++) {
|
|
cardNum += Math.floor(Math.random() * 10);
|
|
}
|
|
document.getElementById('cardNumber').value = cardNum;
|
|
|
|
// Random expiry (next 1-4 years)
|
|
const month = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0');
|
|
const year = new Date().getFullYear() + Math.floor(Math.random() * 4) + 1;
|
|
document.getElementById('cardExpiry').value = month + '/' + String(year).slice(-2);
|
|
|
|
// Random CVC
|
|
document.getElementById('cardCVC').value = String(Math.floor(Math.random() * 900) + 100);
|
|
|
|
// Random phone
|
|
document.getElementById('phoneNumber').value =
|
|
String(Math.floor(Math.random() * 900000000) + 100000000);
|
|
}
|
|
|
|
function clearManualForm() {
|
|
document.getElementById('firstName').value = '';
|
|
document.getElementById('lastName').value = '';
|
|
document.getElementById('emailLocal').value = '';
|
|
document.getElementById('dob').value = '';
|
|
document.getElementById('password').value = '';
|
|
document.getElementById('cardNumber').value = '';
|
|
document.getElementById('cardExpiry').value = '';
|
|
document.getElementById('cardCVC').value = '';
|
|
document.getElementById('phoneNumber').value = '';
|
|
}
|
|
|
|
async function checkAccount(accountId) {
|
|
try {
|
|
const r = await fetch(API + '?action=check&account_id=' + accountId);
|
|
const d = await r.json();
|
|
|
|
if(d.status === 'success') {
|
|
alert(`✅ Account Status:\n${JSON.stringify(d.data, null, 2)}`);
|
|
logFactory(`✅ Checked account ${accountId}: ${d.data.status}`);
|
|
} else {
|
|
alert(`❌ Failed: ${d.message}`);
|
|
logFactory(`❌ Failed to check account: ${d.message}`, 'error');
|
|
}
|
|
} catch(e) {
|
|
alert(`❌ Error: ${e.message}`);
|
|
logFactory(`❌ Error checking account: ${e.message}`, 'error');
|
|
}
|
|
}
|
|
|
|
async function deleteAccount(accountId) {
|
|
if(!confirm('Delete this cloud account? This cannot be undone.')) return;
|
|
|
|
try {
|
|
const r = await fetch(API, {
|
|
method: 'POST',
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: JSON.stringify({action: 'delete', account_id: accountId})
|
|
});
|
|
const d = await r.json();
|
|
|
|
if(d.status === 'success') {
|
|
alert('✅ Account deleted');
|
|
loadStats();
|
|
loadInventory();
|
|
logFactory(`🗑️ Deleted account ${accountId}`);
|
|
} else {
|
|
alert(`❌ Failed: ${d.message}`);
|
|
}
|
|
} catch(e) {
|
|
alert(`❌ Error: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
async function exportInventory() {
|
|
try {
|
|
const r = await fetch(API + '?action=export');
|
|
if(r.ok) {
|
|
const blob = await r.blob();
|
|
const url = window.URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = `cloud-accounts-${new Date().toISOString().split('T')[0]}.csv`;
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
window.URL.revokeObjectURL(url);
|
|
} else {
|
|
alert('❌ Failed to export inventory');
|
|
}
|
|
} catch(e) {
|
|
alert(`❌ Error: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
function logFactory(message, level = 'info') {
|
|
const logDiv = document.getElementById('factoryLog');
|
|
const time = new Date().toLocaleTimeString();
|
|
const color = level === 'error' ? 'var(--rd)' :
|
|
level === 'warning' ? 'var(--or)' :
|
|
level === 'success' ? 'var(--gn)' : 'var(--t2)';
|
|
|
|
logDiv.innerHTML = `<div style="color:${color}">[${time}] ${message}</div>` + logDiv.innerHTML;
|
|
|
|
// Keep only last 50 lines
|
|
const lines = logDiv.innerHTML.split('</div>');
|
|
if(lines.length > 50) {
|
|
logDiv.innerHTML = lines.slice(0, 50).join('</div>') + '</div>';
|
|
}
|
|
}
|
|
|
|
function resetBrainUI() {
|
|
document.getElementById('brainStatus').style.display = 'none';
|
|
document.getElementById('brainProgress').style.width = '0%';
|
|
document.getElementById('brainProgressText').textContent = '0%';
|
|
|
|
for(let i = 1; i <= 4; i++) {
|
|
document.getElementById('step' + i).className = 'step';
|
|
}
|
|
}
|
|
|
|
function switchTab(tabNum) {
|
|
// Update tabs
|
|
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
|
document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
|
|
|
|
document.querySelector('.tab:nth-child(' + tabNum + ')').classList.add('active');
|
|
document.getElementById('tab' + tabNum).classList.add('active');
|
|
|
|
// Load data for tab 3
|
|
if(tabNum === 3) {
|
|
loadInventory();
|
|
}
|
|
}
|
|
|
|
// Initial load
|
|
loadStats();
|
|
setInterval(loadStats, 30000);
|
|
|
|
// Load inventory on tab 3
|
|
document.getElementById('inventoryPlatform').addEventListener('change', loadInventory);
|
|
document.getElementById('inventoryStatus').addEventListener('change', loadInventory);
|
|
</script>
|
|
</body></html>
|