3253828fef
Add complete navegator system for stealthy browser automation: - CDP client with WebSocket communication - Browser API with navigation, storage, network, runtime - Stealth flags and anti-detection scripts - Persistent profile support - Examples and comprehensive documentation Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
499 lines
11 KiB
Markdown
499 lines
11 KiB
Markdown
# Gestión Avanzada de Perfiles
|
|
|
|
Guía completa para mover binarios entre proyectos y usar perfiles en paralelo.
|
|
|
|
---
|
|
|
|
## 🗂️ Problema 1: Mover Binarios a Otro Repo
|
|
|
|
### ❌ Problema
|
|
|
|
```bash
|
|
proyecto1/
|
|
├── buscar
|
|
└── perfiles/
|
|
└── mi-usuario/
|
|
└── cookies.db
|
|
|
|
# Copias binario a proyecto2
|
|
proyecto2/
|
|
├── buscar # ❌ Busca perfiles en ./perfiles/ (no existe)
|
|
```
|
|
|
|
### ✅ Soluciones
|
|
|
|
#### **Opción A: Usar carpeta compartida en HOME** (RECOMENDADA)
|
|
|
|
**Ventajas:**
|
|
- ✅ Perfiles accesibles desde cualquier proyecto
|
|
- ✅ No duplicar datos
|
|
- ✅ Mantiene cookies entre proyectos
|
|
|
|
**Ubicación por defecto:**
|
|
```
|
|
~/.navegator/profiles/
|
|
├── usuario1/
|
|
├── bot-research/
|
|
└── dev-session/
|
|
```
|
|
|
|
**Uso:**
|
|
```bash
|
|
# En cualquier proyecto, funciona automáticamente
|
|
cd ~/proyecto1
|
|
./buscar -q "golang" -profile usuario1
|
|
|
|
cd ~/proyecto2
|
|
./buscar -q "python" -profile usuario1
|
|
# ↑ Usa el MISMO perfil con cookies compartidas
|
|
```
|
|
|
|
**Si compilaste con la nueva versión (`buscar_v2.go`):**
|
|
```bash
|
|
go build -o buscar cmd/buscar_v2.go
|
|
|
|
# Default: ~/.navegator/profiles
|
|
./buscar -q "golang" -profile mi-usuario
|
|
|
|
# Custom: especificar ruta
|
|
./buscar -q "golang" -profile mi-usuario -profiles-dir /ruta/custom
|
|
```
|
|
|
|
#### **Opción B: Variable de entorno**
|
|
|
|
Agregar a `.bashrc` o `.zshrc`:
|
|
|
|
```bash
|
|
export NAVEGATOR_PROFILES="$HOME/shared-profiles"
|
|
```
|
|
|
|
Modificar binarios para leer:
|
|
```go
|
|
profilesDir := os.Getenv("NAVEGATOR_PROFILES")
|
|
if profilesDir == "" {
|
|
profilesDir = filepath.Join(homeDir, ".navegator", "profiles")
|
|
}
|
|
```
|
|
|
|
#### **Opción C: Copiar carpeta de perfiles**
|
|
|
|
```bash
|
|
# Copiar perfiles entre proyectos
|
|
cp -r ~/proyecto1/perfiles ~/proyecto2/
|
|
|
|
# Sincronizar cambios
|
|
rsync -av ~/proyecto1/perfiles/ ~/proyecto2/perfiles/
|
|
```
|
|
|
|
#### **Opción D: Symlink**
|
|
|
|
```bash
|
|
# Crear carpeta compartida
|
|
mkdir -p ~/shared-navegator-profiles
|
|
|
|
# En cada proyecto
|
|
cd ~/proyecto1
|
|
ln -s ~/shared-navegator-profiles perfiles
|
|
|
|
cd ~/proyecto2
|
|
ln -s ~/shared-navegator-profiles perfiles
|
|
|
|
# Ambos apuntan al mismo directorio físico
|
|
```
|
|
|
|
---
|
|
|
|
## 🔀 Problema 2: Mismo Perfil en Paralelo
|
|
|
|
### ❌ No Funciona Directamente
|
|
|
|
Chrome bloquea múltiples instancias del mismo perfil:
|
|
|
|
```bash
|
|
# Terminal 1
|
|
./buscar -q "golang" -profile usuario1 # ✅ OK
|
|
|
|
# Terminal 2 (simultáneamente)
|
|
./buscar -q "python" -profile usuario1 # ❌ ERROR
|
|
# Chrome error: Profile is already in use
|
|
```
|
|
|
|
**Archivos de lock:**
|
|
```
|
|
perfiles/usuario1/
|
|
├── SingletonLock # Bloquea acceso múltiple
|
|
├── SingletonSocket # Socket de comunicación
|
|
└── SingletonCookie # Cookie de instancia
|
|
```
|
|
|
|
### ✅ Soluciones
|
|
|
|
#### **Solución 1: Clonar perfiles antes de usar** (RECOMENDADA)
|
|
|
|
**Script automático:**
|
|
```bash
|
|
./scripts/clonar_perfil.sh usuario-base usuario-clon-1
|
|
./scripts/clonar_perfil.sh usuario-base usuario-clon-2
|
|
./scripts/clonar_perfil.sh usuario-base usuario-clon-3
|
|
|
|
# Ahora usar en paralelo
|
|
./buscar -q "query1" -profile usuario-clon-1 &
|
|
./buscar -q "query2" -profile usuario-clon-2 &
|
|
./buscar -q "query3" -profile usuario-clon-3 &
|
|
wait
|
|
```
|
|
|
|
**¿Qué hace el script?**
|
|
1. Copia el perfil completo (cookies, cache, historial)
|
|
2. Elimina archivos de lock
|
|
3. Crea perfil independiente listo para usar
|
|
|
|
**Ejemplo completo:**
|
|
```bash
|
|
# 1. Crear perfil base con login/cookies
|
|
./navegar -url https://github.com -profile github-base
|
|
# ... hacer login manualmente ...
|
|
|
|
# 2. Clonar para uso paralelo
|
|
for i in {1..5}; do
|
|
./scripts/clonar_perfil.sh github-base github-worker-$i
|
|
done
|
|
|
|
# 3. Usar en paralelo (todos con la misma sesión)
|
|
for i in {1..5}; do
|
|
./buscar -q "topic-$i" -profile github-worker-$i &
|
|
done
|
|
wait
|
|
```
|
|
|
|
#### **Solución 2: Usar perfiles diferentes**
|
|
|
|
Diseñar desde el inicio con múltiples perfiles:
|
|
|
|
```bash
|
|
# Crear perfiles específicos
|
|
./navegar -url https://app.com -profile worker-1
|
|
./navegar -url https://app.com -profile worker-2
|
|
./navegar -url https://app.com -profile worker-3
|
|
|
|
# Usar en paralelo
|
|
./buscar -q "query1" -profile worker-1 &
|
|
./buscar -q "query2" -profile worker-2 &
|
|
./buscar -q "query3" -profile worker-3 &
|
|
```
|
|
|
|
#### **Solución 3: Pool de perfiles rotativos**
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# pool_buscar.sh
|
|
|
|
PROFILES=("bot-1" "bot-2" "bot-3" "bot-4" "bot-5")
|
|
QUERIES=("golang" "python" "rust" "javascript" "java")
|
|
|
|
for i in "${!QUERIES[@]}"; do
|
|
PROFILE="${PROFILES[$i]}"
|
|
QUERY="${QUERIES[$i]}"
|
|
|
|
echo "🔍 Buscando '$QUERY' con perfil $PROFILE"
|
|
./buscar -q "$QUERY" -profile "$PROFILE" -output "result_$i.json" &
|
|
done
|
|
|
|
wait
|
|
echo "✅ Todas las búsquedas completadas"
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Casos de Uso Reales
|
|
|
|
### **Caso 1: Scraping Multi-Cuenta**
|
|
|
|
Necesitas hacer scraping con 10 cuentas diferentes simultáneamente.
|
|
|
|
```bash
|
|
# Preparación (una vez)
|
|
for i in {1..10}; do
|
|
./navegar -url https://sitio.com/login \
|
|
-profile account-$i \
|
|
-type "#username" -text "user$i" \
|
|
-duration 5
|
|
# Hacer login manualmente si es necesario
|
|
done
|
|
|
|
# Uso (todas a la vez)
|
|
for i in {1..10}; do
|
|
./navegar -url https://sitio.com/dashboard \
|
|
-profile account-$i \
|
|
-duration 10 &
|
|
done
|
|
wait
|
|
```
|
|
|
|
### **Caso 2: A/B Testing con Misma Sesión**
|
|
|
|
Probar variantes con cookies idénticas:
|
|
|
|
```bash
|
|
# Crear perfil base
|
|
./navegar -url https://app.com -profile base-session
|
|
# ... configurar cookies/preferencias ...
|
|
|
|
# Clonar para cada variante
|
|
./scripts/clonar_perfil.sh base-session variant-a
|
|
./scripts/clonar_perfil.sh base-session variant-b
|
|
|
|
# Probar en paralelo
|
|
./screenshot -url https://app.com?variant=a -profile variant-a -o test-a.png &
|
|
./screenshot -url https://app.com?variant=b -profile variant-b -o test-b.png &
|
|
wait
|
|
|
|
# Comparar resultados
|
|
compare test-a.png test-b.png diff.png
|
|
```
|
|
|
|
### **Caso 3: Búsqueda Distribuida**
|
|
|
|
Buscar múltiples keywords sin rate limiting:
|
|
|
|
```bash
|
|
# Crear pool de 20 perfiles
|
|
for i in {1..20}; do
|
|
./scripts/clonar_perfil.sh base-search search-worker-$i
|
|
done
|
|
|
|
# Buscar 100 keywords en paralelo (lotes de 20)
|
|
keywords=("keyword1" "keyword2" ... "keyword100")
|
|
|
|
for i in "${!keywords[@]}"; do
|
|
profile_idx=$((i % 20 + 1))
|
|
./buscar -q "${keywords[$i]}" \
|
|
-profile "search-worker-$profile_idx" \
|
|
-output "result_$i.json" &
|
|
|
|
# Cada 20 búsquedas, esperar
|
|
if [ $((i % 20)) -eq 19 ]; then
|
|
wait
|
|
fi
|
|
done
|
|
```
|
|
|
|
### **Caso 4: Proyectos Diferentes, Mismo Perfil**
|
|
|
|
```bash
|
|
# Proyecto 1: Análisis de datos
|
|
cd ~/proyecto-scraper
|
|
./buscar -q "data science" -profile researcher-123
|
|
|
|
# Proyecto 2: Generación de reportes
|
|
cd ~/proyecto-reportes
|
|
./screenshot -url https://dashboard.com -profile researcher-123
|
|
# ↑ Usa las mismas cookies del perfil!
|
|
|
|
# Proyecto 3: Monitoreo
|
|
cd ~/proyecto-monitor
|
|
./navegar -url https://app.com/status -profile researcher-123
|
|
```
|
|
|
|
**Resultado:** El perfil `researcher-123` se comparte entre los 3 proyectos sin duplicar datos.
|
|
|
|
---
|
|
|
|
## 🛠️ Herramientas Útiles
|
|
|
|
### **Ver perfiles activos**
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# ver_perfiles_activos.sh
|
|
|
|
echo "🔍 Perfiles actualmente en uso:"
|
|
echo ""
|
|
|
|
PROFILES_DIR="$HOME/.navegator/profiles"
|
|
|
|
for profile in "$PROFILES_DIR"/*; do
|
|
if [ -d "$profile" ]; then
|
|
name=$(basename "$profile")
|
|
|
|
if [ -f "$profile/SingletonLock" ]; then
|
|
pid=$(cat "$profile/SingletonLock" 2>/dev/null | grep -oP '\d+')
|
|
echo "🟢 $name (PID: $pid)"
|
|
else
|
|
echo "⚪ $name (libre)"
|
|
fi
|
|
fi
|
|
done
|
|
```
|
|
|
|
### **Limpiar perfiles no usados**
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# limpiar_perfiles_viejos.sh
|
|
|
|
PROFILES_DIR="$HOME/.navegator/profiles"
|
|
DAYS=30
|
|
|
|
echo "🗑️ Eliminando perfiles sin usar en $DAYS días..."
|
|
|
|
find "$PROFILES_DIR" -maxdepth 1 -type d -mtime +$DAYS | while read profile; do
|
|
if [ "$profile" != "$PROFILES_DIR" ]; then
|
|
name=$(basename "$profile")
|
|
echo " Eliminando: $name"
|
|
rm -rf "$profile"
|
|
fi
|
|
done
|
|
|
|
echo "✅ Limpieza completada"
|
|
```
|
|
|
|
### **Sincronizar perfiles entre máquinas**
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# sync_perfiles.sh
|
|
|
|
REMOTE_HOST="servidor.com"
|
|
REMOTE_USER="usuario"
|
|
LOCAL_DIR="$HOME/.navegator/profiles"
|
|
REMOTE_DIR="/home/$REMOTE_USER/.navegator/profiles"
|
|
|
|
echo "📤 Subiendo perfiles al servidor..."
|
|
rsync -avz --progress "$LOCAL_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
|
|
|
|
echo "✅ Sincronización completada"
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Mejores Prácticas
|
|
|
|
### **1. Nomenclatura de Perfiles**
|
|
|
|
```bash
|
|
# ❌ Mal
|
|
perfil1, perfil2, test, abc
|
|
|
|
# ✅ Bien
|
|
github-devuser-1
|
|
scraper-bot-2024-01
|
|
researcher-project-alpha
|
|
```
|
|
|
|
### **2. Perfiles Base + Clones**
|
|
|
|
```bash
|
|
# Crear perfil base con configuración
|
|
base-authenticated/
|
|
|
|
# Clonar para uso paralelo
|
|
base-authenticated-clone-1/
|
|
base-authenticated-clone-2/
|
|
base-authenticated-clone-3/
|
|
```
|
|
|
|
### **3. Limpieza Regular**
|
|
|
|
```bash
|
|
# Eliminar clones temporales después de usar
|
|
rm -rf perfiles/*-clone-*
|
|
rm -rf perfiles/temp-*
|
|
|
|
# Mantener solo perfiles base
|
|
```
|
|
|
|
### **4. Backup de Perfiles Importantes**
|
|
|
|
```bash
|
|
# Backup
|
|
tar -czf perfiles-backup-$(date +%Y%m%d).tar.gz perfiles/
|
|
|
|
# Restaurar
|
|
tar -xzf perfiles-backup-20260324.tar.gz
|
|
```
|
|
|
|
---
|
|
|
|
## ⚡ Performance
|
|
|
|
### **Perfiles ligeros vs pesados**
|
|
|
|
```bash
|
|
# Perfil nuevo (primera vez): 2-3 segundos
|
|
./buscar -q "query" -profile nuevo-perfil
|
|
|
|
# Perfil existente: 1 segundo
|
|
./buscar -q "query" -profile perfil-usado
|
|
|
|
# Perfil con mucho cache: 1-2 segundos
|
|
```
|
|
|
|
### **Límites prácticos**
|
|
|
|
- ✅ **5-10 perfiles en paralelo**: Funciona bien
|
|
- ⚠️ **20-30 perfiles en paralelo**: Depende del CPU/RAM
|
|
- ❌ **50+ perfiles en paralelo**: Puede saturar sistema
|
|
|
|
### **Optimización**
|
|
|
|
```bash
|
|
# Ejecutar en lotes
|
|
for i in {1..100}; do
|
|
./buscar -q "query$i" -profile "bot-$((i % 10))" &
|
|
|
|
# Cada 10, esperar
|
|
if [ $((i % 10)) -eq 9 ]; then
|
|
wait
|
|
fi
|
|
done
|
|
```
|
|
|
|
---
|
|
|
|
## 🔒 Seguridad
|
|
|
|
### **Perfiles sensibles**
|
|
|
|
Si tus perfiles tienen sesiones autenticadas:
|
|
|
|
```bash
|
|
# Proteger perfiles
|
|
chmod 700 ~/.navegator/profiles/
|
|
chmod 600 ~/.navegator/profiles/*/cookies*
|
|
|
|
# Encriptar backup
|
|
tar -czf - perfiles/ | gpg -c > perfiles-encrypted.tar.gz.gpg
|
|
```
|
|
|
|
### **No compartir perfiles con credenciales**
|
|
|
|
```bash
|
|
# ❌ NO hacer
|
|
git add perfiles/
|
|
git commit -m "Added profiles" # Expondrías cookies/tokens
|
|
|
|
# ✅ Hacer
|
|
echo "perfiles/" >> .gitignore
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 Resumen
|
|
|
|
| Escenario | Solución |
|
|
|-----------|----------|
|
|
| Mover binario a otro repo | Usar `~/.navegator/profiles` (compartido) |
|
|
| Mismo perfil en paralelo | Clonar con `clonar_perfil.sh` |
|
|
| Múltiples proyectos | Flag `-profiles-dir` o symlink |
|
|
| Scraping masivo | Pool de perfiles + rotación |
|
|
| A/B testing | Clonar perfil base para cada variante |
|
|
| Sincronizar entre máquinas | `rsync` de `~/.navegator/profiles` |
|
|
|
|
**Comando más útil:**
|
|
```bash
|
|
./scripts/clonar_perfil.sh base-perfil clon-1
|
|
```
|
|
|
|
Esto te permite usar el mismo perfil (cookies, sesión) en múltiples instancias simultáneas.
|