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>
260 lines
7.1 KiB
Go
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 ===")
|
|
}
|