Initial commit: navegator - Chrome CDP automation for LLMs
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>
This commit is contained in:
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script para clonar perfiles y usarlos en paralelo
|
||||
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
echo "Uso: $0 <perfil-origen> <perfil-destino>"
|
||||
echo ""
|
||||
echo "Ejemplo:"
|
||||
echo " $0 usuario-base usuario-clon-1"
|
||||
echo ""
|
||||
echo "Esto permite usar el mismo perfil en paralelo:"
|
||||
echo " ./buscar -q 'golang' -profile usuario-clon-1 &"
|
||||
echo " ./buscar -q 'python' -profile usuario-clon-2 &"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ORIGEN="$1"
|
||||
DESTINO="$2"
|
||||
PROFILES_DIR="${3:-$HOME/.navegator/profiles}"
|
||||
|
||||
ORIGEN_PATH="$PROFILES_DIR/$ORIGEN"
|
||||
DESTINO_PATH="$PROFILES_DIR/$DESTINO"
|
||||
|
||||
# Verificar que origen existe
|
||||
if [ ! -d "$ORIGEN_PATH" ]; then
|
||||
echo "❌ Error: El perfil '$ORIGEN' no existe en $PROFILES_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verificar que destino no existe
|
||||
if [ -d "$DESTINO_PATH" ]; then
|
||||
echo "⚠️ El perfil '$DESTINO' ya existe. ¿Sobrescribir? (y/N)"
|
||||
read -r respuesta
|
||||
if [ "$respuesta" != "y" ] && [ "$respuesta" != "Y" ]; then
|
||||
echo "Cancelado."
|
||||
exit 0
|
||||
fi
|
||||
rm -rf "$DESTINO_PATH"
|
||||
fi
|
||||
|
||||
# Copiar perfil
|
||||
echo "📋 Clonando perfil..."
|
||||
cp -r "$ORIGEN_PATH" "$DESTINO_PATH"
|
||||
|
||||
# Limpiar archivos de lock y sesión
|
||||
echo "🧹 Limpiando locks..."
|
||||
rm -f "$DESTINO_PATH/SingletonLock"
|
||||
rm -f "$DESTINO_PATH/SingletonSocket"
|
||||
rm -f "$DESTINO_PATH/SingletonCookie"
|
||||
rm -f "$DESTINO_PATH/DevToolsActivePort"
|
||||
|
||||
echo "✅ Perfil clonado: $ORIGEN → $DESTINO"
|
||||
echo ""
|
||||
echo "Ahora puedes usar ambos en paralelo:"
|
||||
echo " ./buscar -q 'query1' -profile $ORIGEN &"
|
||||
echo " ./buscar -q 'query2' -profile $DESTINO &"
|
||||
Executable
+104
@@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Demostración de uso de perfiles en paralelo
|
||||
|
||||
echo "=========================================="
|
||||
echo "🎭 Demo: Perfiles en Paralelo"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Verificar que los binarios existen
|
||||
if [ ! -f "./buscar" ] || [ ! -f "./screenshot" ]; then
|
||||
echo "❌ Error: Binarios no encontrados"
|
||||
echo "Ejecuta: go build -o buscar cmd/buscar.go"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Crear perfil base
|
||||
echo "📝 Paso 1: Crear perfil base"
|
||||
echo "---"
|
||||
PROFILES_DIR="$HOME/.navegator/profiles"
|
||||
mkdir -p "$PROFILES_DIR/demo-base"
|
||||
echo "✅ Perfil base creado: demo-base"
|
||||
echo ""
|
||||
|
||||
# Clonar perfiles
|
||||
echo "📋 Paso 2: Clonar perfiles para uso paralelo"
|
||||
echo "---"
|
||||
for i in {1..3}; do
|
||||
if [ -d "$PROFILES_DIR/demo-worker-$i" ]; then
|
||||
rm -rf "$PROFILES_DIR/demo-worker-$i"
|
||||
fi
|
||||
cp -r "$PROFILES_DIR/demo-base" "$PROFILES_DIR/demo-worker-$i"
|
||||
# Limpiar locks
|
||||
rm -f "$PROFILES_DIR/demo-worker-$i/SingletonLock"
|
||||
rm -f "$PROFILES_DIR/demo-worker-$i/SingletonSocket"
|
||||
rm -f "$PROFILES_DIR/demo-worker-$i/SingletonCookie"
|
||||
echo "✅ Clonado: demo-worker-$i"
|
||||
done
|
||||
echo ""
|
||||
|
||||
# Ejecutar en paralelo
|
||||
echo "🚀 Paso 3: Ejecutar búsquedas en paralelo"
|
||||
echo "---"
|
||||
echo "Iniciando 3 búsquedas simultáneas..."
|
||||
echo ""
|
||||
|
||||
./bin/buscar -q "golang tutorial" -n 3 -profile demo-worker-1 -output demo-result-1.json &
|
||||
PID1=$!
|
||||
echo "Worker 1 (PID $PID1): Buscando 'golang tutorial'"
|
||||
|
||||
./bin/buscar -q "python basics" -n 3 -profile demo-worker-2 -output demo-result-2.json &
|
||||
PID2=$!
|
||||
echo "Worker 2 (PID $PID2): Buscando 'python basics'"
|
||||
|
||||
./bin/buscar -q "javascript async" -n 3 -profile demo-worker-3 -output demo-result-3.json &
|
||||
PID3=$!
|
||||
echo "Worker 3 (PID $PID3): Buscando 'javascript async'"
|
||||
|
||||
echo ""
|
||||
echo "⏳ Esperando que terminen las búsquedas..."
|
||||
wait
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "✅ Demo completada"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Mostrar resultados
|
||||
echo "📊 Resultados generados:"
|
||||
ls -lh demo-result-*.json 2>/dev/null | awk '{print " "$9" ("$5")"}'
|
||||
echo ""
|
||||
|
||||
echo "📂 Perfiles usados simultáneamente:"
|
||||
for i in {1..3}; do
|
||||
if [ -d "$PROFILES_DIR/demo-worker-$i" ]; then
|
||||
size=$(du -sh "$PROFILES_DIR/demo-worker-$i" | cut -f1)
|
||||
echo " demo-worker-$i ($size)"
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
|
||||
echo "💡 Conclusión:"
|
||||
echo " - 3 búsquedas ejecutadas EN PARALELO"
|
||||
echo " - Cada una con su propio perfil (cookies aisladas)"
|
||||
echo " - Sin conflictos ni errores de lock"
|
||||
echo " - Resultados guardados en JSON separados"
|
||||
echo ""
|
||||
|
||||
echo "🧹 Limpiar archivos de demo? (y/N)"
|
||||
read -r respuesta
|
||||
if [ "$respuesta" = "y" ] || [ "$respuesta" = "Y" ]; then
|
||||
rm -f demo-result-*.json
|
||||
rm -rf "$PROFILES_DIR/demo-worker-"*
|
||||
rm -rf "$PROFILES_DIR/demo-base"
|
||||
echo "✅ Demo limpiada"
|
||||
else
|
||||
echo "Archivos conservados en:"
|
||||
echo " - Resultados: demo-result-*.json"
|
||||
echo " - Perfiles: $PROFILES_DIR/demo-worker-*"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "📖 Más info: cat PERFILES_AVANZADO.md"
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de demostración: Simulación de múltiples usuarios navegando
|
||||
|
||||
echo "=========================================="
|
||||
echo "🎭 Simulación de Navegación Orgánica"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Este script simula 3 usuarios diferentes navegando"
|
||||
echo "Cada uno usa su propio perfil con cookies separadas"
|
||||
echo ""
|
||||
|
||||
# Usuario 1: Desarrollador buscando info técnica
|
||||
echo "👨💻 Usuario 1: Desarrollador"
|
||||
echo " - Perfil: dev-user-1"
|
||||
echo " - Busca: golang tutorials"
|
||||
echo ""
|
||||
./bin/buscar -q "golang tutorials" -n 5 -profile dev-user-1 -headless=true -output dev1_results.json
|
||||
echo ""
|
||||
|
||||
# Usuario 2: Estudiante haciendo research
|
||||
echo "👩🎓 Usuario 2: Estudiante"
|
||||
echo " - Perfil: student-user-2"
|
||||
echo " - Busca: machine learning basics"
|
||||
echo ""
|
||||
./bin/buscar -q "machine learning basics" -n 5 -profile student-user-2 -headless=true -output student2_results.json
|
||||
echo ""
|
||||
|
||||
# Usuario 3: Diseñador buscando inspiración
|
||||
echo "🎨 Usuario 3: Diseñador"
|
||||
echo " - Perfil: designer-user-3"
|
||||
echo " - Captura: dribbble.com"
|
||||
echo ""
|
||||
./bin/screenshot -url https://dribbble.com -profile designer-user-3 -o designer3_capture.png -headless=true
|
||||
echo ""
|
||||
|
||||
echo "=========================================="
|
||||
echo "✅ Simulación completada"
|
||||
echo ""
|
||||
echo "📂 Perfiles creados:"
|
||||
ls -1 perfiles/ | grep -E "dev-user|student-user|designer-user"
|
||||
echo ""
|
||||
echo "📊 Archivos generados:"
|
||||
ls -lh *_results.json *_capture.png 2>/dev/null | awk '{print " "$9" ("$5")"}'
|
||||
echo ""
|
||||
echo "💡 Cada perfil mantiene:"
|
||||
echo " - Cookies separadas"
|
||||
echo " - Historial independiente"
|
||||
echo " - Cache propio"
|
||||
echo " - Sesiones aisladas"
|
||||
echo ""
|
||||
echo "🔄 Para reutilizar un perfil:"
|
||||
echo " ./navegar -url https://example.com -profile dev-user-1"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user