feat(browser): auto-commit con 60 cambios

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-07 11:42:31 +02:00
parent 37aacfcfa9
commit 8742cb25be
71 changed files with 5660 additions and 192 deletions
+60 -12
View File
@@ -9,12 +9,21 @@ import (
// MouseHumanOpts configura el movimiento humano del ratón.
type MouseHumanOpts struct {
// Steps es el número de puntos intermedios de la curva (default 25).
// Mode es la política de velocidad: "human" (default, ""), "fast" o "instant".
// Controla los defaults de Steps/DurationMs/JitterPx y la pausa press/release:
// - human: Bézier ~25 pts, 350-800ms, jitter 2px (sigilo anti-bot alto).
// - fast: recta ~5 pts, 40-80ms, jitter mínimo (eventos de ratón reales,
// para scraping masivo propio).
// - instant: sin movimiento de ratón (CdpMoveMouseHuman es no-op); el click
// por #ref usa element.click() JS. Para tests y fallback sin bbox.
// Los valores explícitos (Steps/DurationMs/JitterPx != 0) ganan al preset del modo.
Mode string
// Steps es el número de puntos intermedios de la curva (default según Mode).
Steps int
// DurationMs es la duración total aproximada del movimiento en milisegundos.
// Si es 0, se elige aleatoriamente entre 350 y 800 ms.
// Si es 0, se elige según Mode.
DurationMs int
// JitterPx es la desviación perpendicular máxima por punto en píxeles (default 2.0).
// JitterPx es la desviación perpendicular máxima por punto en píxeles (default según Mode).
JitterPx float64
// FromX es la coordenada X de origen. Si < 0, se usa (0, 0) como origen.
FromX float64
@@ -22,16 +31,49 @@ type MouseHumanOpts struct {
FromY float64
}
// mouseHumanDefaults aplica valores por defecto a opts.
// MouseProfileForMode construye las opciones de ratón para un modo de velocidad.
// Es la fuente única que MCP, runner YAML y CLI usan para mapear un modo a opts,
// sin duplicar números. El mapeo modo→valores concretos vive en mouseHumanDefaults.
// Un modo desconocido se trata como "human" (el más seguro).
func MouseProfileForMode(mode string) MouseHumanOpts {
switch mode {
case "fast", "instant", "human", "":
return MouseHumanOpts{Mode: mode, FromX: -1, FromY: -1}
default:
return MouseHumanOpts{Mode: "human", FromX: -1, FromY: -1}
}
}
// mouseHumanDefaults aplica valores por defecto a opts según opts.Mode.
func mouseHumanDefaults(opts MouseHumanOpts) MouseHumanOpts {
if opts.Steps <= 0 {
opts.Steps = 25
}
if opts.DurationMs <= 0 {
opts.DurationMs = 350 + rand.Intn(451) // 350..800
}
if opts.JitterPx <= 0 {
opts.JitterPx = 2.0
switch opts.Mode {
case "instant":
// El movimiento se omite en CdpMoveMouseHuman; valores mínimos por si acaso.
if opts.Steps <= 0 {
opts.Steps = 1
}
if opts.DurationMs <= 0 {
opts.DurationMs = 1
}
// JitterPx se queda en 0.
case "fast":
if opts.Steps <= 0 {
opts.Steps = 5
}
if opts.DurationMs <= 0 {
opts.DurationMs = 40 + rand.Intn(41) // 40..80
}
// JitterPx se queda en lo recibido (0 por defecto, sin jitter en fast).
default: // "human" o ""
if opts.Steps <= 0 {
opts.Steps = 25
}
if opts.DurationMs <= 0 {
opts.DurationMs = 350 + rand.Intn(451) // 350..800
}
if opts.JitterPx <= 0 {
opts.JitterPx = 2.0
}
}
if opts.FromX < 0 {
opts.FromX = 0
@@ -119,6 +161,12 @@ func CdpMoveMouseHuman(c *CDPConn, toX, toY float64, opts MouseHumanOpts) error
}
opts = mouseHumanDefaults(opts)
// Modo instant: sin movimiento de ratón (el click lo resuelve quien llama,
// por coords directas o por element.click() JS).
if opts.Mode == "instant" {
return nil
}
p0 := [2]float64{opts.FromX, opts.FromY}
p3 := [2]float64{toX, toY}
ctrl1, ctrl2 := randomControlPoints(p0, p3)