--- id: 0029 title: Enrichers via Chrome headless (CDP) — fetch_webpage_browser, fetch_screenshot status: pending priority: medium created: 2026-05-01 depends_on: [0028] --- ## Objetivo Variantes de los enrichers basicos que usan Chrome headless via CDP, para sitios con contenido renderizado por JavaScript (SPA, paginas con auth visual, etc.) o cuando se quiere capturar evidencia visual. ## 1. `fetch_webpage_browser` ``` applies_to: [Url, Webpage] emits: [Domain] relations: [BELONGS_TO] params: - { name: chrome_port, type: int, default: 9222 } - { name: wait_after_load_ms, type: int, default: 1500 } ``` - Usa funciones del registry: - `chrome_launch_go_browser` — lanza Chrome en port (reusa si ya esta). - `cdp_connect_go_browser` - `cdp_navigate_go_browser` - `cdp_wait_load_go_browser` - `cdp_get_html_go_browser` — DOM post-JS. - El run.py shell-out a un binario Go pequeno o llama estas funciones via un wrapper Python que invoca el Go function como subprocess. - Decision pendiente: empaquetar las funciones Go en un binario CLI `cdp-fetcher` que el run.py invoque, o reescribir la logica en Python con `pychrome` / `playwright`. Preferencia: binario Go para reusar las funciones del registry. ## 2. `fetch_screenshot` ``` applies_to: [Webpage, Url] params: - { name: full_page, type: bool, default: true } ``` - `cdp_screenshot_go_browser` → guarda `cache/.png`. - `node_updates`: anade `screenshot_path` a metadata del Webpage. - No emite entidades nuevas. ## Definicion de hecho - `fetch_webpage_browser` extrae correctamente DOM de una SPA (test: twitter.com, linkedin.com publico). - `fetch_screenshot` produce PNG legible en el cache. - Inspector del nodo Webpage muestra una preview del screenshot cuando `screenshot_path` existe (mejora UI opcional). ## Out of scope - Login flows / auth via CDP — fuera de v1. - Adblock / fingerprint evasion — el user-agent default es suficiente.