Leavepatern / index.html
enotkrutoy's picture
Update index.html
a846798 verified
<!DOCTYPE html>
<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&#10;yandex.ru&#10;mail.ru&#10;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>