Spaces:
Running
Running
| <html lang="ru"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Advanced Username Generator</title> | |
| <style> | |
| body { | |
| background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%); | |
| color: #e6e6e6; | |
| font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; | |
| padding: 20px; | |
| min-height: 100vh; | |
| margin: 0; | |
| } | |
| .container { | |
| max-width: 800px; | |
| margin: 0 auto; | |
| background: rgba(30, 30, 46, 0.8); | |
| border-radius: 15px; | |
| padding: 30px; | |
| box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); | |
| backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| } | |
| h2 { | |
| text-align: center; | |
| color: #4cc9f0; | |
| margin-bottom: 30px; | |
| font-size: 28px; | |
| text-shadow: 0 0 10px rgba(76, 201, 240, 0.3); | |
| } | |
| .label { | |
| display: block; | |
| margin: 15px 0 5px; | |
| font-weight: bold; | |
| color: #f72585; | |
| } | |
| input, textarea, button, select { | |
| width: 100%; | |
| margin: 8px 0; | |
| padding: 12px; | |
| font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; | |
| border-radius: 8px; | |
| border: 1px solid rgba(255, 255, 255, 0.2); | |
| background: rgba(20, 20, 35, 0.7); | |
| color: #fff; | |
| box-sizing: border-box; | |
| transition: all 0.3s ease; | |
| } | |
| input:focus, textarea:focus, select:focus { | |
| outline: none; | |
| border-color: #4361ee; | |
| box-shadow: 0 0 10px rgba(67, 97, 238, 0.5); | |
| } | |
| button { | |
| cursor: pointer; | |
| background: linear-gradient(45deg, #4361ee, #3a0ca3); | |
| color: #fff; | |
| border: none; | |
| font-weight: bold; | |
| font-size: 16px; | |
| padding: 15px; | |
| margin-top: 20px; | |
| transition: all 0.3s ease; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| } | |
| button:hover { | |
| background: linear-gradient(45deg, #3a0ca3, #4361ee); | |
| transform: translateY(-2px); | |
| box-shadow: 0 5px 15px rgba(67, 97, 238, 0.4); | |
| } | |
| button:active { | |
| transform: translateY(0); | |
| } | |
| textarea { | |
| min-height: 200px; | |
| resize: vertical; | |
| font-family: monospace; | |
| } | |
| .file-input-wrapper { | |
| position: relative; | |
| overflow: hidden; | |
| display: inline-block; | |
| width: 100%; | |
| } | |
| .file-input-wrapper input[type=file] { | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| opacity: 0; | |
| cursor: pointer; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .file-input-button { | |
| display: block; | |
| padding: 12px; | |
| background: rgba(20, 20, 35, 0.7); | |
| border: 1px dashed rgba(255, 255, 255, 0.3); | |
| border-radius: 8px; | |
| text-align: center; | |
| color: #4cc9f0; | |
| transition: all 0.3s ease; | |
| } | |
| .file-input-button:hover { | |
| background: rgba(30, 30, 46, 0.9); | |
| border-color: #4361ee; | |
| } | |
| .pattern-info { | |
| background: rgba(20, 20, 35, 0.5); | |
| border-radius: 8px; | |
| padding: 15px; | |
| margin: 20px 0; | |
| border-left: 4px solid #f72585; | |
| } | |
| .pattern-info h3 { | |
| color: #4cc9f0; | |
| margin-top: 0; | |
| } | |
| .pattern-list { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | |
| gap: 10px; | |
| margin-top: 10px; | |
| } | |
| .pattern-item { | |
| background: rgba(67, 97, 238, 0.2); | |
| padding: 8px; | |
| border-radius: 5px; | |
| font-size: 14px; | |
| } | |
| .footer { | |
| text-align: center; | |
| margin-top: 30px; | |
| color: #7b7b9d; | |
| font-size: 14px; | |
| } | |
| .domain-section { | |
| margin: 20px 0; | |
| } | |
| .domain-options { | |
| display: flex; | |
| gap: 10px; | |
| margin: 10px 0; | |
| } | |
| .domain-option { | |
| flex: 1; | |
| text-align: center; | |
| padding: 10px; | |
| background: rgba(20, 20, 35, 0.7); | |
| border-radius: 8px; | |
| cursor: pointer; | |
| border: 2px solid transparent; | |
| transition: all 0.3s ease; | |
| } | |
| .domain-option:hover { | |
| border-color: #4361ee; | |
| } | |
| .domain-option.active { | |
| border-color: #f72585; | |
| background: rgba(247, 37, 133, 0.2); | |
| } | |
| .custom-domains { | |
| margin-top: 15px; | |
| } | |
| .custom-domains textarea { | |
| min-height: 100px; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <h2>Генератор логинов (обучение на утечке)</h2> | |
| <div class="pattern-info"> | |
| <h3>Анализ паттернов</h3> | |
| <div class="pattern-list"> | |
| <div class="pattern-item">fnln: имяфамилия</div> | |
| <div class="pattern-item">fn_dot_ln: имя.фамилия</div> | |
| <div class="pattern-item">fi_ln: и.фамилия</div> | |
| <div class="pattern-item">nicknum: имя123</div> | |
| <div class="pattern-item">rawnick: фамилия</div> | |
| <div class="pattern-item">other: другие</div> | |
| </div> | |
| </div> | |
| <label class="label">Файл с логинами (.txt):</label> | |
| <div class="file-input-wrapper"> | |
| <div class="file-input-button" id="fileInputLabel">Выберите файл</div> | |
| <input type="file" id="fileInput"> | |
| </div> | |
| <label class="label">Имена:</label> | |
| <input type="text" id="firstNames" value="daniel,claudia,kevin,anna,roman"> | |
| <label class="label">Фамилии:</label> | |
| <input type="text" id="lastNames" value="pirker,berghoffer,rohrer,schaefer,medved"> | |
| <label class="label">Количество:</label> | |
| <input type="number" id="count" value="50" min="1" max="1000"> | |
| <div class="domain-section"> | |
| <label class="label">Домены:</label> | |
| <div class="domain-options"> | |
| <div class="domain-option active" data-type="default">По умолчанию</div> | |
| <div class="domain-option" data-type="custom">Пользовательские</div> | |
| </div> | |
| <div class="custom-domains" id="customDomainsSection" style="display: none;"> | |
| <label class="label">Введите домены (по одному на строку):</label> | |
| <textarea id="customDomains" placeholder="gmail.com yandex.ru mail.ru outlook.com">gmail.com | |
| yandex.ru | |
| mail.ru | |
| outlook.com | |
| yahoo.com | |
| hotmail.com | |
| icloud.com | |
| protonmail.com</textarea> | |
| </div> | |
| </div> | |
| <button onclick="generate()">Сгенерировать</button> | |
| <label class="label">Результат:</label> | |
| <textarea id="output" placeholder="Сгенерированные логины появятся здесь..."></textarea> | |
| <div class="footer"> | |
| Генератор анализирует паттерны из загруженного файла и создает новые логины на основе выявленных закономерностей | |
| </div> | |
| </div> | |
| <script> | |
| let patterns = { | |
| fnln: 0, | |
| fn_dot_ln: 0, | |
| fi_ln: 0, | |
| nicknum: 0, | |
| rawnick: 0, | |
| other: 0 | |
| }; | |
| let suffixes = ["007", "123", "666", "1337", "777", "999"]; | |
| let defaultDomains = [ | |
| "gmail.com", "gmx.at", "yahoo.com", "outlook.com", "web.de", | |
| "aon.at", "chello.at", "liwest.at", "mail.ru", "yandex.ru", | |
| "hotmail.com", "icloud.com", "protonmail.com" | |
| ]; | |
| let currentDomainType = "default"; | |
| function analyze(lines) { | |
| // Reset patterns | |
| patterns = { | |
| fnln: 0, | |
| fn_dot_ln: 0, | |
| fi_ln: 0, | |
| nicknum: 0, | |
| rawnick: 0, | |
| other: 0 | |
| }; | |
| lines.forEach(l => { | |
| let name = l.split("@")[0]; | |
| if (/^[a-z]+\.[a-z]+[0-9]*$/i.test(name)) patterns.fn_dot_ln++; | |
| else if (/^[a-z][a-z]+[0-9]+$/i.test(name)) patterns.nicknum++; | |
| else if (/^[a-z]\.[a-z]+/i.test(name)) patterns.fi_ln++; | |
| else if (/^[a-z]+[0-9]*$/i.test(name)) patterns.fnln++; | |
| else if (/^[a-z]+$/i.test(name)) patterns.rawnick++; | |
| else patterns.other++; | |
| }); | |
| } | |
| function pickPattern() { | |
| let total = Object.values(patterns).reduce((a, b) => a + b, 0); | |
| if (total === 0) { | |
| // If no patterns analyzed, use default distribution | |
| const defaultPatterns = ['fnln', 'fn_dot_ln', 'fi_ln', 'nicknum', 'rawnick']; | |
| return defaultPatterns[Math.floor(Math.random() * defaultPatterns.length)]; | |
| } | |
| let rnd = Math.random() * total; | |
| let acc = 0; | |
| for (let k in patterns) { | |
| acc += patterns[k]; | |
| if (rnd < acc) return k; | |
| } | |
| return "fnln"; | |
| } | |
| function getDomains() { | |
| if (currentDomainType === "custom") { | |
| const customDomains = document.getElementById("customDomains").value | |
| .split('\n') | |
| .map(d => d.trim()) | |
| .filter(d => d.length > 0); | |
| return customDomains.length > 0 ? customDomains : defaultDomains; | |
| } | |
| return defaultDomains; | |
| } | |
| function generate() { | |
| let fns = document.getElementById("firstNames").value.split(",").map(x => x.trim().toLowerCase()); | |
| let lns = document.getElementById("lastNames").value.split(",").map(x => x.trim().toLowerCase()); | |
| let out = []; | |
| let n = parseInt(document.getElementById("count").value); | |
| let domains = getDomains(); | |
| if (fns.length === 0 || lns.length === 0) { | |
| alert("Пожалуйста, введите имена и фамилии"); | |
| return; | |
| } | |
| if (n <= 0 || n > 1000) { | |
| alert("Количество должно быть от 1 до 1000"); | |
| return; | |
| } | |
| if (domains.length === 0) { | |
| alert("Пожалуйста, введите хотя бы один домен"); | |
| return; | |
| } | |
| for (let i = 0; i < n; i++) { | |
| let fn = fns[Math.floor(Math.random() * fns.length)]; | |
| let ln = lns[Math.floor(Math.random() * lns.length)]; | |
| let pat = pickPattern(); | |
| let base = ""; | |
| if (pat === "fn_dot_ln") base = `${fn}.${ln}`; | |
| else if (pat === "fi_ln") base = `${fn[0]}.${ln}`; | |
| else if (pat === "nicknum") base = `${fn}${Math.floor(10 + Math.random() * 90)}`; | |
| else if (pat === "rawnick") base = `${ln}`; | |
| else base = `${fn}${ln}`; | |
| if (Math.random() < 0.4) { // добавить число | |
| if (Math.random() < 0.7) { | |
| // Add random number | |
| const numTypes = [ | |
| () => Math.floor(10 + Math.random() * 90), | |
| () => Math.floor(100 + Math.random() * 900), | |
| () => Math.floor(1980 + Math.random() * 30), | |
| () => Math.floor(2000 + Math.random() * 25), | |
| () => suffixes[Math.floor(Math.random() * suffixes.length)] | |
| ]; | |
| base += numTypes[Math.floor(Math.random() * numTypes.length)](); | |
| } else { | |
| // Add year | |
| const year = [1980 + Math.floor(Math.random() * 30), 2000 + Math.floor(Math.random() * 25)]; | |
| base += Math.random() < 0.5 ? year[0] : year[1]; | |
| } | |
| } | |
| let dom = domains[Math.floor(Math.random() * domains.length)]; | |
| out.push(base.toLowerCase() + "@" + dom); | |
| } | |
| document.getElementById("output").value = out.join("\n"); | |
| } | |
| document.getElementById("fileInput").addEventListener("change", function(e) { | |
| let file = e.target.files[0]; | |
| if (!file) return; | |
| document.getElementById("fileInputLabel").textContent = file.name; | |
| let r = new FileReader(); | |
| r.onload = () => { | |
| let lines = r.result.split(/\r?\n/).filter(Boolean); | |
| analyze(lines); | |
| alert(`Анализ завершён! Проанализировано ${lines.length} записей.`); | |
| }; | |
| r.readAsText(file); | |
| }); | |
| // Domain selection | |
| document.querySelectorAll('.domain-option').forEach(option => { | |
| option.addEventListener('click', function() { | |
| document.querySelectorAll('.domain-option').forEach(opt => { | |
| opt.classList.remove('active'); | |
| }); | |
| this.classList.add('active'); | |
| currentDomainType = this.dataset.type; | |
| if (currentDomainType === "custom") { | |
| document.getElementById("customDomainsSection").style.display = "block"; | |
| } else { | |
| document.getElementById("customDomainsSection").style.display = "none"; | |
| } | |
| }); | |
| }); | |
| // Initialize with some default analysis | |
| document.addEventListener('DOMContentLoaded', function() { | |
| // Simulate initial analysis with sample data | |
| const sampleData = [ | |
| "daniel.pirker@gmail.com", | |
| "claudia.berghoffer@yahoo.com", | |
| "kevin.rohrer@web.de", | |
| "anna.schaefer@gmx.at", | |
| "roman.medved@aon.at", | |
| "daniel123@gmail.com", | |
| "claudia1985@outlook.com", | |
| "k.rohrer@chello.at", | |
| "anna666@mail.ru", | |
| "medved@yahoo.com" | |
| ]; | |
| analyze(sampleData); | |
| }); | |
| </script> | |
| </body> | |
| </html> |