Spaces:
No application file
No application file
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Enhanced ID Generator Tool</title> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <!-- Tailwind CSS --> | |
| <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> | |
| <!-- Font Awesome --> | |
| <link href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.2/css/all.min.css" rel="stylesheet"> | |
| <!-- Google Fonts --> | |
| <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet"> | |
| <!-- Chart.js --> | |
| <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script> | |
| <style> | |
| html, body { font-family: 'Roboto', sans-serif; background: #f3f4f6; color: #222;} | |
| .shadow-card { box-shadow: 0 6px 24px rgb(0 0 0 / 7%),0 1.5px 5px rgb(0 0 0 / 4%);} | |
| .admin-divider {border-bottom: 1.5px solid #e5e7eb;} | |
| .fa {vertical-align: middle;} | |
| /* Hide scrollbars for PDF export */ | |
| ::-webkit-scrollbar {display: none;} | |
| * { scrollbar-width: none; -ms-overflow-style: none;} | |
| /* Remove number input arrows for consistency in PDF export*/ | |
| input[type=number]::-webkit-inner-spin-button, | |
| input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } | |
| input[type=number] { -moz-appearance: textfield;} | |
| /* Card table for generated list */ | |
| #generatedCardsTable th, #generatedCardsTable td {padding: 0.25rem 0.5rem; border-right: 1px solid #eee;} | |
| #generatedCardsTable tr {border-top: 1px solid #eee;} | |
| /* Hide file input for a better button */ | |
| #importFile {display:none;} | |
| .table-wrap {overflow-x: auto;} | |
| @media print { | |
| html, body {background: white;} | |
| .print-hide {display: none ;} | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- HEADER --> | |
| <header class="flex items-center bg-gradient-to-r from-green-400 to-green-200 p-4 shadow-lg"> | |
| <div class="flex items-center space-x-3"> | |
| <i class="fa fa-id-card text-2xl text-white"></i> | |
| <span class="text-2xl font-bold text-white tracking-wide">Fake ID Data Tools+</span> | |
| </div> | |
| <button onclick="showAdmin(true)" class="ml-auto px-6 py-2 rounded bg-black text-white font-semibold shadow-card print-hide transition hover:bg-green-800 text-sm"><i class="fas fa-user-cog mr-2"></i>Admin Panel</button> | |
| </header> | |
| <main class="max-w-5xl mx-auto p-4 space-y-6 bg-white mt-6 rounded-lg shadow-card"> | |
| <!-- CARD GENERATION --> | |
| <section> | |
| <div class="flex items-center mb-2"> | |
| <i class="fa fa-credit-card text-green-600 mr-2"></i> | |
| <h2 class="text-xl font-bold text-green-800">Card Generation</h2> | |
| </div> | |
| <div class="rounded bg-green-50 p-4 shadow-card border border-green-200"> | |
| <div class="grid md:grid-cols-6 sm:grid-cols-2 grid-cols-1 gap-3 mb-4"> | |
| <div><label class="block text-xs mb-1 font-semibold">Card Holder Name</label><input id="holderInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Random if blank"></div> | |
| <div><label class="block text-xs mb-1 font-semibold">Phone Number</label><input id="phoneInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Random if blank"></div> | |
| <div><label class="block text-xs mb-1 font-semibold">Date of Birth</label><input id="dobInput" type="date" class="w-full rounded border px-2 py-1"></div> | |
| <div><label class="block text-xs mb-1 font-semibold">Number to Generate <span class="text-gray-400">(max 5000)</span></label><input id="qtyInput" min="1" max="5000" type="number" value="1" class="w-full rounded border px-2 py-1"></div> | |
| <div><label class="block text-xs mb-1 font-semibold">BIN Source</label><input id="binInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Leave blank for random"></div> | |
| <div><label class="block text-xs mb-1 font-semibold">Bank Name</label><input id="bankInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Optional"></div> | |
| </div> | |
| <div class="grid md:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-3 mb-3"> | |
| <div><label class="block text-xs mb-1 font-semibold">Email</label><input id="emailInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Auto-generated if blank"></div> | |
| <div><label class="block text-xs mb-1 font-semibold">Address</label><input id="addressInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Optional"></div> | |
| <div class="flex items-center mt-7"> | |
| <input id="randBinCheck" type="checkbox" class="mr-2"><label for="randBinCheck" class="text-xs font-semibold">System Random BIN</label> | |
| </div> | |
| </div> | |
| <div class="flex flex-wrap space-x-2 mt-2 mb-2 items-center"> | |
| <button id="generateBtn" class="bg-green-600 hover:bg-green-700 text-white font-bold rounded-md px-4 py-2 shadow-card flex items-center mb-2"><i class="fa-solid fa-circle-plus mr-2"></i>Generate Cards</button> | |
| <label for="importFile" class="bg-blue-400 hover:bg-blue-600 text-white font-bold rounded-md px-4 py-2 shadow-card flex items-center cursor-pointer mb-2"><i class="fa fa-file-upload mr-2"></i>Import Data</label> | |
| <input type="file" id="importFile" accept=".txt,.csv,.json,.pdf"> | |
| <button onclick="clearHistory()" class="bg-red-400 hover:bg-red-600 text-white font-bold rounded-md px-4 py-2 shadow-card flex items-center mb-2"><i class="fa fa-trash mr-2"></i>Clear History</button> | |
| <button onclick="exportHistory('csv')" class="bg-gray-800 hover:bg-gray-900 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-file-csv mr-2"></i>Export CSV</button> | |
| <button onclick="exportHistory('json')" class="bg-gray-800 hover:bg-gray-900 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-file-code mr-2"></i>Export JSON</button> | |
| <button onclick="exportHistory('txt')" class="bg-gray-800 hover:bg-gray-900 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-file-lines mr-2"></i>Export TXT</button> | |
| <button onclick="copyAllCards()" class="bg-purple-500 hover:bg-purple-600 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-copy mr-2"></i>Copy All</button> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- GENERATED CARDS HISTORY --> | |
| <section> | |
| <h3 class="text-lg font-semibold mt-8 mb-1 text-blue-800 flex items-center"><i class="fa fa-history mr-2"></i>Generated Cards History</h3> | |
| <div class="table-wrap border rounded bg-blue-50 border-blue-200 shadow-card pb-2 pt-2 px-2"> | |
| <input id="historySearch" type="text" class="w-full mb-2 rounded px-2 py-1 border border-blue-100" placeholder="Search History (Name, Card, Bank, etc.)..." oninput="filterHistory()"> | |
| <table id="generatedCardsTable" class="w-full text-xs border-collapse"> | |
| <thead> | |
| <tr class="bg-blue-100"> | |
| <th>#</th> | |
| <th>Card Holder</th> | |
| <th>Number</th> | |
| <th>MM/YY</th> | |
| <th>CVV</th> | |
| <th>Bank</th> | |
| <th>BIN</th> | |
| <th>Email</th> | |
| <th>IP</th> | |
| <th>Status</th> | |
| </tr> | |
| </thead> | |
| <tbody id="cardHistory"></tbody> | |
| </table> | |
| <div id="noCardMsg" class="text-center text-gray-400 py-4">No generated cards yet.</div> | |
| </div> | |
| </section> | |
| <!-- CARD VALIDATOR --> | |
| <section id="validator-section"> | |
| <h3 class="text-lg font-semibold mt-6 mb-3 flex items-center text-yellow-700"><i class="fa fa-magnifying-glass mr-2"></i>Card Validator (Simulated)</h3> | |
| <div class="flex flex-col sm:flex-row items-center mb-2"> | |
| <input id="validateCardNumber" type="text" class="w-full sm:w-1/2 rounded border px-2 py-2 mr-4 mb-2 sm:mb-0" placeholder="Paste or type card number"> | |
| <button onclick="validateCard()" class="bg-yellow-500 hover:bg-yellow-600 text-white font-bold py-2 px-6 rounded shadow-card mr-2 flex items-center"><i class="fa fa-check mr-2"></i>Validate</button> | |
| <button onclick="autoValidateCard()" class="bg-yellow-200 text-black hover:bg-yellow-300 rounded shadow px-3 py-2 font-bold flex items-center" title="Auto Validate"><i class="fa fa-bolt"></i> Auto</button> | |
| </div> | |
| <div id="validateStatus" class="font-bold mt-2 mb-3 ml-1"></div> | |
| </section> | |
| <!-- SIMULATED ANALYZERS --> | |
| <section> | |
| <h3 class="text-lg font-semibold mt-8 mb-3 flex items-center text-indigo-700"><i class="fa fa-flask mr-2"></i>Simulated Analyzers</h3> | |
| <div class="grid md:grid-cols-3 gap-3"> | |
| <!-- Fraud Score Simulator --> | |
| <div class="bg-indigo-50 border rounded shadow-card p-3"> | |
| <div class="flex items-center mb-1 text-indigo-700 font-semibold"><i class="fa fa-shield-halved mr-2"></i>Fraud Score Simulator</div> | |
| <div class="flex mb-2"> | |
| <input id="fraudCardInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Enter card number"> | |
| <button onclick="analyzeFraudScore()" class="ml-2 bg-indigo-600 hover:bg-indigo-700 text-white rounded px-3 flex items-center"><i class="fa fa-vial mr-2"></i>Analyze</button> | |
| <button onclick="autoAnalyzeFraud()" class="ml-2 bg-indigo-300 hover:bg-indigo-400 text-black rounded px-2 flex items-center" title="Auto Analyze"><i class="fa fa-bolt"></i></button> | |
| </div> | |
| <div id="fraudScoreResult" class="mt-2 font-bold"></div> | |
| </div> | |
| <!-- IP Address Simulator --> | |
| <div class="bg-blue-50 border rounded shadow-card p-3"> | |
| <div class="flex items-center mb-1 text-blue-700 font-semibold"><i class="fa fa-globe mr-2"></i>IP Address Simulator</div> | |
| <div class="flex mb-2"> | |
| <input id="ipInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Enter IPv4 or IPv6"> | |
| <button onclick="analyzeIP()" class="ml-2 bg-blue-600 hover:bg-blue-700 text-white rounded px-3 flex items-center"><i class="fa fa-network-wired mr-2"></i>Analyze</button> | |
| <button onclick="autoAnalyzeIP()" class="ml-2 bg-blue-300 hover:bg-blue-400 text-black rounded px-2 flex items-center" title="Auto Analyze"><i class="fa fa-bolt"></i></button> | |
| </div> | |
| <div id="ipResult" class="mt-2 font-bold"></div> | |
| </div> | |
| <!-- Email Analyzer Simulator --> | |
| <div class="bg-green-50 border rounded shadow-card p-3"> | |
| <div class="flex items-center mb-1 text-green-800 font-semibold"><i class="fa fa-envelope mr-2"></i>Email Analyzer Simulator</div> | |
| <div class="flex mb-2"> | |
| <input id="emailAnalyzerInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Enter email address"> | |
| <button onclick="analyzeEmail()" class="ml-2 bg-green-700 hover:bg-green-800 text-white rounded px-3 flex items-center"><i class="fa fa-envelope-open-text mr-2"></i>Analyze</button> | |
| <button onclick="autoAnalyzeEmail()" class="ml-2 bg-green-200 hover:bg-green-300 text-black rounded px-2 flex items-center" title="Auto Analyze"><i class="fa fa-bolt"></i></button> | |
| </div> | |
| <div id="emailResult" class="mt-2 font-bold"></div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- SSN TOOLS --> | |
| <section> | |
| <h3 class="text-lg font-semibold mt-8 mb-3 flex items-center text-blue-900"><i class="fa fa-address-card mr-2"></i>SSN Tools (Fake Data)</h3> | |
| <div class="flex flex-col md:flex-row gap-4 mb-2"> | |
| <!-- Fake SSN Generator --> | |
| <div class="bg-blue-100 border rounded shadow-card p-3 flex-1"> | |
| <div class="flex items-center mb-2 text-blue-900 font-semibold"><i class="fa fa-magic mr-2"></i>Fake SSN Generator</div> | |
| <div class="flex mb-2 items-center gap-2"> | |
| <input id="ssnQtyInput" type="number" min="1" max="5000" value="1" class="rounded border px-2 py-1 w-20"> | |
| <button onclick="generateSSNs()" class="bg-blue-700 hover:bg-blue-900 text-white rounded px-3 flex items-center font-bold"><i class="fa fa-plus mr-2"></i>Generate SSNs</button> | |
| <button onclick="autoGenerateSSN()" class="bg-blue-300 hover:bg-blue-400 text-black rounded px-2 flex items-center" title="Auto Generate"><i class="fa fa-bolt"></i></button> | |
| </div> | |
| <div> | |
| <textarea id="ssnGenResult" class="w-full h-16 rounded px-2 py-1 border" readonly></textarea> | |
| </div> | |
| </div> | |
| <!-- SSN Validator --> | |
| <div class="bg-blue-100 border rounded shadow-card p-3 flex-1"> | |
| <div class="flex items-center mb-2 text-blue-900 font-semibold"><i class="fa fa-spell-check mr-2"></i>SSN Validator (Basic)</div> | |
| <div class="flex mb-2 items-center gap-2"> | |
| <input id="ssnValidateInput" type="text" class="rounded border px-2 py-1 w-48" placeholder="SSN (XXX-XX-XXXX)"> | |
| <button onclick="validateSSN()" class="bg-blue-700 hover:bg-blue-900 text-white rounded px-3 flex items-center font-bold"><i class="fa fa-check mr-2"></i>Validate</button> | |
| <button onclick="autoValidateSSN()" class="bg-blue-300 hover:bg-blue-400 text-black rounded px-2 flex items-center" title="Auto Validate"><i class="fa fa-bolt"></i></button> | |
| </div> | |
| <div id="ssnValidateResult" class="mt-2 font-bold"></div> | |
| </div> | |
| </div> | |
| <div class="text-xs text-gray-600 ml-1"><i class="fa fa-info-circle text-blue-400"></i> Generated SSNs are <b>fake</b>, follow known allocation patterns, but are not real. Validation is basic format/rule check only.</div> | |
| </section> | |
| </main> | |
| <!-- ADMIN PANEL MODAL --> | |
| <div id="adminModal" class="hidden fixed inset-0 z-50 bg-black bg-opacity-40 flex justify-center items-center print-hide"> | |
| <div class="bg-white rounded-lg p-6 w-full max-w-2xl shadow-card relative"> | |
| <button onclick="showAdmin(false)" class="absolute top-3 right-4 text-gray-700 hover:text-red-800 text-lg font-bold"><i class="fa fa-times"></i></button> | |
| <div class="text-2xl font-bold mb-1 text-green-800 flex items-center"><i class="fa fa-user-cog mr-2"></i>Admin Panel</div> | |
| <div class="admin-divider mb-4"></div> | |
| <div class="grid md:grid-cols-2 gap-6 mb-6"> | |
| <div> | |
| <label class="block mb-1 font-bold">Live Card Generation Stats</label> | |
| <ul class="text-green-800 font-semibold space-y-2 text-sm list-inside list-disc"> | |
| <li><span>Cards generated (this session): </span><span id="adminCardsCount">0</span></li> | |
| <li><span>Unique BINs imported: </span><span id="adminBinsCount">0</span></li> | |
| <li><span>Saved emails: </span><span id="adminEmailsCount">0</span></li> | |
| <li><span>Uploaded IPs: </span><span id="adminIPsCount">0</span></li> | |
| </ul> | |
| </div> | |
| <div> | |
| <label class="block mb-1 font-bold">Recently Imported Data</label> | |
| <div class="bg-gray-100 rounded px-3 py-2 h-32 overflow-y-auto text-xs" id="adminImports"></div> | |
| </div> | |
| </div> | |
| <div> | |
| <label class="block mb-1 font-bold">Card Generation Timeline</label> | |
| <canvas id="cardGenChart" height="60"></canvas> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- FOOTER --> | |
| <footer class="w-full text-xs text-center py-5 mt-10 text-gray-500 print-hide"> | |
| © 2025 Fake ID Data Tools+ — Data is for testing and educational purposes only.<br> | |
| Design optimized for browser PDF export - use browser’s print-to-PDF for full content. | |
| </footer> | |
| <script> | |
| // DATA STORAGE | |
| let cards = JSON.parse(localStorage.getItem("cards")||"[]"); | |
| let importedBins = JSON.parse(localStorage.getItem("importedBins")||"[]"); | |
| let importedEmails = JSON.parse(localStorage.getItem("importedEmails")||"[]"); | |
| let importedIPs = JSON.parse(localStorage.getItem("importedIPs")||"[]"); | |
| let genTimeline = JSON.parse(localStorage.getItem("genTimeline")||"[]"); // [{ts,count}] | |
| // BIN SOURCES (you can expand with your own or imported) | |
| const staticBins = [ | |
| '4539 1488', '4556 7375', '4916 7336', '4485 2847', | |
| '5490 7559', '4621 0428', '4024 0071', '6011 9400' | |
| ]; | |
| // DOM HELPERS | |
| function el(id) { return document.getElementById(id);} | |
| function showAdmin(show) { | |
| el('adminModal').style.display = show ? 'flex' : 'none'; | |
| if(show) renderAdmin(); | |
| } | |
| // RENDER CARDS HISTORY | |
| function renderHistory() { | |
| let tbody = el('cardHistory'); | |
| let noCardMsg = el('noCardMsg'); | |
| tbody.innerHTML = ""; | |
| let filtered = cards; | |
| let kw = el('historySearch').value.trim().toLowerCase(); | |
| if(kw.length) { | |
| filtered = cards.filter(card => | |
| (card.name||"").toLowerCase().includes(kw) || | |
| (card.number||"").toLowerCase().includes(kw) || | |
| (card.bank||"").toLowerCase().includes(kw) || | |
| (card.email||"").toLowerCase().includes(kw) || | |
| (card.ip||"").toLowerCase().includes(kw) | |
| ); | |
| } | |
| if(!filtered.length) { | |
| noCardMsg.style.display = ''; | |
| return; | |
| } | |
| noCardMsg.style.display = 'none'; | |
| filtered.forEach((card, i) => { | |
| let tr = document.createElement("tr"); | |
| tr.innerHTML = ` | |
| <td>${i+1}</td> | |
| <td>${escapeHTML(card.name)}</td> | |
| <td><span class="font-mono">${card.number}</span></td> | |
| <td>${escapeHTML(card.mm)}/${escapeHTML(card.yy)}</td> | |
| <td>${escapeHTML(card.cvv)}</td> | |
| <td>${escapeHTML(card.bank||'-')}</td> | |
| <td>${escapeHTML(card.bin||'-')}</td> | |
| <td>${escapeHTML(card.email||'-')}</td> | |
| <td>${escapeHTML(card.ip||'-')}</td> | |
| <td>${escapeHTML(card.status||'-')}</td> | |
| `; | |
| tbody.appendChild(tr); | |
| }); | |
| } | |
| // CARD GENERATION LOGIC | |
| el('generateBtn').onclick = function() { | |
| let n = parseInt(el('qtyInput').value); | |
| if(n < 1 || n > 5000 || isNaN(n)) { alert("Number to generate: Enter between 1 and 5000."); return;} | |
| let inputBin = el('binInput').value.replace(/\s+/g, ''); | |
| let useRandomBin = el('randBinCheck').checked || !inputBin; | |
| let bins = useRandomBin ? (staticBins.concat(importedBins)) : [inputBin]; | |
| let bankName = el('bankInput').value || '-'; | |
| let emails = []; | |
| let ips = []; | |
| let cardsBatch = []; | |
| for(let i=0;i<n;i++) { | |
| let bin = bins[Math.floor(Math.random() * bins.length)] || "400000"; | |
| let cardNumber = genCardNumberFromBin(bin.replace(/\s+/g,"")); | |
| let mm = String(Math.floor(Math.random()*12+1)).padStart(2,'0'); | |
| let y = (new Date().getFullYear()+Math.floor(Math.random()*7)+1).toString().substr(2,2); | |
| let cvv = String(Math.floor(Math.random()*900)+100); | |
| let name = el('holderInput').value || genRndName(); | |
| let phone = el('phoneInput').value || ("+1"+randStr(10,"0123456789")); | |
| let email = el('emailInput').value || (genRndMail(name)); | |
| let addr = el('addressInput').value || genRndAddr(); | |
| let ip = randIP(); | |
| let status = "LIVE"; | |
| let obj = {number: cardNumber, mm, yy:y, cvv, bank:bankName, bin, name, phone, email, address:addr, ip, status}; | |
| cards.push(obj); | |
| cardsBatch.push(obj); | |
| emails.push(email); | |
| ips.push(ip); | |
| } | |
| // Track imported | |
| importedEmails = importedEmails.concat(emails.filter(x=>!importedEmails.includes(x))); | |
| importedIPs = importedIPs.concat(ips.filter(x=>!importedIPs.includes(x))); | |
| // Timeline chart | |
| const now = new Date(); | |
| genTimeline.push({ts: now.getTime(), count: n}); | |
| localStorage.setItem("cards",JSON.stringify(cards)); | |
| localStorage.setItem("importedEmails",JSON.stringify(importedEmails)); | |
| localStorage.setItem("importedIPs",JSON.stringify(importedIPs)); | |
| localStorage.setItem("genTimeline",JSON.stringify(genTimeline)); | |
| renderHistory(); | |
| alert(`Generated ${n} cards.`); | |
| } | |
| function filterHistory() {renderHistory();} | |
| function clearHistory() { | |
| if(confirm("Clear all generated cards?")) { | |
| cards = []; | |
| localStorage.setItem("cards","[]"); | |
| renderHistory(); | |
| } | |
| } | |
| // Helper: Generate Card Number According to Luhn algorithm | |
| function genCardNumberFromBin(bin) { | |
| let res = bin; | |
| for(let i=bin.length;i<15;i++) res += Math.floor(Math.random()*10); | |
| // Luhn digit | |
| let arr = res.split('').map(Number); | |
| for(let i=arr.length-1;i>=0;i-=2)arr[i]*=2; | |
| let sum = arr.join('').split('').reduce((a,c)=>a+parseInt(c),0); | |
| let last = (10 - sum%10)%10; | |
| return res + last; | |
| } | |
| function randIP() { | |
| return [rand4(),rand4(),rand4(),rand4()].join('.'); | |
| function rand4(){ let n=Math.floor(Math.random()*254)+1; return n==127?128:n;} | |
| } | |
| function randStr(n, chars) { | |
| let out = ""; let C = chars || "abcdefghijklmnopqrstuvwxyz"; | |
| for(let i=0;i<n;i++) out += C[Math.floor(Math.random()*C.length)]; | |
| return out; | |
| } | |
| function genRndName() { | |
| const first = ["Alex","Dana","Taylor","Jordan","Robin","Morgan","Sam","Jesse"]; | |
| const last = ["Smith","Johnson","Lee","Walker","Cooper","Scott","Lewis","Allen"]; | |
| return first[Math.floor(Math.random()*first.length)]+" "+last[Math.floor(Math.random()*last.length)]; | |
| } | |
| function genRndAddr() { | |
| const streets = ["Park Ave","Maple St.","Elm Dr.","Sunset Blvd.","Oak St.","First Ave."]; | |
| return `${Math.floor(Math.random()*9999)+101} ${streets[Math.floor(Math.random()*streets.length)]}`; | |
| } | |
| function genRndMail(name) { | |
| const d = ["mail.com","yahoo.com","testmail.io","example.org"]; | |
| let nick = name.replace(/\s+/g,'').toLowerCase() + randStr(2,"1234567890"); | |
| return nick+"@"+d[Math.floor(Math.random()*d.length)]; | |
| } | |
| // CARD EXPORT | |
| function exportHistory(fmt) { | |
| let sep, ext, mimetype, content=""; | |
| if(!cards.length) {alert("No cards to export."); return;} | |
| if(fmt=='csv'){ | |
| let keys = ["Card Holder","Number","MM/YY","CVV","Bank","BIN","Email","IP","Status"]; | |
| content = keys.join(",")+'\n'; | |
| cards.forEach(card=>{ | |
| content += `"${card.name}","${card.number}","${card.mm}/${card.yy}","${card.cvv}","${card.bank}","${card.bin}","${card.email}","${card.ip}","${card.status}"\n`; | |
| }); | |
| downloadText(content,"cards.csv"); | |
| } else if(fmt=='json'){ | |
| downloadText(JSON.stringify(cards,null,2),"cards.json"); | |
| } else if(fmt=='txt'){ | |
| cards.forEach(c=>{ | |
| content+=`${c.number}|${c.mm}|${c.yy}|${c.cvv}|${c.name}|${c.email}|${c.bank}|${c.bin}|${c.ip}|${c.status}\n`; | |
| }); | |
| downloadText(content,"cards.txt"); | |
| } | |
| } | |
| function downloadText(text, filename){ | |
| let a = document.createElement('a'); | |
| a.href = 'data:text/plain;charset=utf-8,'+encodeURIComponent(text); | |
| a.download = filename; a.click(); | |
| } | |
| function copyAllCards() { | |
| let out = ""; | |
| cards.forEach(c=>{ | |
| out+=`${c.number}|${c.mm}|${c.yy}|${c.cvv}|${c.name}|${c.email}|${c.bank}|${c.bin}|${c.ip}|${c.status}\n`; | |
| }); | |
| navigator.clipboard.writeText(out).then(()=>alert("All cards copied.")); | |
| } | |
| // CARD VALIDATOR (Simulated) | |
| function validateCard() { | |
| let num = (el('validateCardNumber').value || "").replace(/\s+/g,''); | |
| if(!num.match(/^\d{13,19}$/)) { showStatus("Enter a valid card number.",false); return;} | |
| let isLuhn = luhnChk(num); | |
| let randomStatus = Math.random()>.3 ? "LIVE" : "DEAD"; | |
| let score = Math.floor(Math.random()*60)+40; | |
| showStatus(`${isLuhn?"Valid, ":"INVALID "} ${randomStatus}. Score:${score}/100`,isLuhn); | |
| } | |
| function luhnChk(num) { | |
| let arr = num.split('').reverse().map(x=>parseInt(x)); | |
| let sum = 0; | |
| for(let i=0;i<arr.length;i++) { | |
| let v = arr[i]; | |
| if(i%2==1) v = v*2; | |
| if(v>9) v-=9; | |
| sum+=v; | |
| } | |
| return sum%10===0; | |
| } | |
| function autoValidateCard() { | |
| if(cards.length){el('validateCardNumber').value = cards[0].number; validateCard();} | |
| else {alert("Generate at least one card first.");} | |
| } | |
| function showStatus(txt, good) { | |
| el('validateStatus').innerHTML = txt; | |
| el('validateStatus').style.color = good?"green":"#d97706"; | |
| } | |
| // FRAUD SCORE SIMULATOR (random) | |
| function analyzeFraudScore() { | |
| let num = (el('fraudCardInput').value || "").replace(/\s+/g,''); | |
| if(!num.match(/^\d{13,19}$/)){el('fraudScoreResult').textContent = "Enter a valid card number.";return;} | |
| let fs = Math.floor(Math.random()*40)+50; | |
| el('fraudScoreResult').innerHTML = `Fraud Score: <span class="font-bold">${fs}</span>/100 [${fs < 65 ? "LOW" : "HIGH"}]`; | |
| el('fraudScoreResult').style.color = fs<65?"#18590d":"#b91c1c"; | |
| } | |
| function autoAnalyzeFraud() { | |
| if(cards.length){el('fraudCardInput').value = cards[0].number; analyzeFraudScore();} | |
| else {alert("Generate at least one card first.");} | |
| } | |
| // IP ANALYZER | |
| function analyzeIP() { | |
| let ip = el('ipInput').value; | |
| if(!ip.match(/^(\d{1,3}\.){3}\d{1,3}$/)) { el('ipResult').textContent = "Enter valid IPv4"; el('ipResult').style.color='red'; return; } | |
| let tag = Math.random() > 0.5 ? "Residential" : "Datacenter"; | |
| el('ipResult').innerHTML = `<b class="text-blue-900">${ip}</b> - Type: <span class="font-bold text-gray-700">${tag}</span>`; | |
| el('ipResult').style.color = "#1e293b"; | |
| } | |
| function autoAnalyzeIP() { | |
| if(cards.length){el('ipInput').value = cards[0].ip; analyzeIP();} | |
| else {alert("Generate at least one card first.");} | |
| } | |
| // EMAIL ANALYZER | |
| function analyzeEmail() { | |
| let e = el('emailAnalyzerInput').value || ""; | |
| let hasAt = e.includes("@") && e.length>5; | |
| el('emailResult').textContent = !hasAt ? "Invalid email address." : (["Valid","Suspicious"][Math.round(Math.random())]); | |
| el('emailResult').style.color = hasAt ? (el('emailResult').textContent==='Valid'?'#18590d':'#E6B800') : "red"; | |
| } | |
| function autoAnalyzeEmail() { | |
| if(cards.length){el('emailAnalyzerInput').value = cards[0].email; analyzeEmail();} | |
| else {alert("Generate at least one card first.");} | |
| } | |
| // SSN GENERATOR | |
| function generateSSNs() { | |
| let n = parseInt(el('ssnQtyInput').value)||1; | |
| let out = ""; | |
| for(let i=0;i<Math.min(5000,n);i++) { | |
| let a = String(Math.floor(Math.random()*900)+100); | |
| let g = String(Math.floor(Math.random()*90)+10); | |
| let s = String(Math.floor(Math.random()*9000)+1000); | |
| out += `${a}-${g}-${s}\n`; | |
| } | |
| el('ssnGenResult').value=out.trim(); | |
| } | |
| function autoGenerateSSN() { | |
| el('ssnQtyInput').value=5; generateSSNs(); | |
| } | |
| // SSN VALIDATOR (format check) | |
| function validateSSN() { | |
| let ssn = (el('ssnValidateInput').value||"").replace(/-/g,''); | |
| let valid = ssn.match(/^(?!000|666|9\d{2})\d{3}(?!00)\d{2}(?!0000)\d{4}$/); | |
| el('ssnValidateResult').textContent = valid ? "Valid (format)." : "INVALID"; | |
| el('ssnValidateResult').style.color = valid?"#18590d":"#b91c1c"; | |
| } | |
| function autoValidateSSN() { | |
| if(el('ssnGenResult').value){ | |
| let v = el('ssnGenResult').value.split('\n')[0]; | |
| el('ssnValidateInput').value = v; | |
| validateSSN(); | |
| } else { | |
| autoGenerateSSN(); setTimeout(autoValidateSSN,100); | |
| } | |
| } | |
| // DATA IMPORT HANDLING | |
| el('importFile').addEventListener('change', function(evt){ | |
| let file = evt.target.files[0]; if(!file) return; | |
| let ext = file.name.split(".").pop().toLowerCase(); | |
| let reader = new FileReader(); | |
| reader.onload = function(e) { | |
| let text = e.target.result; | |
| if(ext==="json") { | |
| let data = JSON.parse(text); | |
| if(Array.isArray(data)){ | |
| data.forEach(x=>{ | |
| if(x.bin) importedBins.push(x.bin); | |
| if(x.email) importedEmails.push(x.email); | |
| if(x.ip) importedIPs.push(x.ip); | |
| }); | |
| alert("Imported data from JSON."); | |
| } | |
| } else if(ext==="csv" || ext==="txt"){ | |
| let rows = text.split('\n'); | |
| rows.forEach(r=>{ | |
| let vals = r.split(/[,|;]/); | |
| vals.forEach(v=>{ | |
| v = v.trim(); | |
| if(v.match(/^\d{6,8}$/)) importedBins.push(v); | |
| if(v.includes('@')) importedEmails.push(v); | |
| if(v.match(/^(\d{1,3}\.){3}\d{1,3}$/)) importedIPs.push(v); | |
| }); | |
| }); | |
| alert("Imported plaintext/csv data."); | |
| } else if(ext==="pdf"){ | |
| alert("PDF import requires server parsing: Cannot auto-detect BINs/emails/ips here."); | |
| } | |
| importedBins = Array.from(new Set(importedBins)); | |
| importedEmails = Array.from(new Set(importedEmails)); | |
| importedIPs = Array.from(new Set(importedIPs)); | |
| localStorage.setItem("importedBins",JSON.stringify(importedBins)); | |
| localStorage.setItem("importedEmails",JSON.stringify(importedEmails)); | |
| localStorage.setItem("importedIPs",JSON.stringify(importedIPs)); | |
| }; | |
| if(file) reader.readAsText(file); | |
| }); | |
| // ADMIN PANEL RENDER | |
| function renderAdmin() { | |
| el('adminCardsCount').innerText = cards.length; | |
| el('adminBinsCount').innerText = importedBins.length; | |
| el('adminEmailsCount').innerText = importedEmails.length; | |
| el('adminIPsCount').innerText = importedIPs.length; | |
| let imports = ""; | |
| if(importedBins.length) imports += "<b>Bins:</b><br>"+importedBins.slice(-6).join(", ")+"<br>"; | |
| if(importedEmails.length) imports += "<b>Emails:</b><br>"+importedEmails.slice(-6).join(", ")+"<br>"; | |
| if(importedIPs.length) imports += "<b>IPs:</b><br>"+importedIPs.slice(-6).join(", ")+"<br>"; | |
| el('adminImports').innerHTML = imports||"No data imported yet."; | |
| renderChart(); | |
| } | |
| // Card timeline chart | |
| function renderChart() { | |
| let data = {}; | |
| genTimeline.forEach(x=>{ | |
| let dt = new Date(x.ts); | |
| let ds = `${dt.getFullYear()}-${(dt.getMonth()+1).toString().padStart(2,'0')}-${dt.getDate().toString().padStart(2,'0')}`; | |
| data[ds]= (data[ds]||0)+x.count; | |
| }); | |
| let labels = Object.keys(data); | |
| let counts = Object.values(data); | |
| if(window.cardGenChart) window.cardGenChart.destroy(); | |
| let ctx = document.getElementById('cardGenChart').getContext('2d'); | |
| window.cardGenChart = new Chart(ctx, { | |
| type: 'bar', | |
| data: {labels, datasets:[{label:'Cards Generated',data:counts, backgroundColor:"#059669"}]}, | |
| options: {plugins:{legend:{display:false}},scales:{y:{beginAtZero:true}}} | |
| }); | |
| } | |
| // UTILS | |
| function escapeHTML(txt){return String(txt||'').replace(/[&<>"']/g,c=>({ '&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));} | |
| // INIT | |
| renderHistory(); | |
| // END | |
| </script> | |
| </body> | |
| </html> |