С помощью софта можно найти аналоги юзернейма если он уже занят, софт сам подставляет похожие символы и цифры вместо существующих может пригодится когда надо сделать копию аккаунта или группы код import sys import requests from bs4 import BeautifulSoup from itertools import product from PyQt6.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QCheckBox, QProgressBar, QTextEdit, QGridLayout ) from PyQt6.QtCore import Qt, QThread, pyqtSignal, QObject from PyQt6.QtGui import QTextCharFormat def check_username(username): url = f"https://fragment.com/username/{username}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } try: response = requests.get(url, headers=headers, allow_redirects=False, timeout=10) if response.status_code == 302: return f"Юзернейм @{username} свободен и может быть занят.", "free" elif response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') status_element = soup.find('span', class_='tm-section-header-status') if status_element: status_text = status_element.text.strip() if status_text == "For sale": price_element = soup.find('div', class_='table-cell-value tm-value icon-before icon-ton') price = price_element.text.strip() if price_element else "не указана" return f"Юзернейм @{username} выставлен на продажу. Цена: {price} TON.", "sale" else: return f"Юзернейм @{username} занят.", "taken" else: return f"Юзернейм @{username} занят (статус не найден).", "taken" else: return f"Ошибка при проверке юзернейма @{username}: HTTP {response.status_code}", "error" except requests.Timeout: return f"Тайм-аут при проверке @{username}", "error" except requests.RequestException as e: return f"Ошибка при запросе для @{username}: {str(e)}", "error" def generate_variants(username, use_numbers, use_letters): base_substitutions = { 'a': {'numbers': ['4'], 'letters': []}, 'b': {'numbers': ['6'], 'letters': []}, 'e': {'numbers': ['3'], 'letters': []}, 'i': {'numbers': ['1'], 'letters': ['l']}, 'o': {'numbers': ['0'], 'letters': []}, 'k': {'numbers': [], 'letters': ['c']}, 'c': {'numbers': [], 'letters': ['k']}, 'l': {'numbers': [], 'letters': ['I']}, } char_options_list = [] for char_original in username.lower(): options_for_this_char = [char_original] subs = base_substitutions.get(char_original, {}) if use_numbers and subs.get('numbers'): options_for_this_char.extend(subs['numbers']) if use_letters and subs.get('letters'): options_for_this_char.extend(subs['letters']) char_options_list.append(list(dict.fromkeys(options_for_this_char))) variants = {''.join(combination) for combination in product(*char_options_list)} return sorted(list(variants)) class Worker(QObject): progress_signal = pyqtSignal(int, int, str, str) finished_signal = pyqtSignal() log_signal = pyqtSignal(str, str) stats_signal = pyqtSignal(list, list, list, list) variants_count_signal = pyqtSignal(int) final_summary_signal = pyqtSignal(int, int, int, int, int) def __init__(self, username, use_numbers, use_letters): super().__init__() self.username = username self.use_numbers = use_numbers self.use_letters = use_letters self.is_running = True def run(self): stats_free = [] stats_sale = [] stats_taken = [] stats_error = [] self.log_signal.emit(f"Проверка основного юзернейма: @{self.username}", "info") initial_result, status = check_username(self.username) self.log_signal.emit(initial_result, status) if "занят" in initial_result or "продажу" in initial_result : self.log_signal.emit(f"Основной юзернейм @{self.username} занят или на продаже. Начинаю проверку вариантов...", "info") variants = generate_variants(self.username, self.use_numbers, self.use_letters) try: variants.remove(self.username.lower()) except ValueError: pass total_variants = len(variants) self.variants_count_signal.emit(total_variants) self.log_signal.emit(f"Будет проверено вариантов (помимо основного): {total_variants}", "info") if not variants: self.log_signal.emit("Нет вариантов для проверки (кроме основного).", "info") else: for i, variant in enumerate(variants): if not self.is_running: self.log_signal.emit("Проверка остановлена пользователем.", "info") break result, r_status = check_username(variant) self.progress_signal.emit(i + 1, total_variants, result, r_status) if r_status == "free": stats_free.append(variant) elif r_status == "sale": stats_sale.append(variant) elif r_status == "taken": stats_taken.append(variant) elif r_status == "error": stats_error.append(variant) self.stats_signal.emit(stats_free, stats_sale, stats_taken, stats_error) else: self.log_signal.emit(f"Основной юзернейм @{self.username} свободен. Проверка вариантов не требуется.", "free") total_variants = 0 self.final_summary_signal.emit(total_variants, len(stats_free), len(stats_sale), len(stats_taken), len(stats_error)) self.finished_signal.emit() def stop(self): self.is_running = False class UsernameCheckerApp(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Спиздить юзернейм без регистрации и смс") self.setGeometry(100, 100, 1000, 700) self.worker = None self.thread = None self.stats_free_list = [] self.stats_sale_list = [] self.stats_taken_list = [] self.stats_error_list = [] self.setup_ui() self.apply_stylesheet() def setup_ui(self): self.central_widget = QWidget() self.setCentralWidget(self.central_widget) main_layout = QVBoxLayout(self.central_widget) header_label = QLabel("Юзеренейм чекер") header_label.setObjectName("HeaderLabel") header_label.setAlignment(Qt.AlignmentFlag.AlignCenter) main_layout.addWidget(header_label) input_layout = QHBoxLayout() self.username_label = QLabel("Базовый юзернейм:") self.username_entry = QLineEdit() self.username_entry.setPlaceholderText("@username") self.check_button = QPushButton("Проверить") self.check_button.clicked.connect(self.start_check_thread) input_layout.addWidget(self.username_label) input_layout.addWidget(self.username_entry) input_layout.addWidget(self.check_button) main_layout.addLayout(input_layout) options_layout = QHBoxLayout() self.replace_numbers_checkbox = QCheckBox("Заменять цифрами") self.replace_numbers_checkbox.setChecked(True) self.replace_letters_checkbox = QCheckBox("Заменять буквами") self.replace_letters_checkbox.setChecked(True) options_layout.addWidget(self.replace_numbers_checkbox) options_layout.addWidget(self.replace_letters_checkbox) options_layout.addStretch() main_layout.addLayout(options_layout) progress_layout = QHBoxLayout() self.progress_label = QLabel("Готов к проверке.") self.progress_bar = QProgressBar() self.progress_bar.setTextVisible(False) progress_layout.addWidget(self.progress_label) progress_layout.addWidget(self.progress_bar) main_layout.addLayout(progress_layout) self.results_text_edit = QTextEdit() self.results_text_edit.setReadOnly(True) main_layout.addWidget(self.results_text_edit, 1) stats_grid_layout = QGridLayout() self.stats_header_label = QLabel("Статистика:") self.stats_header_label.setObjectName("StatsHeaderLabel") stats_grid_layout.addWidget(self.stats_header_label, 0, 0, 1, 2) self.free_label_title = QLabel("Свободные:") self.free_label_count = QLabel("0") self.free_label_count.setObjectName("FreeCount") stats_grid_layout.addWidget(self.free_label_title, 1, 0) stats_grid_layout.addWidget(self.free_label_count, 1, 1) self.sale_label_title = QLabel("На продаже:") self.sale_label_count = QLabel("0") self.sale_label_count.setObjectName("SaleCount") stats_grid_layout.addWidget(self.sale_label_title, 2, 0) stats_grid_layout.addWidget(self.sale_label_count, 2, 1) self.taken_label_title = QLabel("Занятые:") self.taken_label_count = QLabel("0") self.taken_label_count.setObjectName("TakenCount") stats_grid_layout.addWidget(self.taken_label_title, 3, 0) stats_grid_layout.addWidget(self.taken_label_count, 3, 1) self.error_label_title = QLabel("Ошибки:") self.error_label_count = QLabel("0") self.error_label_count.setObjectName("ErrorCount") stats_grid_layout.addWidget(self.error_label_title, 4, 0) stats_grid_layout.addWidget(self.error_label_count, 4, 1) stats_grid_layout.setColumnStretch(2, 1) main_layout.addLayout(stats_grid_layout) summary_layout = QHBoxLayout() self.free_list_text_edit = QTextEdit() self.free_list_text_edit.setReadOnly(True) self.free_list_text_edit.setObjectName("FreeList") self.free_list_text_edit.setPlaceholderText("Свободные варианты...") self.free_list_text_edit.setMaximumHeight(100) summary_layout.addWidget(self.free_list_text_edit) self.sale_list_text_edit = QTextEdit() self.sale_list_text_edit.setReadOnly(True) self.sale_list_text_edit.setObjectName("SaleList") self.sale_list_text_edit.setPlaceholderText("Варианты на продаже...") self.sale_list_text_edit.setMaximumHeight(100) summary_layout.addWidget(self.sale_list_text_edit) main_layout.addLayout(summary_layout) def apply_stylesheet(self): self.setStyleSheet(''' QWidget { background-color: #2B2B2B; color: #E0E0E0; font-family: "Segoe UI", Arial, sans-serif; font-size: 10pt; } QMainWindow { background-color: #2B2B2B; } #HeaderLabel { font-size: 18pt; font-weight: bold; color: #007ACC; padding: 10px; } #StatsHeaderLabel { font-size: 12pt; font-weight: bold; color: #009688; padding-top: 10px; } QLineEdit { background-color: #3C3F41; border: 1px solid #555555; padding: 5px; border-radius: 3px; color: #FFFFFF; } QPushButton { background-color: #007ACC; color: white; border: none; padding: 8px 15px; border-radius: 3px; font-weight: bold; } QPushButton:hover { background-color: #005C99; } QPushButton:pressed { background-color: #004C80; } QPushButton:disabled { background-color: #4A4A4A; color: #888888; } QCheckBox { spacing: 5px; } QCheckBox::indicator { width: 15px; height: 15px; } QCheckBox::indicator:unchecked { background-color: #3C3F41; border: 1px solid #555555; border-radius: 3px; } QCheckBox::indicator:checked { background-color: #4CAF50; border: 1px solid #3C763D; border-radius: 3px; } QProgressBar { border: 1px solid #555555; border-radius: 3px; background-color: #3C3F41; text-align: center; color: #E0E0E0; } QProgressBar::chunk { background-color: #4CAF50; border-radius: 3px; } QTextEdit { background-color: #1E1E1E; border: 1px solid #444444; color: #CCCCCC; font-family: "Consolas", "Courier New", monospace; font-size: 9pt; padding: 5px; } #FreeCount { color: #4CAF50; font-weight: bold; } #SaleCount { color: #FF9800; font-weight: bold; } #TakenCount { color: #F44336; font-weight: bold; } #ErrorCount { color: #FFEB3B; font-weight: bold; } #FreeList { border: 1px solid #4CAF50; } #SaleList { border: 1px solid #FF9800; } ''') def log_message(self, message, status_tag="info"): color_map = { "free": "#4CAF50", "sale": "#FF9800", "taken": "#F44336", "error": "#FFEB3B", "info": "#00BCD4" } color = color_map.get(status_tag, "#E0E0E0") self.results_text_edit.append(f"<span style='color:{color};'>{message}</span>") def update_progress(self, current_value, max_value, message, status_tag): self.progress_bar.setValue(current_value) self.progress_bar.setMaximum(max_value) self.progress_label.setText(f"Проверено: {current_value}/{max_value}") self.log_message(message, status_tag) def update_stats_display(self, free_list, sale_list, taken_list, error_list): self.stats_free_list = free_list self.stats_sale_list = sale_list self.stats_taken_list = taken_list self.stats_error_list = error_list self.free_label_count.setText(str(len(self.stats_free_list))) self.sale_label_count.setText(str(len(self.stats_sale_list))) self.taken_label_count.setText(str(len(self.stats_taken_list))) self.error_label_count.setText(str(len(self.stats_error_list))) self.free_list_text_edit.setHtml("<br>".join([f"<span style='color:#4CAF50;'>@{u}</span>" for u in self.stats_free_list])) self.sale_list_text_edit.setHtml("<br>".join([f"<span style='color:#FF9800;'>@{u}</span>" for u in self.stats_sale_list])) def set_variants_count(self, count): if count > 0: self.progress_bar.setMaximum(count) self.progress_bar.setValue(0) self.progress_label.setText(f"Всего вариантов для проверки: {count}") def on_check_finished(self): self.check_button.setEnabled(True) self.username_entry.setEnabled(True) self.replace_numbers_checkbox.setEnabled(True) self.replace_letters_checkbox.setEnabled(True) if self.progress_bar.maximum() > 0 and self.progress_bar.value() < self.progress_bar.maximum(): self.progress_label.setText("Проверка остановлена.") elif self.progress_bar.maximum() == 0 and self.progress_bar.value() == 0: self.progress_label.setText("Проверка не потребовалась или нет вариантов.") else: self.progress_label.setText("Проверка завершена.") self.log_message("--- Проверка завершена ---", "info") if self.thread and self.thread.isRunning(): self.thread.quit() self.thread.wait() def display_final_summary(self, total_variants, free_count, sale_count, taken_count, error_count): self.log_message("\n--- Итоги проверки вариантов ---", "info") if total_variants > 0: self.log_message(f"Всего проверено вариантов: {total_variants}", "info") self.log_message(f"Свободных: {free_count}", "free" if free_count > 0 else "info") self.log_message(f"На продаже: {sale_count}", "sale" if sale_count > 0 else "info") self.log_message(f"Занятых: {taken_count}", "taken" if taken_count > 0 else "info") self.log_message(f"С ошибками: {error_count}", "error" if error_count > 0 else "info") else: self.log_message("Варианты не проверялись.", "info") def start_check_thread(self): base_username = self.username_entry.text().strip().lstrip('@') if not base_username: self.log_message("Введите базовый юзернейм!", "error") return self.results_text_edit.clear() self.free_list_text_edit.clear() self.sale_list_text_edit.clear() self.stats_free_list, self.stats_sale_list, self.stats_taken_list, self.stats_error_list = [], [], [], [] self.update_stats_display([],[],[],[]) self.progress_bar.setValue(0) self.progress_bar.setMaximum(100) self.progress_label.setText("Подготовка...") self.check_button.setEnabled(False) self.username_entry.setEnabled(False) self.replace_numbers_checkbox.setEnabled(False) self.replace_letters_checkbox.setEnabled(False) use_numbers = self.replace_numbers_checkbox.isChecked() use_letters = self.replace_letters_checkbox.isChecked() self.thread = QThread() self.worker = Worker(base_username, use_numbers, use_letters) self.worker.moveToThread(self.thread) self.worker.progress_signal.connect(self.update_progress) self.worker.log_signal.connect(self.log_message) self.worker.stats_signal.connect(self.update_stats_display) self.worker.variants_count_signal.connect(self.set_variants_count) self.worker.final_summary_signal.connect(self.display_final_summary) self.worker.finished_signal.connect(self.on_check_finished) self.worker.finished_signal.connect(self.thread.quit) self.worker.finished_signal.connect(self.worker.deleteLater) self.thread.finished.connect(self.thread.deleteLater) self.thread.started.connect(self.worker.run) self.thread.start() def closeEvent(self, event): if self.worker and self.thread and self.thread.isRunning(): self.worker.stop() self.thread.quit() self.thread.wait(2000) event.accept() if __name__ == "__main__": app = QApplication(sys.argv) main_win = UsernameCheckerApp() main_win.show() sys.exit(app.exec()) Python import sys import requests from bs4 import BeautifulSoup from itertools import product from PyQt6.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QCheckBox, QProgressBar, QTextEdit, QGridLayout ) from PyQt6.QtCore import Qt, QThread, pyqtSignal, QObject from PyQt6.QtGui import QTextCharFormat def check_username(username): url = f"https://fragment.com/username/{username}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } try: response = requests.get(url, headers=headers, allow_redirects=False, timeout=10) if response.status_code == 302: return f"Юзернейм @{username} свободен и может быть занят.", "free" elif response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') status_element = soup.find('span', class_='tm-section-header-status') if status_element: status_text = status_element.text.strip() if status_text == "For sale": price_element = soup.find('div', class_='table-cell-value tm-value icon-before icon-ton') price = price_element.text.strip() if price_element else "не указана" return f"Юзернейм @{username} выставлен на продажу. Цена: {price} TON.", "sale" else: return f"Юзернейм @{username} занят.", "taken" else: return f"Юзернейм @{username} занят (статус не найден).", "taken" else: return f"Ошибка при проверке юзернейма @{username}: HTTP {response.status_code}", "error" except requests.Timeout: return f"Тайм-аут при проверке @{username}", "error" except requests.RequestException as e: return f"Ошибка при запросе для @{username}: {str(e)}", "error" def generate_variants(username, use_numbers, use_letters): base_substitutions = { 'a': {'numbers': ['4'], 'letters': []}, 'b': {'numbers': ['6'], 'letters': []}, 'e': {'numbers': ['3'], 'letters': []}, 'i': {'numbers': ['1'], 'letters': ['l']}, 'o': {'numbers': ['0'], 'letters': []}, 'k': {'numbers': [], 'letters': ['c']}, 'c': {'numbers': [], 'letters': ['k']}, 'l': {'numbers': [], 'letters': ['I']}, } char_options_list = [] for char_original in username.lower(): options_for_this_char = [char_original] subs = base_substitutions.get(char_original, {}) if use_numbers and subs.get('numbers'): options_for_this_char.extend(subs['numbers']) if use_letters and subs.get('letters'): options_for_this_char.extend(subs['letters']) char_options_list.append(list(dict.fromkeys(options_for_this_char))) variants = {''.join(combination) for combination in product(*char_options_list)} return sorted(list(variants)) class Worker(QObject): progress_signal = pyqtSignal(int, int, str, str) finished_signal = pyqtSignal() log_signal = pyqtSignal(str, str) stats_signal = pyqtSignal(list, list, list, list) variants_count_signal = pyqtSignal(int) final_summary_signal = pyqtSignal(int, int, int, int, int) def __init__(self, username, use_numbers, use_letters): super().__init__() self.username = username self.use_numbers = use_numbers self.use_letters = use_letters self.is_running = True def run(self): stats_free = [] stats_sale = [] stats_taken = [] stats_error = [] self.log_signal.emit(f"Проверка основного юзернейма: @{self.username}", "info") initial_result, status = check_username(self.username) self.log_signal.emit(initial_result, status) if "занят" in initial_result or "продажу" in initial_result : self.log_signal.emit(f"Основной юзернейм @{self.username} занят или на продаже. Начинаю проверку вариантов...", "info") variants = generate_variants(self.username, self.use_numbers, self.use_letters) try: variants.remove(self.username.lower()) except ValueError: pass total_variants = len(variants) self.variants_count_signal.emit(total_variants) self.log_signal.emit(f"Будет проверено вариантов (помимо основного): {total_variants}", "info") if not variants: self.log_signal.emit("Нет вариантов для проверки (кроме основного).", "info") else: for i, variant in enumerate(variants): if not self.is_running: self.log_signal.emit("Проверка остановлена пользователем.", "info") break result, r_status = check_username(variant) self.progress_signal.emit(i + 1, total_variants, result, r_status) if r_status == "free": stats_free.append(variant) elif r_status == "sale": stats_sale.append(variant) elif r_status == "taken": stats_taken.append(variant) elif r_status == "error": stats_error.append(variant) self.stats_signal.emit(stats_free, stats_sale, stats_taken, stats_error) else: self.log_signal.emit(f"Основной юзернейм @{self.username} свободен. Проверка вариантов не требуется.", "free") total_variants = 0 self.final_summary_signal.emit(total_variants, len(stats_free), len(stats_sale), len(stats_taken), len(stats_error)) self.finished_signal.emit() def stop(self): self.is_running = False class UsernameCheckerApp(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Спиздить юзернейм без регистрации и смс") self.setGeometry(100, 100, 1000, 700) self.worker = None self.thread = None self.stats_free_list = [] self.stats_sale_list = [] self.stats_taken_list = [] self.stats_error_list = [] self.setup_ui() self.apply_stylesheet() def setup_ui(self): self.central_widget = QWidget() self.setCentralWidget(self.central_widget) main_layout = QVBoxLayout(self.central_widget) header_label = QLabel("Юзеренейм чекер") header_label.setObjectName("HeaderLabel") header_label.setAlignment(Qt.AlignmentFlag.AlignCenter) main_layout.addWidget(header_label) input_layout = QHBoxLayout() self.username_label = QLabel("Базовый юзернейм:") self.username_entry = QLineEdit() self.username_entry.setPlaceholderText("@username") self.check_button = QPushButton("Проверить") self.check_button.clicked.connect(self.start_check_thread) input_layout.addWidget(self.username_label) input_layout.addWidget(self.username_entry) input_layout.addWidget(self.check_button) main_layout.addLayout(input_layout) options_layout = QHBoxLayout() self.replace_numbers_checkbox = QCheckBox("Заменять цифрами") self.replace_numbers_checkbox.setChecked(True) self.replace_letters_checkbox = QCheckBox("Заменять буквами") self.replace_letters_checkbox.setChecked(True) options_layout.addWidget(self.replace_numbers_checkbox) options_layout.addWidget(self.replace_letters_checkbox) options_layout.addStretch() main_layout.addLayout(options_layout) progress_layout = QHBoxLayout() self.progress_label = QLabel("Готов к проверке.") self.progress_bar = QProgressBar() self.progress_bar.setTextVisible(False) progress_layout.addWidget(self.progress_label) progress_layout.addWidget(self.progress_bar) main_layout.addLayout(progress_layout) self.results_text_edit = QTextEdit() self.results_text_edit.setReadOnly(True) main_layout.addWidget(self.results_text_edit, 1) stats_grid_layout = QGridLayout() self.stats_header_label = QLabel("Статистика:") self.stats_header_label.setObjectName("StatsHeaderLabel") stats_grid_layout.addWidget(self.stats_header_label, 0, 0, 1, 2) self.free_label_title = QLabel("Свободные:") self.free_label_count = QLabel("0") self.free_label_count.setObjectName("FreeCount") stats_grid_layout.addWidget(self.free_label_title, 1, 0) stats_grid_layout.addWidget(self.free_label_count, 1, 1) self.sale_label_title = QLabel("На продаже:") self.sale_label_count = QLabel("0") self.sale_label_count.setObjectName("SaleCount") stats_grid_layout.addWidget(self.sale_label_title, 2, 0) stats_grid_layout.addWidget(self.sale_label_count, 2, 1) self.taken_label_title = QLabel("Занятые:") self.taken_label_count = QLabel("0") self.taken_label_count.setObjectName("TakenCount") stats_grid_layout.addWidget(self.taken_label_title, 3, 0) stats_grid_layout.addWidget(self.taken_label_count, 3, 1) self.error_label_title = QLabel("Ошибки:") self.error_label_count = QLabel("0") self.error_label_count.setObjectName("ErrorCount") stats_grid_layout.addWidget(self.error_label_title, 4, 0) stats_grid_layout.addWidget(self.error_label_count, 4, 1) stats_grid_layout.setColumnStretch(2, 1) main_layout.addLayout(stats_grid_layout) summary_layout = QHBoxLayout() self.free_list_text_edit = QTextEdit() self.free_list_text_edit.setReadOnly(True) self.free_list_text_edit.setObjectName("FreeList") self.free_list_text_edit.setPlaceholderText("Свободные варианты...") self.free_list_text_edit.setMaximumHeight(100) summary_layout.addWidget(self.free_list_text_edit) self.sale_list_text_edit = QTextEdit() self.sale_list_text_edit.setReadOnly(True) self.sale_list_text_edit.setObjectName("SaleList") self.sale_list_text_edit.setPlaceholderText("Варианты на продаже...") self.sale_list_text_edit.setMaximumHeight(100) summary_layout.addWidget(self.sale_list_text_edit) main_layout.addLayout(summary_layout) def apply_stylesheet(self): self.setStyleSheet(''' QWidget { background-color: #2B2B2B; color: #E0E0E0; font-family: "Segoe UI", Arial, sans-serif; font-size: 10pt; } QMainWindow { background-color: #2B2B2B; } #HeaderLabel { font-size: 18pt; font-weight: bold; color: #007ACC; padding: 10px; } #StatsHeaderLabel { font-size: 12pt; font-weight: bold; color: #009688; padding-top: 10px; } QLineEdit { background-color: #3C3F41; border: 1px solid #555555; padding: 5px; border-radius: 3px; color: #FFFFFF; } QPushButton { background-color: #007ACC; color: white; border: none; padding: 8px 15px; border-radius: 3px; font-weight: bold; } QPushButton:hover { background-color: #005C99; } QPushButton:pressed { background-color: #004C80; } QPushButton:disabled { background-color: #4A4A4A; color: #888888; } QCheckBox { spacing: 5px; } QCheckBox::indicator { width: 15px; height: 15px; } QCheckBox::indicator:unchecked { background-color: #3C3F41; border: 1px solid #555555; border-radius: 3px; } QCheckBox::indicator:checked { background-color: #4CAF50; border: 1px solid #3C763D; border-radius: 3px; } QProgressBar { border: 1px solid #555555; border-radius: 3px; background-color: #3C3F41; text-align: center; color: #E0E0E0; } QProgressBar::chunk { background-color: #4CAF50; border-radius: 3px; } QTextEdit { background-color: #1E1E1E; border: 1px solid #444444; color: #CCCCCC; font-family: "Consolas", "Courier New", monospace; font-size: 9pt; padding: 5px; } #FreeCount { color: #4CAF50; font-weight: bold; } #SaleCount { color: #FF9800; font-weight: bold; } #TakenCount { color: #F44336; font-weight: bold; } #ErrorCount { color: #FFEB3B; font-weight: bold; } #FreeList { border: 1px solid #4CAF50; } #SaleList { border: 1px solid #FF9800; } ''') def log_message(self, message, status_tag="info"): color_map = { "free": "#4CAF50", "sale": "#FF9800", "taken": "#F44336", "error": "#FFEB3B", "info": "#00BCD4" } color = color_map.get(status_tag, "#E0E0E0") self.results_text_edit.append(f"<span style='color:{color};'>{message}</span>") def update_progress(self, current_value, max_value, message, status_tag): self.progress_bar.setValue(current_value) self.progress_bar.setMaximum(max_value) self.progress_label.setText(f"Проверено: {current_value}/{max_value}") self.log_message(message, status_tag) def update_stats_display(self, free_list, sale_list, taken_list, error_list): self.stats_free_list = free_list self.stats_sale_list = sale_list self.stats_taken_list = taken_list self.stats_error_list = error_list self.free_label_count.setText(str(len(self.stats_free_list))) self.sale_label_count.setText(str(len(self.stats_sale_list))) self.taken_label_count.setText(str(len(self.stats_taken_list))) self.error_label_count.setText(str(len(self.stats_error_list))) self.free_list_text_edit.setHtml("<br>".join([f"<span style='color:#4CAF50;'>@{u}</span>" for u in self.stats_free_list])) self.sale_list_text_edit.setHtml("<br>".join([f"<span style='color:#FF9800;'>@{u}</span>" for u in self.stats_sale_list])) def set_variants_count(self, count): if count > 0: self.progress_bar.setMaximum(count) self.progress_bar.setValue(0) self.progress_label.setText(f"Всего вариантов для проверки: {count}") def on_check_finished(self): self.check_button.setEnabled(True) self.username_entry.setEnabled(True) self.replace_numbers_checkbox.setEnabled(True) self.replace_letters_checkbox.setEnabled(True) if self.progress_bar.maximum() > 0 and self.progress_bar.value() < self.progress_bar.maximum(): self.progress_label.setText("Проверка остановлена.") elif self.progress_bar.maximum() == 0 and self.progress_bar.value() == 0: self.progress_label.setText("Проверка не потребовалась или нет вариантов.") else: self.progress_label.setText("Проверка завершена.") self.log_message("--- Проверка завершена ---", "info") if self.thread and self.thread.isRunning(): self.thread.quit() self.thread.wait() def display_final_summary(self, total_variants, free_count, sale_count, taken_count, error_count): self.log_message("\n--- Итоги проверки вариантов ---", "info") if total_variants > 0: self.log_message(f"Всего проверено вариантов: {total_variants}", "info") self.log_message(f"Свободных: {free_count}", "free" if free_count > 0 else "info") self.log_message(f"На продаже: {sale_count}", "sale" if sale_count > 0 else "info") self.log_message(f"Занятых: {taken_count}", "taken" if taken_count > 0 else "info") self.log_message(f"С ошибками: {error_count}", "error" if error_count > 0 else "info") else: self.log_message("Варианты не проверялись.", "info") def start_check_thread(self): base_username = self.username_entry.text().strip().lstrip('@') if not base_username: self.log_message("Введите базовый юзернейм!", "error") return self.results_text_edit.clear() self.free_list_text_edit.clear() self.sale_list_text_edit.clear() self.stats_free_list, self.stats_sale_list, self.stats_taken_list, self.stats_error_list = [], [], [], [] self.update_stats_display([],[],[],[]) self.progress_bar.setValue(0) self.progress_bar.setMaximum(100) self.progress_label.setText("Подготовка...") self.check_button.setEnabled(False) self.username_entry.setEnabled(False) self.replace_numbers_checkbox.setEnabled(False) self.replace_letters_checkbox.setEnabled(False) use_numbers = self.replace_numbers_checkbox.isChecked() use_letters = self.replace_letters_checkbox.isChecked() self.thread = QThread() self.worker = Worker(base_username, use_numbers, use_letters) self.worker.moveToThread(self.thread) self.worker.progress_signal.connect(self.update_progress) self.worker.log_signal.connect(self.log_message) self.worker.stats_signal.connect(self.update_stats_display) self.worker.variants_count_signal.connect(self.set_variants_count) self.worker.final_summary_signal.connect(self.display_final_summary) self.worker.finished_signal.connect(self.on_check_finished) self.worker.finished_signal.connect(self.thread.quit) self.worker.finished_signal.connect(self.worker.deleteLater) self.thread.finished.connect(self.thread.deleteLater) self.thread.started.connect(self.worker.run) self.thread.start() def closeEvent(self, event): if self.worker and self.thread and self.thread.isRunning(): self.worker.stop() self.thread.quit() self.thread.wait(2000) event.accept() if __name__ == "__main__": app = QApplication(sys.argv) main_win = UsernameCheckerApp() main_win.show() sys.exit(app.exec()) молодй человек попросил короче import sys,requests from bs4 import BeautifulSoup from itertools import product as P def C(u): try: r=requests.get(f"https://fragment.com/username/{u}",headers={"User-Agent":"Moz"},allow_redirects=0,timeout=5) if r.status_code==302:return f"@{u} free","free" if r.status_code==200: s=BeautifulSoup(r.text,'html.parser').find('span',class_='tm-section-header-status') if s and s.text=='For sale':return f"@{u} sale","sale" return f"@{u} taken","taken" return f"@{u} err{r.status_code}","error" except: return f"@{u} err","error" subs={'a':{'n':['4'],'l':[]},'b':{'n':['6'],'l':[]},'e':{'n':['3'],'l':[]},'i':{'n':['1'],'l':['l']},'o':{'n':['0'],'l':[]},'k':{'n':[],'l':['c']},'c':{'n':[],'l':['k']},'l':{'n':[],'l':['I']}} def V(u,n,l): o=[] for c in u.lower(): cs=[c] s=subs.get(c,{}) cs+=s.get('n',[]) if n else [] cs+=s.get('l',[]) if l else [] o.append(dict.fromkeys(cs)) return [''.join(x) for x in P(*o)] if __name__=='__main__': u=input('user:').strip().lstrip('@') if not u:sys.exit() r,s=C(u);print(r) res={'free':[], 'sale':[], 'taken':0,'error':0} if s in('free','sale'):res[s].append(u) elif s=='taken':res['taken']+=1 else:res['error']+=1 if s!='free': for v in V(u,1,1): if v==u:continue rr,ss=C(v) if ss in('free','sale'):print(rr);res[ss].append(v) elif ss=='taken':res['taken']+=1 else:res['error']+=1 print('free',len(res['free']),*res['free'],'\nsale',len(res['sale']),*res['sale'],'\ntaken',res['taken'],'\nerr',res['error']) Python import sys,requests from bs4 import BeautifulSoup from itertools import product as P def C(u): try: r=requests.get(f"https://fragment.com/username/{u}",headers={"User-Agent":"Moz"},allow_redirects=0,timeout=5) if r.status_code==302:return f"@{u} free","free" if r.status_code==200: s=BeautifulSoup(r.text,'html.parser').find('span',class_='tm-section-header-status') if s and s.text=='For sale':return f"@{u} sale","sale" return f"@{u} taken","taken" return f"@{u} err{r.status_code}","error" except: return f"@{u} err","error" subs={'a':{'n':['4'],'l':[]},'b':{'n':['6'],'l':[]},'e':{'n':['3'],'l':[]},'i':{'n':['1'],'l':['l']},'o':{'n':['0'],'l':[]},'k':{'n':[],'l':['c']},'c':{'n':[],'l':['k']},'l':{'n':[],'l':['I']}} def V(u,n,l): o=[] for c in u.lower(): cs=[c] s=subs.get(c,{}) cs+=s.get('n',[]) if n else [] cs+=s.get('l',[]) if l else [] o.append(dict.fromkeys(cs)) return [''.join(x) for x in P(*o)] if __name__=='__main__': u=input('user:').strip().lstrip('@') if not u:sys.exit() r,s=C(u);print(r) res={'free':[], 'sale':[], 'taken':0,'error':0} if s in('free','sale'):res[s].append(u) elif s=='taken':res['taken']+=1 else:res['error']+=1 if s!='free': for v in V(u,1,1): if v==u:continue rr,ss=C(v) if ss in('free','sale'):print(rr);res[ss].append(v) elif ss=='taken':res['taken']+=1 else:res['error']+=1 print('free',len(res['free']),*res['free'],'\nsale',len(res['sale']),*res['sale'],'\ntaken',res['taken'],'\nerr',res['error'])