PS C:\Users\bbSSOOYRR\Desktop> ^C
PS C:\Users\bbSSOOYRR\Desktop>
PS C:\Users\bbSSOOYRR\Desktop> c:; cd 'c:\Users\bbSSOOYRR\Desktop'; & 'c:\Users\bbSSOOYRR\AppData\Local\Programs\Python\Python313\python.exe' 'c:\Users\bbSSOOYRR\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\launcher' '51085' '--' 'C:\Users\bbSSOOYRR\Desktop\from PyQt6 import QtCore, QtGui, QtWidge.py'
PS C:\Users\bbSSOOYRR\Desktop>
исправь
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import os
import requests
import uuid
from math import sin, cos, radians, pi
from PIL import Image, ImageTk
import threading
import time
# Цветовая палитра
COLORS = {
'bg': '#1E1E1E', # Основной фон
'bg_card': '#2D2D2D', # Фон карточек
'bg_hover': '#3D3D3D', # Hover эффект
'accent': '#00BCD4', # Акцентный цвет (голубой)
'accent_hover': '#00ACC1', # Hover для акцента
'text': '#FFFFFF', # Основной текст
'text_secondary': '#B0B0B0', # Вторичный текст
'success': '#4CAF50', # Успешный цвет
'error': '#F44336', # Ошибка
'border': '#404040' # Границы
}
# Конфигурация
DATABASE_FILE = ""
UID_FILE = "uid.txt"
CODE_URL = "https://pastebin.com/raw/S9Zp1kvb"
class ModernButton(tk.Button):
def __init__(self, parent, **kwargs):
# Устанавливаем стили по умолчанию
kwargs.setdefault('bg', COLORS['accent'])
kwargs.setdefault('fg', COLORS['text'])
kwargs.setdefault('bd', 0)
kwargs.setdefault('relief', tk.FLAT)
kwargs.setdefault('font', ('Segoe UI', 10, 'bold'))
kwargs.setdefault('padx', 20)
kwargs.setdefault('pady', 10)
kwargs.setdefault('cursor', 'hand2')
super().__init__(parent, **kwargs)
# Привязываем события мыши
self.bind('<Enter>', self.on_enter)
self.bind('<Leave>', self.on_leave)
self.bind('<ButtonPress-1>', self.on_press)
self.bind('<ButtonRelease-1>', self.on_release)
def on_enter(self, event):
self.config(bg=COLORS['accent_hover'])
def on_leave(self, event):
self.config(bg=COLORS['accent'])
def on_press(self, event):
self.config(relief=tk.SUNKEN)
def on_release(self, event):
self.config(relief=tk.FLAT)
class ModernEntry(tk.Entry):
def __init__(self, parent, **kwargs):
kwargs.setdefault('bg', COLORS['bg_card'])
kwargs.setdefault('fg', COLORS['text'])
kwargs.setdefault('font', ('Segoe UI', 10))
kwargs.setdefault('insertbackground', COLORS['text'])
kwargs.setdefault('borderwidth', 0)
kwargs.setdefault('relief', tk.FLAT)
kwargs.setdefault('highlightthickness', 1)
kwargs.setdefault('highlightbackground', COLORS['border'])
kwargs.setdefault('highlightcolor', COLORS['accent'])
super().__init__(parent, **kwargs)
self.bind('<FocusIn>', self.on_focus_in)
self.bind('<FocusOut>', self.on_focus_out)
def on_focus_in(self, event):
self.config(highlightbackground=COLORS['accent'])
def on_focus_out(self, event):
self.config(highlightbackground=COLORS['border'])
class ModernLabel(tk.Label):
def __init__(self, parent, **kwargs):
kwargs.setdefault('bg', parent['bg'] if 'bg' not in kwargs else kwargs['bg'])
kwargs.setdefault('fg', COLORS['text'])
kwargs.setdefault('font', ('Segoe UI', 10))
super().__init__(parent, **kwargs)
class CardFrame(tk.Frame):
def __init__(self, parent, **kwargs):
kwargs.setdefault('bg', COLORS['bg_card'])
kwargs.setdefault('bd', 1)
kwargs.setdefault('relief', tk.FLAT)
kwargs.setdefault('highlightthickness', 1)
kwargs.setdefault('highlightbackground', COLORS['border'])
super().__init__(parent, **kwargs)
def generate_uid():
if not os.path.exists(UID_FILE):
uid = str(uuid.uuid4())
with open(UID_FILE, "w") as f:
f.write(uid)
return uid
else:
with open(UID_FILE, "r") as f:
return f.read().strip()
def check_code():
uid = generate_uid()
try:
response = requests.get(CODE_URL, timeout=10)
response.raise_for_status()
codes = response.text.strip().split('\n')
return uid in codes
except requests.exceptions.RequestException:
messagebox.showerror("Ошибка!", "Не удалось загрузить коды.")
return False
class LoadingScreen:
def __init__(self, callback):
self.callback = callback
self.root = tk.Tk()
self.root.title("OSINT Tool")
self.root.geometry("400x200")
self.root.configure(bg=COLORS['bg'])
self.root.resizable(False, False)
# Центрирование окна
self.center_window()
# Заголовок
title = ModernLabel(self.root, text="OSINT Tool", font=('Segoe UI', 16, 'bold'))
title.pack(pady=(20, 10))
subtitle = ModernLabel(self.root, text="Инициализация...", fg=COLORS['text_secondary'])
subtitle.pack()
# Canvas для анимации
self.canvas = tk.Canvas(self.root, width=60, height=60, bg=COLORS['bg'], highlightthickness=0)
self.canvas.pack(pady=20)
# Анимация загрузки
self.animate_loading()
# Запускаем проверку в отдельном потоке
threading.Thread(target=self.check_and_start, daemon=True).start()
def center_window(self):
self.root.update_idletasks()
width = self.root.winfo_width()
height = self.root.winfo_height()
x = (self.root.winfo_screenwidth() // 2) - (width // 2)
y = (self.root.winfo_screenheight() // 2) - (height // 2)
self.root.geometry(f'{width}x{height}+{x}+{y}')
def animate_loading(self):
self.canvas.delete("all")
# Внешний круг
self.canvas.create_oval(5, 5, 55, 55, outline=COLORS['border'], width=2)
# Анимированные точки
for i in range(8):
angle = (i * 45 + time.time() * 180) % 360
x = 30 + 20 * cos(radians(angle))
y = 30 + 20 * sin(radians(angle))
if i < 4: # Показываем только половину точек для эффекта волны
alpha = 1.0 - (i * 0.25)
color = self.interpolate_color(COLORS['border'], COLORS['accent'], alpha)
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill=color, outline="")
self.root.after(50, self.animate_loading)
def interpolate_color(self, color1, color2, factor):
# Простая интерполяция между цветами
r1, g1, b1 = int(color1[1:3], 16), int(color1[3:5], 16), int(color1[5:7], 16)
r2, g2, b2 = int(color2[1:3], 16), int(color2[3:5], 16), int(color2[5:7], 16)
r = int(r1 + (r2 - r1) * factor)
g = int(g1 + (g2 - g1) * factor)
b = int(b1 + (b2 - b1) * factor)
return f"#{r:02x}{g:02x}{b:02x}"
def check_and_start(self):
time.sleep(2) # Небольшая задержка для демонстрации загрузки
if check_code():
self.root.after(0, self.start_main_app)
else:
self.root.after(0, self.show_error)
def show_error(self):
messagebox.showerror("Ошибка!", "Код недействителен.")
self.root.quit()
def start_main_app(self):
self.root.destroy()
self.callback()
class ModernOSINTApp:
def __init__(self):
self.root = tk.Tk()
self.root.title("OSINT Tool")
self.root.geometry("800x600")
self.root.configure(bg=COLORS['bg'])
self.root.resizable(True, True)
# Настройка минимального размера
self.root.minsize(600, 450)
self.center_window()
self.setup_styles()
self.create_widgets()
def center_window(self):
self.root.update_idletasks()
width = self.root.winfo_width()
height = self.root.winfo_height()
x = (self.root.winfo_screenwidth() // 2) - (width // 2)
y = (self.root.winfo_screenheight() // 2) - (height // 2)
self.root.geometry(f'{width}x{height}+{x}+{y}')
def setup_styles(self):
style = ttk.Style()
style.theme_use('clam')
# Стиль для вкладок
style.configure('TNotebook', background=COLORS['bg'], borderwidth=0)
style.configure('TNotebook.Tab',
background=COLORS['bg_card'],
foreground=COLORS['text'],
padding=[20, 10],
font=('Segoe UI', 10, 'bold'))
style.map('TNotebook.Tab',
background=[('selected', COLORS['accent']),
('active', COLORS['bg_card'])],
foreground=[('selected', COLORS['text']),
('active', COLORS['text'])])
# Стиль для прокрутки
style.configure('TScrollbar', background=COLORS['bg_card'], troughcolor=COLORS['bg'])
style.map('TScrollbar', background=[('active', COLORS['accent'])])
def create_widgets(self):
# Верхняя панель с заголовком
header = tk.Frame(self.root, bg=COLORS['bg_card'], height=80)
header.pack(fill=tk.X, padx=1, pady=(1, 0))
header.pack_propagate(False)
title = ModernLabel(header, text="OSINT Tool", font=('Segoe UI', 20, 'bold'))
title.pack(pady=20)
# Notebook для вкладок
self.notebook = ttk.Notebook(self.root)
self.notebook.pack(expand=True, fill=tk.BOTH, padx=1, pady=(0, 1))
# Создание вкладок
self.create_main_tab()
self.create_snoser_tab()
self.create_number_tab()
self.create_profile_tab()
# Нижняя панель с информацией
footer = tk.Frame(self.root, bg=COLORS['bg_card'], height=30)
footer.pack(fill=tk.X, padx=1, pady=(0, 1))
footer.pack_propagate(False)
version = ModernLabel(footer, text="version 1.0", fg=COLORS['text_secondary'])
version.pack(side=tk.RIGHT, padx=10, pady=5)
uid = generate_uid()
uid_label = ModernLabel(footer, text=f"ID: {uid[:8]}...", fg=COLORS['text_secondary'])
uid_label.pack(side=tk.LEFT, padx=10, pady=5)
def create_main_tab(self):
main_tab = tk.Frame(self.notebook, bg=COLORS['bg'])
self.notebook.add(main_tab, text="Главная")
# Центральный контейнер
container = CardFrame(main_tab, padx=30, pady=30)
container.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
# Загрузка базы данных
load_btn = ModernButton(container, text="📁 Загрузить базу данных", command=self.load_database)
load_btn.pack(fill=tk.X, pady=(0, 15))
# Информация о базе
self.database_label = ModernLabel(container, text="База данных не выбрана", fg=COLORS['text_secondary'])
self.database_label.pack(pady=(0, 20))
# Разделитель
separator = tk.Frame(container, height=1, bg=COLORS['border'])
separator.pack(fill=tk.X, pady=(0, 20))
# Поиск по номеру
phone_label = ModernLabel(container, text="🔍 Поиск по номеру телефона:")
phone_label.pack(anchor=tk.W)
self.phone_entry = ModernEntry(container)
self.phone_entry.pack(fill=tk.X, pady=(5, 15))
search_btn = ModernButton(container, text="🔎 Искать", command=self.perform_search)
search_btn.pack(fill=tk.X, pady=(0, 15))
# Результаты
result_label = ModernLabel(container, text="Результаты:")
result_label.pack(anchor=tk.W)
self.result_text = tk.Text(container, height=6, bg=COLORS['bg_card'], fg=COLORS['text'],
font=('Segoe UI', 9), wrap=tk.WORD, state=tk.DISABLED)
self.result_text.pack(fill=tk.BOTH, expand=True)
# Scrollbar для результатов
scrollbar = ttk.Scrollbar(self.result_text)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.result_text.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=self.result_text.yview)
def create_snoser_tab(self):
snoser_tab = tk.Frame(self.notebook, bg=COLORS['bg'])
self.notebook.add(snoser_tab, text="Никнейм")
container = CardFrame(snoser_tab, padx=40, pady=40)
container.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
title = ModernLabel(container, text="👤 Поиск по никнейму", font=('Segoe UI', 14, 'bold'))
title.pack(pady=(0, 20))
desc = ModernLabel(container, text="Функционал находится в разработке\nСледите за обновлениями!",
fg=COLORS['text_secondary'], justify=tk.CENTER)
desc.pack(pady=20)
# Иконка ожидания
icon_frame = tk.Frame(container, bg=COLORS['bg_card'], width=60, height=60, bd=1, relief=tk.SOLID)
icon_frame.pack(pady=20)
icon_frame.pack_propagate(False)
icon_label = ModernLabel(icon_frame, text="🚧", font=('Segoe UI', 30))
icon_label.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
def create_number_tab(self):
number_tab = tk.Frame(self.notebook, bg=COLORS['bg'])
self.notebook.add(number_tab, text="Номер")
container = CardFrame(number_tab, padx=40, pady=40)
container.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
title = ModernLabel(container, text="📞 Расширенный поиск по номеру", font=('Segoe UI', 14, 'bold'))
title.pack(pady=(0, 20))
desc = ModernLabel(container, text="Дополнительные функции поиска\nбудут добавлены в ближайших обновлениях",
fg=COLORS['text_secondary'], justify=tk.CENTER)
desc.pack(pady=20)
# Иконка ожидания
icon_frame = tk.Frame(container, bg=COLORS['bg_card'], width=60, height=60, bd=1, relief=tk.SOLID)
icon_frame.pack(pady=20)
icon_frame.pack_propagate(False)
icon_label = ModernLabel(icon_frame, text="🔧", font=('Segoe UI', 30))
icon_label.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
def create_profile_tab(self):
profile_tab = tk.Frame(self.notebook, bg=COLORS['bg'])
self.notebook.add(profile_tab, text="Профиль")
# Левая панель с информацией о пользователе
left_panel = CardFrame(profile_tab, width=250)
left_panel.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)
left_panel.pack_propagate(False)
# Аватар
avatar_frame = tk.Frame(left_panel, bg=COLORS['bg_card'], width=100, height=100)
avatar_frame.pack(pady=(20, 10))
avatar_frame.pack_propagate(False)
self.avatar_label = tk.Label(avatar_frame, bg=COLORS['bg_card'], text="👤", font=('Segoe UI', 40))
self.avatar_label.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
upload_btn = ModernButton(left_panel, text="📷 Загрузить аватар", command=self.load_avatar)
upload_btn.pack(pady=10, padx=20, fill=tk.X)
# Информация о пользователе
uid = generate_uid()
info_frame = tk.Frame(left_panel, bg=COLORS['bg_card'])
info_frame.pack(fill=tk.X, padx=20, pady=10)
ModernLabel(info_frame, text="Ваш ID:", font=('Segoe UI', 9, 'bold')).pack(anchor=tk.W)
ModernLabel(info_frame, text=uid, fg=COLORS['text_secondary'], wraplength=200).pack(anchor=tk.W, pady=(0, 10))
ModernLabel(info_frame, text="Статус:", font=('Segoe UI', 9, 'bold')).pack(anchor=tk.W)
ModernLabel(info_frame, text="✅ Активен", fg=COLORS['success']).pack(anchor=tk.W)
# Правая панель с настройками
right_panel = CardFrame(profile_tab)
right_panel.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=(0, 10), pady=10)
title = ModernLabel(right_panel, text="⚙️ Настройки профиля", font=('Segoe UI', 14, 'bold'))
title.pack(pady=(20, 10))
# Параметры
settings_frame = tk.Frame(right_panel, bg=COLORS['bg_card'])
settings_frame.pack(fill=tk.X, padx=20, pady=10)
# Язык
lang_frame = tk.Frame(settings_frame, bg=COLORS['bg_card'])
lang_frame.pack(fill=tk.X, pady=5)
ModernLabel(lang_frame, text="🌐 Язык:", width=15, anchor=tk.W).pack(side=tk.LEFT)
lang_combo = ttk.Combobox(lang_frame, values=["Русский", "English"], state="readonly", width=15)
lang_combo.set("Русский")
lang_combo.pack(side=tk.RIGHT)
# Тема
theme_frame = tk.Frame(settings_frame, bg=COLORS['bg_card'])
theme_frame.pack(fill=tk.X, pady=5)
ModernLabel(theme_frame, text="🎨 Тема:", width=15, anchor=tk.W).pack(side=tk.LEFT)
theme_combo = ttk.Combobox(theme_frame, values=["Тёмная", "Светлая"], state="readonly", width=15)
theme_combo.set("Тёмная")
theme_combo.pack(side=tk.RIGHT)
# О приложении
about_frame = tk.Frame(right_panel, bg=COLORS['bg_card'])
about_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
about_title = ModernLabel(about_frame, text="О приложении", font=('Segoe UI', 12, 'bold'))
about_title.pack(anchor=tk.W)
about_text = tk.Text(about_frame, height=8, bg=COLORS['bg'], fg=COLORS['text'],
font=('Segoe UI', 9), wrap=tk.WORD, state=tk.DISABLED)
about_text.pack(fill=tk.BOTH, expand=True, pady=(5, 0))
about_content = """OSINT Tool - профессиональный инструмент для сбора и анализа открытых источников информации.
Версия: 1.0.0
Разработано: 2024
Платформа: Tkinter
Особенности:
• Поиск по базам данных
• Анализ телефонных номеров
• Профили пользователей
• Современный интерфейс"""
about_text.config(state=tk.NORMAL)
about_text.insert(tk.END, about_content)
about_text.config(state=tk.DISABLED)
def load_database(self):
global DATABASE_FILE
DATABASE_FILE = filedialog.askopenfilename(
filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")]
)
if DATABASE_FILE:
filename = os.path.basename(DATABASE_FILE)
self.database_label.config(text=f"✅ База загружена: {filename}")
else:
self.database_label.config(text="❌ База не выбрана")
def search_phone(self, phone_number):
if not DATABASE_FILE:
return "⚠️ База данных не выбрана!"
try:
with open(DATABASE_FILE, "r", encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
if phone_number in line:
return f"✅ Найдено в строке {line_num}: {line.strip()}"
return f"❌ номер {phone_number} не найден"
except FileNotFoundError:
return "❌ Файл базы данных не найден"
except Exception as e:
return f"❌ Ошибка чтения файла: {str(e)}"
def perform_search(self):
phone = self.phone_entry.get().strip()
if not phone:
messagebox.showwarning("Предупреждение", "Введите номер телефона для поиска")
return
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
result = self.search_phone(phone)
self.result_text.insert(tk.END, result)
self.result_text.config(state=tk.DISABLED)
def load_avatar(self):
file_path = filedialog.askopenfilename(
filetypes=[("Image Files", "*.png;*.jpg;*.jpeg;*.gif")]
)
if file_path:
try:
img = Image.open(file_path)
img = img.resize((100, 100), Image.LANCZOS)
photo = ImageTk.PhotoImage(img)
self.avatar_label.config(image=photo)
self.avatar_label.image = photo
except Exception as e:
messagebox.showerror("Ошибка", f"Не удалось загрузить изображение: {str(e)}")
def run(self):
self.root.mainloop()
if check_code():
# Показываем современный экран загрузки
loading = LoadingScreen(lambda: ModernOSINTApp().run())
else:
messagebox.showerror("Ошибка!", "Код недействителен.")