Detección
Cómo Detectar AdBlock con JavaScript: Código, Límites y la Alternativa Gestionada
Tutorial práctico de detección de adblock con JavaScript para publishers hispanohablantes: método bait-div, sondas fetch, blind spots de MV3 y cuándo una solución gestionada tiene más sentido.
Por qué los publishers necesitan detectar el adblock con JavaScript
Los bloqueadores de anuncios actúan en silencio. Interceptan peticiones de red y ocultan elementos del DOM antes de que tu página muestre ningún anuncio. Detectarlos desde JavaScript significa observar los efectos secundarios que dejan: un elemento que desaparece del layout o una petición de red que nunca llega al servidor
Para un publisher hispanohablante que trabaja con redes como Publisuites o con la monetización de Ezoic en mercados de habla española, esto se traduce directamente en ingresos perdidos. Los publishers pierden entre el 18 % y el 32 % de sus impresiones publicitarias por culpa de los bloqueadores. Una capa de detección bien implementada permite presentar un mensaje de whitelist o una oferta de suscripción antes de que esa impresión se pierda definitivamente
El punto de entrada más accesible es JavaScript puro, sin dependencias, ejecutado en el navegador del visitante. Pero 'accesible' no significa 'definitivo', y entender sus límites ahorra muchas horas de depuración meses después
El método bait-div clásico y por qué ya no aguanta
La técnica más extendida crea un elemento HTML invisible con nombres de clase que aparecen en EasyList, la lista de filtros más usada por uBlock Origin, AdBlock Plus y extensiones similares. El bloqueador aplica sus filtros cosméticos y oculta el elemento. Tu script comprueba si sigue visible 150 ms después
No publicamos aqui un snippet ejecutable a proposito. El metodo en si no es ningun secreto: crear un elemento invisible cuyo nombre de clase coincide con una entrada de una lista de filtros publica como EasyList, esperar un momento y comprobar si un bloqueador lo ha ocultado. El problema es justo que es publico y estatico. Un nombre de clase fijo y conocido es lo primero que un mantenedor de listas copia en una regla, y a partir de ahi la comprobacion devuelve 'sin bloqueador' en silencio para cada visitante que lleve esa lista.
Los nombres de clase en los que se apoyan estos snippets, como los que aparecen en EasyList, son públicos y fijos, así que la mayoría de bloqueadores basados en listas en Manifest V2 ocultan el elemento. Ahí está justo la debilidad: una firma fija y conocida es trivial de añadir a una regla de filtro, y en cuanto se lista, la comprobación deja de saltar
Este enfoque todavía detecta AdBlock Plus y versiones MV2 de uBlock Origin. El problema, que veremos abajo, es que cubre solo una pequeña parte y se degrada en cuanto una lista de filtros lo alcanza, sin ningún error visible que te avise
Sondas fetch y los blind spots de MV3
Algunos bloqueadores, especialmente Brave Shields y uBlock Origin Lite (la versión MV3), priorizan el bloqueo de peticiones de red sobre los filtros cosméticos. Para detectarlos, necesitas una sonda fetch: haces una petición a una URL con un patrón reconocible y compruebas si llega al servidor
Tampoco incluimos aqui una sonda ejecutable. La idea es pedir una ruta que parece publicitaria y tratar el fallo como un bloqueador, lo que detecta bloqueadores a nivel de red que una comprobacion cosmetica no ve. En la practica es fragil: la ruta de la sonda es otra firma fija y listable, un simple 404 o un proxy corporativo se parece a un bloqueo real y produce falsos positivos, y con Manifest V3 la peticion se detiene en el motor del navegador antes de que tu codigo se ejecute, asi que la senal es facil de malinterpretar.
La debilidad es la misma que con el elemento cebo. La ruta de la sonda es una firma fija y listable, y un simple 404, un proxy corporativo o ciertas VPN pueden hacer que la petición falle sin ningún bloqueador presente, lo que produce falsos positivos. Apilar dos señales estáticas frágiles no arregla el problema de fondo: las dos son públicas, fáciles de listar y se quedan mudas sin avisar
MV3 usa 'declarativeNetRequest', que intercepta la petición antes de que JavaScript la vea. Tu 'catch' se dispara correctamente. Sin embargo, las reglas de MV3 son más conservadoras que las de MV2, habrá casos donde ninguna sonda sea determinante, especialmente con configuraciones menos agresivas del bloqueador
Por qué el código propio se degrada sin que te enteres
Las listas de filtros se actualizan a diario. EasyList, uAssets y las listas de AdGuard publican varias actualizaciones semanales. Cualquiera de esas actualizaciones puede cambiar los selectores que ocultan tu bait-div o añadir nuevos patrones de URL que tu sonda no cubre. No lo sabrás hasta que revises tus métricas con más cuidado del habitual
Los bloqueadores a nivel DNS como Pi-hole o NextDNS interceptan las peticiones antes de que lleguen al navegador. Tu sonda fetch falla, pero la firma de error es idéntica a la de un error de red transitorio. Sin una señal secundaria no puedes distinguir los dos casos. Para cuantificar cuánto te están costando los bloqueadores en ingresos reales, la calculadora en /calculator hace el cálculo con tus datos de tráfico y CPM
Los falsos positivos también son un riesgo. Proxies corporativos y ciertas VPN pueden hacer que tu sonda fetch falle sin que haya ningún bloqueador. Si respondes con un paywall duro a cada señal de detección, estarás forzando a visitantes legítimos a abandonar tu sitio, y perderás más de lo que recuperas
Cuándo usar una solución gestionada (y empezar gratis)
El código propio es un punto de partida válido si tienes un sitio pequeño, capacidad técnica interna y tiempo para mantener la lógica al día. Para la mayoría de los publishers, desde blogs de nicho con Publisuites hasta medios con tráfico Ezoic, esas tres condiciones no se cumplen a la vez
AntiAdBlock Core ejecuta un motor de detección multi-señal mantenido de forma continua que se actualiza contra las listas de filtros en vivo. La precisión es del 99,7 %, con menos fricciones para visitantes que no usan bloqueadores. La tasa de inclusión en lista blanca media es del 65 % y la recuperación de ingresos media es del 38 % de las impresiones previamente bloqueadas
El plan gratuito cubre 10.000 detecciones al mes sin tarjeta de crédito, suficiente para validar la señal en una audiencia real. Si quieres calcular cuánto te cuestan los bloqueadores antes de registrarte, la página /calculator hace los números. Los planes de pago comienzan en torno a 9 dólares al mes y la integración es una sola línea de '<script>' en tu '<head>'. Puedes empezar en /register en menos de dos minutos
Si has alcanzado los límites del código de detección escrito a mano, detectar adblock con JavaScript 2026 cubre el panorama completo de lo que ha cambiado con MV3. Para entender qué significan los números de precisión de cualquier servicio de detección, precisión de detección anti-adblock te da las preguntas clave.
Brave es el caso que un test de cebo por sí solo siempre pierde, porque el bloqueo va integrado en el navegador: el bloqueo de anuncios en Brave explica qué mirar.
Preguntas frecuentes
¿Funciona detectar adblock con JavaScript contra uBlock Origin Lite (MV3)?
Parcialmente. uBlock Origin Lite usa `declarativeNetRequest` para bloquear peticiones a nivel del motor del navegador, así que una sonda fetch detecta su presencia cuando la petición falla. Sin embargo, el filtrado cosmético de MV3 es más limitado, lo que hace el método bait-div menos fiable. Para una cobertura consistente contra MV3 se necesita una combinación de vectores, no un solo método.
¿Puedo detectar Brave Shields con JavaScript?
Sí, mediante sondas fetch. Brave Shields opera a nivel del motor del navegador, no es una extensión convencional, así que las APIs de detección de extensiones no aplican. Sin embargo, Brave Shields intercepta peticiones a URLs con patrones reconocibles como '/ads/', por lo que una sonda fetch a un recurso con ese tipo de ruta fallará y dará señal positiva.
¿Cómo evito los falsos positivos al detectar adblock con JavaScript?
Usa al menos dos señales independientes y actúa solo cuando ambas coinciden: el bait-div oculto Y la sonda fetch fallida. Añade un retardo de 150–200 ms antes de comprobar el elemento cebo. Prueba tu implementación desde conexiones corporativas y con VPN activa, ambos entornos pueden hacer fallar una sonda fetch sin que haya ningún bloqueador.
¿Es suficiente un snippet JavaScript para recuperar ingresos publicitarios?
Para detectar la presencia del bloqueador, sí. Pero la detección por sí sola no recupera ingresos, necesitas una estrategia de respuesta y que esa detección sea lo suficientemente precisa para no molestar a visitantes sin bloqueador. Un snippet básico tiene blind spots contra Brave Shields, DNS blockers y MV3 que un ensemble multi-vector gestionado cierra de forma automática.
Pon a prueba el mejor script anti adblock.
Gratis hasta 10.000 detecciones al mes. Instalación en 60 segundos.