
Python-Bibliothek für programmatische Tor-Instanzverwaltung mit SOCKS5-Proxy, Identitätsrotation, Stream-Isolation, versteckten Diensten, Schaltkreissteuerung und asynchronen HTTP-Clients.
Python-Bibliothek zur programmgesteuerten Verwaltung von Tor-Instanzen.
Linux (Debian/Ubuntu):
sudo apt-get install tor obfs4proxy
Windows:
Laden Sie das Tor Expert Bundle von torproject.org herunter.
pip install xtor
# oder
uv add xtor
from xtor import Tor
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
print(f"Verbindung über IP: {tor.ip}")
resp = tor.client.get("https://api.ipify.org")
print(resp.text)
from xtor import Tor
from xtor.exceptions import TorNotFoundError, PortInUseError
try:
with Tor.start(port=9052, control_port=9053, host="127.0.0.1", password="mypass") as tor:
print(tor.ip)
resp = tor.client.get("https://api.ipify.org")
print(resp.text)
except TorNotFoundError:
print("Tor nicht im PATH gefunden")
except PortInUseError as e:
print(f"Port belegt: {e}")
Hinweis: Aus Gründen der Abwärtskompatibilität ist
Tor.startTor()als Alias fürTor.start()verfügbar.
with Tor(password="mypass", port=9050, control_port=9051) as tor:
print(tor.ip)
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
print(tor.ip)
tor.new_identity(wait=True, timeout=30)
print(tor.ip) # Neue IP
import asyncio
from xtor import Tor
async def main():
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
async with tor.async_client as client:
resp = await client.get("https://api.ipify.org")
print(resp.text)
asyncio.run(main())
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
# Jeder Schlüssel erhält seinen eigenen Schaltkreis
client_a = tor.isolated_client("session-a")
client_b = tor.isolated_client("session-b")
# Anfragen über client_a und client_b nutzen unterschiedliche Schaltkreise
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
circuits = tor.get_circuits()
for c in circuits:
print(f"Schaltkreis {c.id}: {c.status}, Pfad: {c.path}")
# Einen bestimmten Schaltkreis schließen
tor.close_circuit(circuits[0].id)
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
info = tor.exit_node
if info:
print(f"Exit: {info.nickname} ({info.country})")
print(f"Flags: {info.flags}")
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
service = tor.create_hidden_service({80: 8080})
print(f"Dienst: {service.onion_address}")
# Entfernen, wenn fertig
tor.remove_hidden_service(service)
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
def on_bandwidth(event):
print(f"Gelesen: {event.read}, Geschrieben: {event.written}")
tor.add_event_listener("BW", on_bandwidth)
# ... arbeiten ...
tor.remove_event_listener(on_bandwidth)
from xtor import TorPool
with TorPool(size=3, base_port=9100, password="secret") as pool:
# Round-Robin
tor = pool.next()
print(tor.client.get("https://api.ipify.org").text)
# Alle Identitäten rotieren
pool.rotate_all()
# Zufällige Auswahl
tor = pool.random()
from xtor import Tor
# Benannte Instanz starten
tor = Tor.start(port=9052, control_port=9053, host="127.0.0.1", name="my-tor")
# Später per Name wieder verbinden
tor = Tor.from_name("my-tor")
with tor:
print(tor.ip)
Die xtor-CLI verwaltet benannte Tor-Instanzen als Hintergrundprozesse.
# Eine benannte Instanz starten
xtor start my-tor --port 9052 --control-port 9053
# Instanzen auflisten
xtor list
# Verbindungsdetails
xtor connect my-tor
# Instanz stoppen
xtor stop my-tor
# Instanz und Daten entfernen
xtor remove my-tor
XtorError (Basis)
├── TorNotFoundError
├── PortInUseError
├── IdentityChangeTimeout
├── ConnectionError
└── AuthenticationError
Allesfang-Muster:
from xtor.exceptions import XtorError
try:
with Tor.start(port=9052, control_port=9053, host="127.0.0.1") as tor:
...
except XtorError as e:
print(f"xtor-Fehler: {e}")