Screen Capture API: control del usuario y privacidad
Usa getDisplayMedia con elección explícita, indicadores visibles, revocación y límites de privacidad para capturar pantallas, ventanas y pestañas.
BotBrowser Team
Quieres la documentación estructurada de Plataforma?
Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.
BotBrowser puede repetir un flujo autorizado de getDisplayMedia() en un perfil declarado, pero no puede elegir la pantalla del usuario, ocultar los indicadores del navegador ni hacer que los píxeles capturados sean privados para la página que los recibe. Este artículo trata los límites de control y privacidad, distintos de la cámara virtual y los límites de permisos de Document Picture-in-Picture.
TL;DR
El acceso a Screen Capture API depende de una elección del usuario. Solicítalo desde una acción visible, explica qué se compartirá, detén cada pista cuando termine la tarea y trata el flujo como datos sensibles. getDisplayMedia() no es una API de capturas silenciosas, un permiso permanente ni una prueba de que la superficie capturada sea privada.
Contents
- El contrato de captura
- Matriz de prueba con privacidad
- Revocación y cierre seguro
- Diferencias con APIs multimedia cercanas
- Qué puede controlar BotBrowser
- Conclusión práctica
El contrato de captura
La aplicación debe llamar a navigator.mediaDevices.getDisplayMedia() después de una acción del usuario, como un clic, mientras siga vigente la activación transitoria. Llamarlo desde un temporizador o un mensaje en segundo plano puede rechazar con InvalidStateError. El navegador muestra un selector para monitor, ventana o pestaña; el código no puede elegir una superficie en silencio. El MediaStream devuelto contiene pistas cuyo ciclo de vida debe ser visible.
El selector es un límite de control, no una señal de identidad. Un resultado como NotAllowedError puede significar cancelación, política o una decisión del navegador. Registra solo el resultado necesario para recuperar la interfaz, no un objeto completo de capacidades, el nombre de pantalla, texto del documento o una etiqueta persistente.
Los píxeles capturados siguen siendo datos de la aplicación. No subas el flujo solo porque la captura tuvo éxito. Aplica controles de acceso, retención, redacción y consentimiento como con cámara o micrófono. Un indicador del navegador informa que compartir está activo; no vuelve confiable al destino.
Matriz de prueba con privacidad
Usa contenido sintético y un perfil nuevo por fila. Mantén explícitos la acción, el origen, las restricciones y la acción de parada.
| Fila | Flujo | Observación esperada | Significado de privacidad |
|---|---|---|---|
| A | Pulsa Compartir y cancela el selector | La promesa rechaza con un error acotado | La elección fue rechazada; no se concedió superficie |
| B | Selecciona una pestaña sintética | Hay pista de vídeo y UI de compartir visible | Los píxeles de la pestaña pasan a ser datos de la página |
| C | Llama track.stop() desde Detener | La pista termina y la UI vuelve a reposo | La aplicación terminó la captura deliberadamente |
| D | Cierra la pestaña o revoca desde el navegador | Ocurre ended o el flujo queda inactivo | Usuario o navegador revocaron el permiso |
| E | Intenta pedir sin activación | La solicitud es rechazada | Un script en segundo plano no inicia captura en silencio |
Un resultado compacto puede ser {"browser":"Chrome 155","mode":"headed","surface":"synthetic-tab","result":"started","stopped":true,"capturedBytes":null}. Mantén capturedBytes en null salvo que una medición privada y gobernada lo requiera. El artefacto público debe demostrar el ciclo de vida, no conservar la pantalla.
Revocación y cierre seguro
Conecta listeners ended a cada pista y ofrece un control Detener visible. La UI del navegador, la navegación, el cierre de pestaña o la política también pueden terminarla. Limpia referencias, elimina previsualizaciones y devuelve el foco al control inicial. Ocultar una previsualización no detiene la fuente.
Si usas un grabador, ciérralo antes de liberar el flujo y trata dataavailable como salida sensible. Prefiere fragmentos breves, retención documentada y fixtures sintéticos en pruebas. Nunca registres fotogramas, OCR, datos de cuenta ni nombres completos de pantalla como atajo de depuración.
Diferencias con APIs multimedia cercanas
Dispositivos multimedia y privacidad de la cámara virtual trata enumerateDevices(), permisos de cámara y micrófono y el límite de la lista de dispositivos virtuales. Screen Capture no enumera una pantalla como dispositivo estable ni la selecciona en silencio: presenta una elección nueva y devuelve un flujo de pantalla.
Los límites de permisos de Document Picture-in-Picture crean una ventana same-origin gestionada por el navegador. No exponen píxeles de otra superficie. Screen Capture transfiere píxeles seleccionados a un MediaStream, por lo que la minimización y la revocación son centrales.
No unas estas APIs bajo un permiso único de «medios». Cada una tiene gesto, mediación, error y revisión de privacidad propios. Una ventana Picture-in-Picture exitosa no demuestra captura de pantalla, y una cámara virtual no demuestra la elección del monitor.
Qué puede controlar BotBrowser
BotBrowser puede repetir el botón visible con páginas sintéticas, versión declarada y perfil nuevo. Puede verificar cancelación, una pestaña de prueba, track.stop() y el evento ended. No puede elegir la pantalla real de una persona, saltarse el selector, ocultar indicadores ni garantizar idéntico comportamiento en cada sistema operativo.
Conclusión práctica
Trata Screen Capture API como un flujo revocable y controlado por el usuario que contiene datos sensibles. Empieza con una acción visible, describe la superficie, usa pruebas sintéticas, detén cada pista y conserva solo resultados acotados. El límite de privacidad combina mediación del navegador, cierre de la aplicación y manejo disciplinado de píxeles.
Ciclo de vida para soporte
El contrato tiene cuatro anclas observables: getDisplayMedia(), MediaStreamTrack.readyState, ended y track.stop(). Registra displaySurface, el valor de Permissions-Policy en un iframe y la versión del navegador. Una solicitud rechazada no devuelve MediaStream; una iniciada conserva una pista live hasta stop() o ended.
En una prueba incrustada, separa las ramas de política. La lista predeterminada de display-capture es self, por lo que un iframe del mismo origen puede ser elegible; un iframe de otro origen necesita una delegación explícita que nombre el origen asociado, por ejemplo display-capture=(self) example.test. No supongas que la falta de delegación siempre rechaza: registra por separado origen, política declarada, activación y estado de pista.
Un ciclo de vida útil para soporte.
El registro de soporte debe empezar antes de abrir el selector. Anota el control visible, el origen de la página, la versión del navegador, la familia del sistema operativo y si el perfil es temporal. Describe el resultado esperado en lenguaje corriente: la persona elige una pestaña sintética, la página recibe una pista de vídeo, el indicador permanece visible y Detener termina la pista. Así soporte puede investigar un informe como «falló compartir pantalla» sin pedir el contenido compartido.
La primera ruta negativa es cancelar. La persona puede abrir el selector y decidir no compartir nada. Trata esa decisión como normal, conserva la tarea original y explica brevemente el resultado; no vuelvas a abrir el selector automáticamente. Los reintentos pueden convertir una negativa deliberada en avisos repetidos. Para métricas agregadas con un propósito documentado basta un resultado acotado como cancelled.
La segunda ruta negativa es no tener activación. Una página abierta desde un marcador, un temporizador o un mensaje en segundo plano no debe iniciar el selector sin un gesto actual. Prueba el caso con una página sintética y registra la categoría del rechazo. No lo «arregles» simulando un clic ni solicitando permisos más amplios: ofrece un control visible que explique la acción.
El camino positivo también necesita un estado final. La vista previa puede permanecer visible mientras el flujo está activo, pero ocultarla no detiene la captura. Mantén las pistas en un único objeto responsable, llama a stop() en cada pista de vídeo y audio creada intencionadamente y actualiza el control al cambiar el estado. Si el navegador termina una pista primero, el manejador ended debe ejecutar la misma limpieza para que la aplicación no siga indicando que comparte.
Minimiza los datos que cruzan el límite.
La captura puede incluir mensajes privados, páginas de cuenta, notificaciones o ventanas ajenas a la tarea. El fixture más seguro es una página sintética sencilla, con una etiqueta grande «superficie de prueba» y sin datos de cuenta. En un producto real, explica qué superficie se seleccionará justo antes del selector y limita el receptor a la tarea. Recorta, oculta o difumina contenido solo si la persona entiende el efecto: esconder la vista previa no quita los píxeles del flujo.
No envíes a analítica un MediaStream serializado, el título de una pantalla, un objeto completo de capacidades ni fotogramas. Un vocabulario breve como requested, cancelled, started, stopped y ended basta para la mayoría de las preguntas de fiabilidad. Si hace falta grabar, usa una ruta de datos independiente con control de acceso, límites de retención y una persona responsable de borrarlos. En la documentación pública, usa ejemplos sintéticos y deja nulos los campos de contenido.
Compara cambios del navegador de forma segura.
Si una versión cambia el resultado, repite el mismo fixture sintético antes de modificar la aplicación. Mantén constantes el origen, el método de activación, la superficie solicitada, el ciclo del perfil y la acción de parada. Compara el primer campo que cambió: aparición del selector, creación del flujo, estado de la pista, indicador o limpieza. Un simple «aprobado/fallido» no localiza el límite que cambió.
Las ejecuciones con interfaz visible y las automatizadas pueden diferir por la pantalla, la política o el momento de activación. Declara esas variables en el encabezado del registro; una observación de un ejecutor no es una afirmación universal sobre sistemas operativos. BotBrowser ayuda a repetir un contexto declarado, pero el navegador conserva el control del selector y la persona conserva la elección.
Una revisión breve de privacidad.
Antes de publicar, responde cinco preguntas: ¿el control es visible y accesible por teclado? ¿El texto aclara si se compartirá una pestaña, ventana o monitor? ¿Cancelar deja intacta la tarea? ¿Cada salida detiene las pistas y elimina las vistas previas? ¿Los registros omiten fotogramas, nombres de pantalla, identificadores de cuenta y campos de perfil ajenos? Esta revisión cabe en una solicitud de cambio y evita conservar capturas por accidente.
La misma revisión sirve para soporte. Pide la versión del navegador, el resultado visible, la primera fila del ciclo de vida que falló y si la persona canceló o el navegador terminó la pista. No solicites una grabación de la pantalla de un cliente cuando una reproducción sintética pueda responder la pregunta. Si no hay alternativa a la evidencia privada, recoge lo mínimo por un canal restringido y elimínalo según el calendario documentado.
Detalles de implementación que protegen a las personas.
Guarda el registro de soporte como una fila acotada con displaySurface, versión del navegador, origen de activación y primer estado terminal. Separa el resultado de la solicitud de su causa: un rechazo de política no demuestra que el navegador carezca de captura, y una pista live no demuestra que sea seguro conservar píxeles.
Mantén la solicitud junto al control que la explica. «Compartir una pestaña de prueba» informa mejor que «Iniciar», sobre todo si el producto también controla cámara o micrófono. Explica los posibles destinos y que el navegador abrirá un selector; no prometas que la aplicación pueda restringir todo lo visible en una pestaña elegida. La persona decide qué contiene la superficie y la aplicación debe proteger el MediaStream recibido.
La vista previa necesita un estado claro y un control Detener accesible por teclado. «Compartiendo la pestaña de prueba seleccionada» es mejor que una insignia que solo cambia de color. Cuando termina la pista, anuncia el cambio y restaura la tarea. Si existe grabación, separa su estado del de compartir: puede mostrarse un flujo sin grabarlo, o detenerse la grabación mientras sigue activa la vista previa. El evento ended es el ancla concreta del ciclo de vida.
La política de permisos puede cambiar el recorrido en una página incrustada. Un iframe quizá no pueda solicitar captura aunque sí pueda hacerlo la página superior. Prueba ambos casos como filas distintas, registra la política declarada y explica el rechazo dentro de la página. No pidas relajar una política de todo el sitio solo para aprobar un fixture: es una decisión de producto y seguridad con responsable propio; anota el valor de la política junto a la fecha.
El receptor también necesita un contrato acotado. Si envías el flujo por una conexión entre pares, documenta qué pistas se envían, cuándo se retiran y cómo se informa al otro extremo del fin de la compartición. Si se representa localmente, mantén el elemento de vista previa bajo el mismo responsable que las pistas. No uses la conexión remota como excusa para conservar fotogramas después de Detener: ese control debe liberar referencias locales y marcar la tarea como finalizada.
Para validar automáticamente, usa una página que dibuje un patrón conocido y una etiqueta de prueba, no el escritorio ni una cuenta de cliente. El ejecutor puede comprobar que existe una pista de vídeo, que sus dimensiones no son cero al elegir la pestaña sintética y que la pista termina tras Detener. No necesita inspeccionar píxeles para verificar el ciclo de vida. Registra readyState, track.kind y la hora de parada; evita guardar imágenes, que hacen más difícil gobernar los artefactos de prueba.
Si el navegador rechaza la solicitud, conserva la acción original y ofrece una alternativa compatible: subir un archivo, exportar una versión estática o mostrar una explicación dentro de la página. La alternativa nunca debe cambiar en silencio a cámara o micrófono; cada fuente crea una expectativa distinta y cambiarla sin explicarlo es una regresión de privacidad.
Revisa la matriz cuando cambie el selector del navegador, la política de permisos o la aplicación incorpore un grabador o transporte remoto. Guarda la fecha y la versión del navegador junto al resultado; si cambia, anota la primera fila afectada y quién debe actuar. No generalices desde una pestaña sintética a todas las pantallas, ventanas, cuentas o sistemas operativos.
Interpreta los resultados sin exagerar.
El contrato de MediaStream es el ancla concreta de esta decisión de soporte. Un flujo iniciado demuestra que el navegador declarado y el recorrido elegido produjeron un flujo para esa superficie sintética; no demuestra que otra superficie esté disponible, que otro origen obtenga el mismo resultado ni que sea seguro conservar el contenido. Una pista detenida demuestra la limpieza de esa pista, no borra copias guardadas en otro lugar. El evento ended demuestra que la aplicación observó la terminación, no por qué la causó el navegador o la persona.
Mantén juntas esas afirmaciones en las notas de versión y las traducciones: acción, resultado observable y límite. Así tampoco se confunden las API cercanas: la cámara virtual describe un dispositivo multimedia, Document Picture-in-Picture una ventana auxiliar de presentación y Screen Capture un flujo de pantalla elegido por la persona. Cada una tiene su propio contrato de control y privacidad.
Fuentes públicas
Este artículo forma parte de la guía: Superficies de la plataforma web: mapa de revisión
Artículos Relacionados
Document Picture-in-Picture: límites de permisos y ventanas
Huella digitalEnumeración MediaDevices y privacidad de cámaras virtuales
PlataformaPermissions Policy, capacidades del navegador y privacidad
PlataformaIdle Detection API: control, permisos y privacidad
PlataformaWeb Share API: límites de permisos y respaldos seguros
PlataformaEl soporte de una función no es su calidad
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.