| <!DOCTYPE html> |
| <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"> |
| |
| <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> |
| |
| <link href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.2/css/all.min.css" rel="stylesheet"> |
| |
| <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet"> |
| |
| <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;} |
| |
| ::-webkit-scrollbar {display: none;} |
| * { scrollbar-width: none; -ms-overflow-style: none;} |
| |
| 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;} |
| |
| #generatedCardsTable th, #generatedCardsTable td {padding: 0.25rem 0.5rem; border-right: 1px solid #eee;} |
| #generatedCardsTable tr {border-top: 1px solid #eee;} |
| |
| #importFile {display:none;} |
| .table-wrap {overflow-x: auto;} |
| @media print { |
| html, body {background: white;} |
| .print-hide {display: none !important;} |
| } |
| </style> |
| </head> |
| <body> |
| |
| <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"> |
| |
| <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> |
| |
| <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> |
| |
| <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> |
| |
| <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"> |
| |
| <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> |
| |
| <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> |
| |
| <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> |
| |
| <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"> |
| |
| <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> |
| |
| <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> |
| |
| <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 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> |
| |
| 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")||"[]"); |
| |
| const staticBins = [ |
| '4539 1488', '4556 7375', '4916 7336', '4485 2847', |
| '5490 7559', '4621 0428', '4024 0071', '6011 9400' |
| ]; |
| |
| |
| function el(id) { return document.getElementById(id);} |
| function showAdmin(show) { |
| el('adminModal').style.display = show ? 'flex' : 'none'; |
| if(show) renderAdmin(); |
| } |
| |
| 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); |
| }); |
| } |
| |
| 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); |
| } |
| |
| importedEmails = importedEmails.concat(emails.filter(x=>!importedEmails.includes(x))); |
| importedIPs = importedIPs.concat(ips.filter(x=>!importedIPs.includes(x))); |
| |
| 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(); |
| } |
| } |
| |
| function genCardNumberFromBin(bin) { |
| let res = bin; |
| for(let i=bin.length;i<15;i++) res += Math.floor(Math.random()*10); |
| |
| 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)]; |
| } |
| |
| 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.")); |
| } |
| |
| 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"; |
| } |
| |
| 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.");} |
| } |
| |
| 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.");} |
| } |
| |
| 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.");} |
| } |
| |
| 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(); |
| } |
| |
| 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); |
| } |
| } |
| |
| 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); |
| }); |
| |
| 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(); |
| } |
| |
| 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}}} |
| }); |
| } |
| |
| function escapeHTML(txt){return String(txt||'').replace(/[&<>"']/g,c=>({ '&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));} |
| |
| renderHistory(); |
| |
| </script> |
| </body> |
| </html> |