Files
Developer 3253828fef
Tests / Lint (push) Has been cancelled
Tests / Unit Tests (push) Has been cancelled
Tests / E2E Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
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>
2026-03-24 23:33:07 +01:00

260 lines
7.1 KiB
Go

package main
import (
"context"
"fmt"
"log"
"time"
"navegator/pkg/browser"
)
func main() {
ctx := context.Background()
// Configuración avanzada
config := browser.DefaultConfig()
config.ProfileName = "advanced-agent"
// Personalizar flags stealth
config.StealthFlags.Headless = true
config.StealthFlags.NoSandbox = false // Solo activar en Docker
config.StealthFlags.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
log.Println("Lanzando navegador con configuración avanzada...")
b, err := browser.Launch(ctx, config)
if err != nil {
log.Fatalf("Error: %v", err)
}
defer b.Close()
// ========================================
// EJEMPLO 1: Gestión de Cookies
// ========================================
log.Println("\n=== EJEMPLO 1: Cookies ===")
// Establecer una cookie
cookie := browser.CreateCookie("session_id", "abc123", ".example.com")
if err := b.SetCookie(ctx, cookie); err != nil {
log.Printf("Error al establecer cookie: %v", err)
} else {
log.Println("Cookie establecida exitosamente")
}
// ========================================
// EJEMPLO 2: LocalStorage
// ========================================
log.Println("\n=== EJEMPLO 2: LocalStorage ===")
// Navegar primero
b.Navigate(ctx, "https://example.com", nil)
time.Sleep(1 * time.Second)
// Establecer items en localStorage
if err := b.SetLocalStorage(ctx, "user_preference", "dark_mode"); err != nil {
log.Printf("Error: %v", err)
} else {
log.Println("LocalStorage item establecido")
}
// Leer localStorage
items, err := b.GetLocalStorage(ctx)
if err != nil {
log.Printf("Error: %v", err)
} else {
log.Printf("LocalStorage items: %d\n", len(items))
for _, item := range items {
log.Printf(" %s = %s\n", item.Key, item.Value)
}
}
// ========================================
// EJEMPLO 3: Interceptación de Red
// ========================================
log.Println("\n=== EJEMPLO 3: Network Interception ===")
// Bloquear imágenes y CSS para acelerar carga
ni, err := b.BlockResourceTypes(ctx, "Image", "Stylesheet")
if err != nil {
log.Printf("Error: %v", err)
} else {
log.Println("Bloqueando imágenes y CSS...")
defer ni.Disable(ctx)
}
// Navegar con recursos bloqueados
log.Println("Navegando a página con recursos bloqueados...")
b.Navigate(ctx, "https://news.ycombinator.com", nil)
time.Sleep(2 * time.Second)
// ========================================
// EJEMPLO 4: Headers Personalizados
// ========================================
log.Println("\n=== EJEMPLO 4: Custom Headers ===")
headers := map[string]string{
"X-Custom-Header": "MyValue",
"Accept-Language": "en-US,en;q=0.9",
}
if err := b.SetExtraHTTPHeaders(ctx, headers); err != nil {
log.Printf("Error: %v", err)
} else {
log.Println("Headers personalizados establecidos")
}
// ========================================
// EJEMPLO 5: Evaluación de JavaScript
// ========================================
log.Println("\n=== EJEMPLO 5: JavaScript Evaluation ===")
// Ejecutar script complejo
script := `
(() => {
const info = {
url: window.location.href,
title: document.title,
links: document.querySelectorAll('a').length,
images: document.querySelectorAll('img').length,
userAgent: navigator.userAgent,
webdriver: navigator.webdriver
};
return info;
})()
`
result, err := b.Evaluate(ctx, script)
if err != nil {
log.Printf("Error: %v", err)
} else {
log.Printf("Resultado de evaluación:\n%+v\n", result.Value)
}
// ========================================
// EJEMPLO 6: Console Logging
// ========================================
log.Println("\n=== EJEMPLO 6: Console Monitoring ===")
b.EnableConsole(ctx)
b.OnConsole(func(msg *browser.ConsoleMessage) {
log.Printf("[CONSOLE.%s] %s\n", msg.Type, msg.Text)
})
// Ejecutar código que genera logs de consola
b.Evaluate(ctx, `
console.log("Mensaje de log");
console.warn("Mensaje de warning");
console.error("Mensaje de error");
`)
time.Sleep(500 * time.Millisecond)
// ========================================
// EJEMPLO 7: Formularios e Interacción
// ========================================
log.Println("\n=== EJEMPLO 7: Form Interaction ===")
// Navegar a una página con formulario
b.Navigate(ctx, "https://httpbin.org/forms/post", nil)
time.Sleep(2 * time.Second)
// Llenar formulario
log.Println("Llenando formulario...")
// Focus y escribir en campo
if err := b.Type(ctx, "input[name='custname']", "John Doe", nil); err != nil {
log.Printf("Error: %v", err)
}
if err := b.Type(ctx, "input[name='custtel']", "555-1234", nil); err != nil {
log.Printf("Error: %v", err)
}
// Esperar un poco antes de hacer click
time.Sleep(500 * time.Millisecond)
// Click en botón de submit
log.Println("Haciendo click en submit...")
if err := b.Click(ctx, "button[type='submit']"); err != nil {
log.Printf("Error al hacer click: %v", err)
}
// Esperar navegación
time.Sleep(3 * time.Second)
// Obtener URL actual
currentURL, _ := b.Evaluate(ctx, "window.location.href")
log.Printf("URL después de submit: %v\n", currentURL.Value)
// ========================================
// EJEMPLO 8: Esperar por Selector
// ========================================
log.Println("\n=== EJEMPLO 8: Wait for Selector ===")
b.Navigate(ctx, "https://example.com", nil)
log.Println("Esperando a que aparezca el selector h1...")
if err := b.WaitForSelector(ctx, "h1", 10*time.Second); err != nil {
log.Printf("Error: %v", err)
} else {
log.Println("Selector encontrado!")
text, _ := b.GetText(ctx, "h1")
log.Printf("Texto: %s\n", text)
}
// ========================================
// EJEMPLO 9: Screenshot
// ========================================
log.Println("\n=== EJEMPLO 9: Screenshots ===")
// Screenshot de viewport
screenshot, err := b.Screenshot(ctx, false)
if err != nil {
log.Printf("Error: %v", err)
} else {
log.Printf("Screenshot viewport: %d bytes\n", len(screenshot))
}
// Screenshot de página completa
fullScreenshot, err := b.Screenshot(ctx, true)
if err != nil {
log.Printf("Error: %v", err)
} else {
log.Printf("Screenshot completo: %d bytes\n", len(fullScreenshot))
}
// ========================================
// EJEMPLO 10: Navegación del Historial
// ========================================
log.Println("\n=== EJEMPLO 10: History Navigation ===")
// Navegar a varias páginas
b.Navigate(ctx, "https://example.com", nil)
time.Sleep(1 * time.Second)
b.Navigate(ctx, "https://example.org", nil)
time.Sleep(1 * time.Second)
// Ir atrás
log.Println("Navegando hacia atrás...")
if err := b.GoBack(ctx); err != nil {
log.Printf("Error: %v", err)
} else {
time.Sleep(1 * time.Second)
url, _ := b.Evaluate(ctx, "window.location.href")
log.Printf("URL después de GoBack: %v\n", url.Value)
}
// Ir adelante
log.Println("Navegando hacia adelante...")
if err := b.GoForward(ctx); err != nil {
log.Printf("Error: %v", err)
} else {
time.Sleep(1 * time.Second)
url, _ := b.Evaluate(ctx, "window.location.href")
log.Printf("URL después de GoForward: %v\n", url.Value)
}
log.Println("\n=== Todos los ejemplos completados ===")
}