A lightweight Python library for managing Tor sessions and rotating circuits
Project description
🧅 Tor Session Manager
Una librería Python liviana para gestionar sesiones Tor y rotar circuitos programáticamente.
🎯 Casos de Uso
Esta librería está diseñada para propósitos legítimos:
- Web Scraping Ético: Rotar IPs para respetar rate limits mientras recolectás datos que tenés autorización para acceder
- Investigación de Seguridad: Testear cómo tus aplicaciones manejan requests desde diferentes ubicaciones geográficas
- Testing de Privacidad: QA para aplicaciones enfocadas en privacidad y sistemas de detección de VPN/proxy
- Investigación Académica: Estudiar comportamiento de redes, patrones de censura o características de la red Tor
- Penetration Testing: Evaluaciones de seguridad autorizadas que requieren rotación de IP
⚠️ Aviso de Responsabilidad: Siempre respetá
robots.txt, términos de servicio y rate limits. Esta herramienta es solo para uso legítimo. El autor no se responsabiliza por mal uso.
📦 Instalación
pip install tor-session-manager
Prerequisitos
Necesitás Tor corriendo localmente con el puerto de control habilitado:
macOS (Homebrew):
brew install tor
# Editá /opt/homebrew/etc/tor/torrc y agregá:
# ControlPort 9051
# CookieAuthentication 1
brew services start tor
Linux (Ubuntu/Debian):
sudo apt install tor
# Editá /etc/tor/torrc y descomentá/agregá:
# ControlPort 9051
# CookieAuthentication 1
sudo systemctl restart tor
Windows:
Descargá desde torproject.org y configurá torrc.
🚀 Inicio Rápido
Uso Básico
from tor_session_manager import TorClient
with TorClient() as client:
print(f"IP actual: {client.get_ip()}")
client.rotate() # Obtener nuevo circuito
print(f"Nueva IP: {client.get_ip()}")
One-liner
from tor_session_manager import rotate_and_get_ip
nueva_ip = rotate_and_get_ip()
print(f"Nueva IP: {nueva_ip}")
Con Requests
import requests
from tor_session_manager import TorClient
client = TorClient()
# Usá la propiedad proxies con cualquier llamada de requests
response = requests.get(
"https://httpbin.org/ip",
proxies=client.proxies,
timeout=30
)
print(response.json())
Scraping con Rotación
import time
import requests
from tor_session_manager import TorClient
def scrape_con_rotacion(urls: list[str], delay: float = 1.0):
"""Scrapear URLs con rotación automática de IP y rate limiting."""
resultados = []
with TorClient() as client:
for i, url in enumerate(urls):
# Rotar cada 10 requests
if i > 0 and i % 10 == 0:
client.rotate()
print(f"Rotado a nueva IP: {client.get_ip()}")
# Delay respetuoso entre requests
time.sleep(delay)
response = requests.get(url, proxies=client.proxies, timeout=30)
resultados.append(response.text)
return resultados
📖 Referencia de API
TorClient
TorClient(
control_port: int = 9051, # Puerto de control de Tor
socks_port: int = 9050, # Puerto proxy SOCKS de Tor
password: str = None, # Password del puerto de control (si no usás cookie auth)
rotate_delay: float = 2.0, # Segundos de espera después de rotar
)
Métodos:
| Método | Descripción |
|---|---|
is_ready() |
Verificar si Tor está corriendo y bootstrapped |
rotate() |
Solicitar nuevo circuito (nueva IP de salida) |
get_ip() |
Obtener IP pública actual a través de Tor |
proxies |
Propiedad que devuelve dict de proxy para requests |
Context Managers:
# Uso estándar - verifica que Tor esté listo
with TorClient() as client:
...
# Rotar antes de una operación específica
with client.rotated_session():
# Circuito fresco para este bloque
...
Excepciones
| Excepción | Descripción |
|---|---|
TorSessionError |
Excepción base |
TorConnectionError |
No se puede conectar al controlador de Tor |
TorNotReadyError |
Tor no está completamente bootstrapped |
IPFetchError |
No se puede determinar la IP pública |
🔧 Configuración
Puertos Personalizados
client = TorClient(
control_port=9151, # Puerto de control no estándar
socks_port=9150, # Puerto SOCKS no estándar
)
Autenticación por Password
Si usás password auth en lugar de cookie auth:
client = TorClient(password="tu_password_de_control")
Logging
Habilitá debug logging para ver qué está pasando:
import logging
logging.basicConfig(level=logging.DEBUG)
🧪 Testeando tu Setup
from tor_session_manager import TorClient
client = TorClient()
if client.is_ready():
print("✅ Tor está corriendo y listo")
with client:
print(f"📍 Tu IP de Tor: {client.get_ip()}")
else:
print("❌ Tor no está listo - verificá la instalación")
🤝 Contribuciones
¡Las contribuciones son bienvenidas! Sentite libre de abrir issues y pull requests.
📄 Licencia
MIT License - ver LICENSE para detalles.
👤 Autor
Pablo Alaniz - @PabloAlaniz
Construido para la comunidad de investigación de seguridad e ingeniería de datos 🔐
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tor_session_manager-1.0.0.tar.gz.
File metadata
- Download URL: tor_session_manager-1.0.0.tar.gz
- Upload date:
- Size: 7.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7b66763c3e3e143d7dbeb89e19e28de34e863e739a54967d0b9ecdef79e649a
|
|
| MD5 |
e11909a3519f4ae57fc0aa4f0020a332
|
|
| BLAKE2b-256 |
6b08dc5a434296d836bf5c6203a19a26d5c9a32e5675d52ce5cc94f9db6fe77f
|
File details
Details for the file tor_session_manager-1.0.0-py3-none-any.whl.
File metadata
- Download URL: tor_session_manager-1.0.0-py3-none-any.whl
- Upload date:
- Size: 7.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5be50c43a6ce1ed893d2ee97511bbe854c2f5f6c52baef26c5b41a7ca53393b3
|
|
| MD5 |
efd126f11b00da62d4ccffa20df65a3a
|
|
| BLAKE2b-256 |
1de6dbc5172bc4e11a0e8d90ec159a0bacac90a2ae4eb40162ec7087fdce0b8c
|