Guest User

Untitled

a guest
Oct 2nd, 2025
8,571
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.95 KB | Cybersecurity | 0 0
  1. import subprocess
  2. import time
  3. import threading
  4. import requests
  5. import tkinter as tk
  6. from tkinter import messagebox
  7. from stem import Signal
  8. from stem.control import Controller
  9. import traceback
  10. import os
  11.  
  12. # Настройки
  13. TOR_PATH = r"\tor.exe"                             # путь к tor.exe
  14. TOR_RC = r"\torrc"                                 # путь к torrc
  15. CLASH_PATH = r"Clash for Windows.exe"
  16. CONTROL_PASSWORD = ""                              # пароль ControlPort (torrc)
  17. CONTROL_PORT = 9061                                # ControlPort из torrc
  18. CLASH_PORT = 7890                                  # локальный порт Clash (обычно 7890)
  19. DEFAULT_INTERVAL = 60                              # секунд
  20. CREATE_NO_WINDOW = 0x08000000
  21.  
  22. tor_process = None
  23. clash_process = None
  24. enabled = True
  25. interval_sec = DEFAULT_INTERVAL
  26.  
  27. # Управление системным прокси
  28. def enable_system_proxy(port):
  29.     try:
  30.         subprocess.run([
  31.             "reg", "add",
  32.             r"HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings",
  33.             "/v", "ProxyEnable", "/t", "REG_DWORD", "/d", "1", "/f"
  34.         ], check=True)
  35.         subprocess.run([
  36.             "reg", "add",
  37.             r"HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings",
  38.             "/v", "ProxyServer", "/t", "REG_SZ", "/d", f"127.0.0.1:{port}", "/f"
  39.         ], check=True)
  40.     except Exception as e:
  41.         print("Ошибка включения системного прокси:", e)
  42.         traceback.print_exc()
  43.  
  44. def disable_system_proxy():
  45.     try:
  46.         subprocess.run([
  47.             "reg", "add",
  48.             r"HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings",
  49.             "/v", "ProxyEnable", "/t", "REG_DWORD", "/d", "0", "/f"
  50.         ], check=True)
  51.     except Exception as e:
  52.         print("Ошибка выключения системного прокси:", e)
  53.         traceback.print_exc()
  54.  
  55. # Управление процессами
  56. def start_tor():
  57.     global tor_process
  58.     if not tor_process or tor_process.poll() is not None:
  59.         tor_process = subprocess.Popen(
  60.             [TOR_PATH, "-f", TOR_RC],
  61.             creationflags=subprocess.CREATE_NO_WINDOW
  62.         )
  63.  
  64. def stop_tor():
  65.     global tor_process
  66.     if tor_process and tor_process.poll() is None:
  67.         tor_process.terminate()
  68.         tor_process = None
  69.  
  70. def start_clash():
  71.     global clash_process
  72.     if not clash_process or clash_process.poll() is not None:
  73.         clash_process = subprocess.Popen(
  74.             [CLASH_PATH],
  75.             creationflags=CREATE_NO_WINDOW
  76.         )
  77.         enable_system_proxy(CLASH_PORT)
  78.  
  79. def stop_clash():
  80.     global clash_process
  81.     if clash_process and clash_process.poll() is None:
  82.         clash_process.terminate()
  83.         clash_process = None
  84.     disable_system_proxy()
  85.  
  86. # --- Получение IP через Clash ---
  87. def get_ip_via_clash():
  88.     proxies = {"http": f"http://127.0.0.1:{CLASH_PORT}",
  89.                "https": f"http://127.0.0.1:{CLASH_PORT}"}
  90.     try:
  91.         r = requests.get("https://api.ipify.org", proxies=proxies, timeout=10)
  92.         return r.text.strip()
  93.     except Exception:
  94.         return "—"
  95.  
  96. # Смена IP
  97. def change_ip():
  98.     try:
  99.         with Controller.from_port(port=CONTROL_PORT) as c:
  100.             c.authenticate(password=CONTROL_PASSWORD)
  101.             c.signal(Signal.NEWNYM)
  102.         new_ip = get_ip_via_clash()
  103.         root.after(0, lambda: ip_var.set("Текущий IP: " + new_ip))
  104.     except Exception as e:
  105.         root.after(0, lambda: ip_var.set("Ошибка смены IP"))
  106.         print("change_ip error:", e)
  107.         traceback.print_exc()
  108.  
  109. # --- GUI ---
  110. root = tk.Tk()
  111. root.title("Tor + Clash Rotator")
  112. root.geometry("480x220")
  113.  
  114. ip_var = tk.StringVar(value="Текущий IP: —")
  115. interval_var = tk.StringVar(value=str(DEFAULT_INTERVAL))
  116. state_var = tk.StringVar(value="Ротация: Включена")
  117.  
  118. ip_label = tk.Label(root, textvariable=ip_var, font=("Segoe UI", 10))
  119. ip_label.pack(pady=6)
  120.  
  121. state_label = tk.Label(root, textvariable=state_var, font=("Segoe UI", 11), fg="green")
  122. state_label.pack()
  123.  
  124. frame = tk.Frame(root)
  125. frame.pack(pady=6)
  126.  
  127. def toggle():
  128.     global enabled
  129.     enabled = not enabled
  130.     if enabled:
  131.         start_tor()
  132.         start_clash()
  133.         state_var.set("Ротация: Включена")
  134.         state_label.config(fg="green")
  135.     else:
  136.         stop_tor()
  137.         stop_clash()
  138.         state_var.set("Ротация: Выключена")
  139.         state_label.config(fg="red")
  140.  
  141. def apply_interval():
  142.     global interval_sec
  143.     try:
  144.         v = int(interval_var.get())
  145.         if 3 <= v <= 600:
  146.             interval_sec = v
  147.             messagebox.showinfo("OK", f"Интервал установлен: {interval_sec} сек.")
  148.         else:
  149.             messagebox.showwarning("Ошибка", "Интервал от 3 до 600 секунд.")
  150.     except:
  151.         messagebox.showwarning("Ошибка", "Введите целое число секунд.")
  152.  
  153. tk.Button(frame, text="Вкл/Выкл ротацию", width=16, command=toggle).grid(row=0, column=0, padx=6)
  154. tk.Label(frame, text="Интервал (сек):").grid(row=0, column=1, padx=6)
  155. tk.Entry(frame, width=6, textvariable=interval_var).grid(row=0, column=2)
  156. tk.Button(frame, text="Установить", command=apply_interval).grid(row=0, column=3, padx=6)
  157.  
  158. tk.Button(root, text="Сменить IP сейчас", command=change_ip).pack(pady=6)
  159.  
  160. # Фоновая ротация
  161. def rotator_thread():
  162.     global enabled
  163.     while True:
  164.         if enabled:
  165.             change_ip()
  166.         time.sleep(interval_sec)
  167.  
  168. t = threading.Thread(target=rotator_thread, daemon=True)
  169. t.start()
  170.  
  171. def on_close():
  172.     stop_tor()
  173.     stop_clash()
  174.     root.destroy()
  175.  
  176. root.protocol("WM_DELETE_WINDOW", on_close)
  177.  
  178. # Автозапуск
  179. start_tor()
  180. start_clash()
  181. change_ip()
  182.  
  183. root.mainloop()
  184.  
Advertisement
Add Comment
Please, Sign In to add comment