Files
fn_registry/functions/infra/cdp_screenshot.go
T
egutierrez add09c2faa feat: funciones Chrome CDP para automatización de navegador
10 funciones Go en infra/ para controlar Chrome via Chrome DevTools Protocol:
chrome_launch, cdp_connect, cdp_navigate, cdp_evaluate, cdp_screenshot,
cdp_click, cdp_type_text, cdp_wait_element, cdp_get_html, cdp_close.
WebSocket RFC 6455 implementado sin dependencias externas.
Incluye tests de integración con Chrome real.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:30:56 +02:00

78 lines
2.0 KiB
Go

package infra
import (
"encoding/base64"
"fmt"
"os"
"path/filepath"
)
// CdpScreenshotOpts configura el screenshot.
type CdpScreenshotOpts struct {
// FullPage indica si capturar la pagina completa (scroll height) o solo el viewport.
FullPage bool
// Quality es la calidad JPEG (0-100). Solo aplica si Format es "jpeg". Por defecto 80.
Quality int
// Format es el formato de imagen: "png" o "jpeg". Por defecto "png".
Format string
}
// CdpScreenshot captura un screenshot de la pagina actual y lo guarda en outputPath.
// Usa Page.captureScreenshot del protocolo CDP.
// outputPath debe tener extension .png o .jpg/.jpeg segun el formato elegido.
func CdpScreenshot(c *CDPConn, outputPath string, opts CdpScreenshotOpts) error {
if c == nil {
return fmt.Errorf("cdp screenshot: conexion nula")
}
if opts.Format == "" {
opts.Format = "png"
}
if opts.Quality == 0 && opts.Format == "jpeg" {
opts.Quality = 80
}
params := map[string]any{
"format": opts.Format,
"captureBeyondViewport": opts.FullPage,
}
if opts.Format == "jpeg" {
params["quality"] = opts.Quality
}
if opts.FullPage {
// Expandir clip para capturar toda la pagina
scrollHeight, err := CdpEvaluate(c, "document.documentElement.scrollHeight")
if err == nil {
params["clip"] = nil // dejar que Chrome capture todo
_ = scrollHeight
}
}
result, err := c.sendCDP("Page.captureScreenshot", params)
if err != nil {
return fmt.Errorf("cdp screenshot: %w", err)
}
dataStr, ok := result["data"].(string)
if !ok {
return fmt.Errorf("cdp screenshot: campo data ausente en respuesta")
}
imgData, err := base64.StdEncoding.DecodeString(dataStr)
if err != nil {
return fmt.Errorf("cdp screenshot: decodificar base64: %w", err)
}
// Crear directorio si no existe
if err := os.MkdirAll(filepath.Dir(outputPath), 0755); err != nil {
return fmt.Errorf("cdp screenshot: crear directorio: %w", err)
}
if err := os.WriteFile(outputPath, imgData, 0644); err != nil {
return fmt.Errorf("cdp screenshot: guardar archivo: %w", err)
}
return nil
}