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:
@@ -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.
|
||||
Reference in New Issue
Block a user