--- name: cdp_connect_target kind: function lang: go domain: browser version: "1.0.0" purity: impure signature: "func CdpConnectTarget(host string, port int, match string) (*CDPConn, error)" description: "Conecta por CDP a un target DETERMINISTA elegido por ID exacto o substring de URL, evitando engancharse a una pestaña al azar con el CDP global en 9222." tags: [cdp, browser, connection, security, navegator] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: host desc: "Host donde escucha el CDP. Vacío usa 'localhost'. Útil en WSL2 para apuntar a la IP de Windows." - name: port desc: "Puerto CDP del navegador (habitualmente 9222)." - name: match desc: "Filtro de target: vacío = primera tab page (compat con CdpConnectHost); ID exacto del target; o substring case-insensitive de la URL de la pestaña." output: "*CDPConn listo para enviar comandos CDP al target elegido. Error si ninguna tab 'page' satisface el match." tested: false tests: [] test_file_path: "" file_path: "functions/browser/cdp_connect_target.go" --- ## Ejemplo ```go // Fijar la pestaña de GitHub para que el agente no toque otras abiertas conn, err := browser.CdpConnectTarget("", 9222, "github.com") if err != nil { log.Fatal(err) } defer conn.Close() // Por ID exacto de target (obtenido de GET http://localhost:9222/json) conn2, err := browser.CdpConnectTarget("", 9222, "ABCD1234-target-id") // Compatibilidad: sin filtro = primera tab page (igual que CdpConnect) conn3, err := browser.CdpConnectTarget("", 9222, "") ``` ## Cuando usarla Cuando un agente debe atarse a UNA pestaña concreta (por URL) y NO a la primera al azar — crítico con CDP global en 9222 para no operar sobre pestañas ajenas (banca, correo, sesiones activas). Usar en lugar de `CdpConnect`/`CdpConnectHost` siempre que el contexto del agente sea "esta URL concreta" y no "cualquier tab disponible". ## Gotchas - Si hay varias tabs cuya URL contiene el substring dado, se elige la **primera** que aparezca en `/json` (orden interno del navegador). Para mayor precisión, usar el ID exacto del target. - El match de URL es substring **case-insensitive**; `"github"` matchea `"https://github.com/usuario/repo"`. - Con CDP global en 9222 y muchas pestañas abiertas, un `match=""` sigue siendo tan arriesgado como `CdpConnect`. Especificar siempre el match en producción. - La forma más segura para agentes automatizados es lanzar un perfil Chromium dedicado con `--user-data-dir` aislado y `--remote-debugging-port` propio, de modo que `/json` solo exponga las pestañas del agente. - `WebSocketDebuggerURL` puede cambiar entre reinicios del navegador; recalcular en cada sesión, no cachear entre ejecuciones.