feat(browser): funciones anti-deteccion + perfiles para web_scraping

Funciones nuevas del dominio browser (grupo navegator):
- cdp_move_mouse_human / cdp_click_human: movimiento de raton con curva
  de Bezier cubica, easing y micro-jitter para imitar comportamiento
  humano y reducir deteccion de automatizacion.
- cdp_wait_idle: espera network-idle contando requests en vuelo via
  eventos CDP Network.*; inmune a extensiones que mutan el DOM
  (Dark Reader, uBlock) y a animaciones JS.
- list_chrome_profiles: lista perfiles de un user-data-dir (extensiones,
  nombre legible, preferencias).
- prepare_chrome_profile (bash): clona un user-data-dir conservando solo
  una whitelist de extensiones (default uBlock Origin Lite).

Modificadas:
- chrome_launch: Linux-first (chromium/google-chrome/brave antes que
  chrome.exe), KeepExtensions y Setpgid para matar el arbol con cdp_close.
- cdp_close: kill por grupo de proceso.

Todas con tests verdes (go test ./functions/browser ok).
This commit is contained in:
Egutierrez
2026-06-05 16:25:11 +02:00
parent 729921e16e
commit ccfa5bc78b
17 changed files with 1603 additions and 45 deletions
+67
View File
@@ -0,0 +1,67 @@
---
name: list_chrome_profiles
kind: function
lang: go
domain: browser
version: "1.0.0"
purity: impure
signature: "func ListChromeProfiles(userDataDir string) ([]ChromeProfile, error)"
description: "Lista los perfiles de un user-data-dir de Chrome/Chromium. Devuelve Dir (nombre del directorio para --profile-directory), Name (nombre legible de Local State), Extensions (nº de carpetas en Extensions excl. Temp) y HasPreferences. Si userDataDir es vacío usa ~/.config/chromium."
tags: [chrome, chromium, browser, profile, navegator]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["encoding/json", "os", "path/filepath", "sort"]
params:
- name: userDataDir
desc: "Ruta al user-data-dir de Chrome/Chromium. Vacío = ~/.config/chromium."
output: "Slice de ChromeProfile ordenado por Dir. Error si userDataDir no existe o no es legible."
tested: true
tests:
- "detecta perfiles con Preferences"
- "ordena por Dir"
- "resuelve nombres desde Local State"
- "cuenta extensiones excluyendo Temp"
- "excluye System Profile"
- "HasPreferences es true para todos los perfiles devueltos"
- "directorio sin Preferences no aparece"
- "fallback Name igual a Dir cuando no hay Local State"
- "error si userDataDir no existe"
test_file_path: "functions/browser/list_chrome_profiles_test.go"
file_path: "functions/browser/list_chrome_profiles.go"
---
## Ejemplo
```go
// Lista todos los perfiles del Chromium del usuario
profiles, err := browser.ListChromeProfiles("")
if err != nil {
log.Fatal(err)
}
for _, p := range profiles {
fmt.Printf("--profile-directory=%q name=%q extensions=%d\n",
p.Dir, p.Name, p.Extensions)
}
// Output:
// --profile-directory="Automation" name="Automation" extensions=1
// --profile-directory="Default" name="Personal" extensions=12
// --profile-directory="Profile 1" name="Work" extensions=4
// Con ruta explícita (ej. Chrome en ubicación no estándar)
profiles, err = browser.ListChromeProfiles("/home/user/.config/google-chrome")
```
## Cuando usarla
Antes de lanzar Chrome/Chromium con `chrome_launch_go_browser` cuando hay múltiples perfiles y quieres pasar `--profile-directory` al proceso. Sin elegir perfil, Chrome queda bloqueado en el selector de cuentas.
## Gotchas
- **Conteo de extensiones es de carpetas, no de extensiones activas.** Las carpetas de extensiones deshabilitadas o desinstaladas permanecen en disco (cache de Chrome) y se cuentan igualmente. El número es un indicador aproximado de actividad del perfil, no una lista exacta de extensiones habilitadas.
- **Local State puede no existir** si el perfil es nuevo o fue creado manualmente. En ese caso `Name` cae al valor de `Dir` (sin error).
- **Profile Directory ≠ Profile Name.** El argumento `--profile-directory` del binario Chrome acepta el valor de `ChromeProfile.Dir` (ej. `"Profile 1"`), no el `Name` legible.
- **"System Profile"** existe en Chrome pero no es un perfil de usuario; siempre se excluye.
- En Chrome (Google) el default suele ser `~/.config/google-chrome`; en Chromium `~/.config/chromium`. Pasar ruta explícita si se usa Google Chrome.