Cómo escribir filtros para Adblock Plus
Las actuales versiones de Adblock Plus le permiten "ajustar" los filtros de distintas maneras. Este documento explica las opciones que usted tiene y cómo pueden ser utilizados los filtros.
Descargo de responsabilidad: Todos los ejemplos sobre filtros se dan aquí son realmente sólo ejemplos y no están diseñados para ser utilizados.
Introducción a los filtros para Adblock Plus
Las opciones descritas en esta sección deberían ser suficiente para los usuarios que tienen que crear un filtro de vez en cuando.
Reglas para filtros básicos
El filtro más trivial que se puede definir, por supuesto, es la dirección del aviso de publicidad que se desea bloquear. Sin embargo, a menudo esta dirección cambia cada vez que se abre una página. Por ejemplo, podría ser http://example.com/ads/banner123.gif
123 es un número al azar. Aquí el bloqueo de la dirección completa, no le ayuda, usted necesita un filtro más general — como ser http://example.com/ads/banner*.gif
. O tal vez incluso http://example.com/ads/*
.
Nota: Asegúrese de que usted no está reemplazando demasiado con comodines. El filtro http://example.com/*
definitivamente bloqueará todos los banners, pero también se bloqueará todo lo demás de ejemplo.com que todavía puede ser que desee ver.
Definición de reglas de excepción
A veces, te darás cuenta de que uno de los filtros que por lo general funciona bastante bien, en algunos casos bloquea algo que no debería bloquear. Usted no desea eliminar este filtro, pero que tampoco desea que bloquee en este caso particular.
Para eso es lo que las reglas de excepción son buenas - permiten definir los casos en que los filtros no se deben aplicar. Por ejemplo, si usted no esta conforme con que su filtro adv
bloquee http://example.com/advice.html
, puede definir una regla de excepción @@advice
. Las reglas de excepción no son diferentes de las reglas de filtrado, puede utilizar caracteres comodín o expresiones regulares. Sólo tiene que preceder por@@
para indicar una regla de excepción.
Exception rules can do more. If you specify $document
option you will get an exception for the entire page. For example, if your exception rule is @@||example.com^$document
and you open some page from example.com — Adblock Plus will be entirely disabled on this page and nothing will be blocked.
Cómo coincidir el inicio / final de una dirección
Por lo general, Adblock Plus trata cada filtro como si hubiera un comodín en su principio y fin, por ejemplo, no hay diferencia entre los filtros ad
y *ad*
. Si bien esto por lo general no trae problemas, a veces es se desea que el filtro sólo coincida al principio o al final de una dirección. Por ejemplo es posible que desee bloquear todos los elementos Flash, pero si se agrega el filtro swf
la dirección http://example.com/swf/index.html
también será bloqueada.
Solución a este problema: añadir un símbolo de barra vertical (|) al filtro para mostrar que definitivamente el final de la dirección es en ese punto. Por ejemplo, el filtro swf|
bloqueará http://example.com/annoyingflash.swf
pero no http://example.com/swf/index.html
. Y el filtro |http://baddomain.example/
bloqueará http://baddomain.example/banner.gif
pero no http://gooddomain.example/analyze?http://baddomain.example
.
A veces uno quiere bloquear http://example.com/banner.gif
así como https://example.com/banner.gif
y http://www.example.com/banner.gif
Esto se puede lograr poniendo dos barras verticales en la parte delantera del filtro lo que hace que el filtro coincida al principio del nombre de dominio: ||example.com/banner.gif
bloqueará todas estas direcciones, mientras que no bloqueará http://badexample.com/banner.gif
o http://gooddomain.example/analyze?http://example.com/banner.gif
(requiere Adblock Plus 1.1 o superior).
Marcado de caracteres separadores
A menudo es necesario utilizar un carácter separador en un filtro. Por ejemplo, puede escribir un filtro que bloquee http://example.com/
y http://example.com:8000/
pero no http://example.com.ar/
. Aquí el símbolo ^ se puede utilizar como un marcador para un carácter separador individual: http://example.com^
(requiere Adblock Plus 1.1 o superior).
Un carácter separador es cualquier cosa menos una letra, un dígito, o uno de los siguientes: _ - . %. El final de la dirección también se acepta como separador. En el siguiente ejemplo todos los caracteres de separación se muestran en rojo: http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82. Así que esta dirección se puede bloquear con el filtro ^example.com^
o ^%D1%82%D0%B5%D1%81%D1%82^
o ^foo.bar^
.
Comentarios
Cualquier regla que comienza con un signo de exclamación se considera un comentario. Se mostrará en la lista de filtros, pero en color gris en lugar de negro. Adblock Plus ignora esta regla de bloqueo por lo que es seguro para escribir allí lo que quieras. Puedes colocar un comentario antes de un verdadero filtro para describir lo que está haciendo. O puedes poner un comentario en la parte superior de tu lista de filtros para indicar su autor (en general los autores de lista de filtros lo hacen).
Comentarios particulares
Los comentarios particulares solamente tendrán un efecto en las listas de filtro que han sido descargadas, y no en los filtros personalizados. Special comments must be given at the top of the filter list right below the header. Estos pueden crear un cierto número de parámetros en la lista de filtros:
-
! Homepage: http://example.com/
Este tipo de comentario establece que página debe aparecer vinculada como la pagina de inicio de la lista de filtro.
-
! Title: FooList
Este comentario establece un titulo fijo para la lista de filtro. Si este comentario se encuentra presente, el usuario ya no podrá cambiar el titulo.
-
! Expires: 5 days
Este comentario establece el intervalo de actualización para la lista de filtro, el valor proporcionado puede ser en días (ej.
5 days
) o horas (ej.8 hours
). Cualquier valor dentro del rango de 1 hora hasta 14 días puede ser empleado. Hay que tener en cuenta que la actualización no va a ocurrir necesariamente dentro del intervalo determinado. El tiempo de actualización real se asigna al azar y depende de algunos factores adicionales para reducir la carga hacía el servidor. -
! Redirect: http://example.com/list.txt
This comment indicates that the filter list has moved to a new download address. Adblock Plus will ignore any file contents beyond that comment and immediately try downloading from the new address. In case of success the address of the filter list will be updated in the settings. This comment is ignored if the new address is the same as the current address, meaning that it can be used to enforce the "canonical" address of the filter list.
-
! Version: 1234
This comment defines a numerical version of the filter list. This version number will be displayed in issue reports and can be used to verify that the report refers to the current version of the filter list.
Funciones avanzadas
Las características descritas en esta sección se utilizan generalmente sólo por los usuarios avanzados y creadores de listas de filtros. Puede saltear esta sección si no está interesado.
Cómo especificar opciones para filtros
Adblock Plus le permite especificar un número de opciones para modificar el comportamiento de un filtro. La lista de opciones se separada por comas después de un signo de dólar ($) al final del filtro, por ejemplo:
*/ads/*$script,match-case
Aquí */ads/*
es el verdadero filtro y script
y match-case
son las opciones. En la actualidad las siguientes opciones son compatibles:
- Opciones de tipo de elementos: determinan qué tipos de elementos un filtro puede bloquear (o permitir en el caso de una regla de excepción). Múltiples opciones pueden ser especificadas para indicar que el filtro se debe aplicar a varios tipos de elementos. Los tipos posibles son:
script
— scripts externos cargados a través de la etiqueta script en HTMLimage
— imágenes regulares, por lo general cargadas a través de la etiqueta img en HTMLstylesheet
— archivos de hoja de estilo CSS externosobject
— contenido manejado por plugins del navegador, por ejemplo, Flash o Javaxmlhttprequest
— requests started using theXMLHttpRequest
object orfetch()
APIsubdocument
— páginas integradas, generalmente se incluye a través de marcos HTML (frames)ping
— requests started by<a ping>
ornavigator.sendBeacon()
(Adblock Plus 2.7.1 or higher required)websocket
— requests initiated viaWebSocket
object (Adblock Plus 2.8 or higher required)webrtc
— connections opened viaRTCPeerConnection
instances to ICE servers (Adblock Plus 1.13.3 for Chrome and Opera, 3.0 for Firefox, or higher required)document
— la página en sí misma (sólo reglas de excepción se pueden aplicar a la página)elemhide
— para reglas de excepción únicamente, al igual quedocument
, pero sólo deshabilita reglas de ocultación de elementos en la página en lugar de todas las reglas de filtrado (requiere Adblock Plus 1.2 y superior)generichide
— for exception rules only, similar toelemhide
but only disables generic element hiding rules on the page (Adblock Plus 2.6.12 or higher required)genericblock
— for exception rules only, just likegenerichide
but disables generic blocking rules (Adblock Plus 2.6.12 or higher required)popup
— pages opened in a new tab or windowother
— otros tipos de solicitudes no incluidas en la lista anterior
background
,xbl
anddtd
are outdated and should no longer be used. - Opciones inversas: especifican que no debe ser aplicada a los tipos de elementos del filtro indicados. Posibles opciones de tipo inverso:
~script
,~image
,~stylesheet
,~object
,~xmlhttprequest
,~subdocument
,~document
,~elemhide
,~other
,{10}
- Restricción a las solicitudes de terceros/mismo dominio: Si la opción
third-party
se especifica, el filtro sólo se aplica a las solicitudes de un origen diferente de la página actual que se está mirando. Del mismo modo,~third-party
restringe el filtro a las solicitudes del mismo origen que la página que se ve. - Restricciones de dominio: La opción
domain=example.com
significa que el filtro sólo se debe aplicar en las páginas del dominio "ejemplo.com". Varios dominios pueden ser especificados usando "|" como separador. Por ejemplo, con la opcióndomain=example.com|example.net
el filtro se aplicará únicamente en las páginas de dominio "example.com" o "example.net". Si un nombre de dominio es precedido con "~", el filtro no se debe aplicar en las páginas de este dominio. Por ejemplo,domain=~example.com
significa que el filtro se debe aplicar en las páginas de cualquier dominio, salvo en "ejemplo.com" ydomain=example.com|~foo.example.com
restringe el filtro a el dominio "example.com" con la excepción del subdominio "foo.example.com". -
Sitekey restrictions: The option
sitekey=abcdsitekeydcba
means that the filter should only be applied on pages that provide a public key and a signature which can be verified by that very same public key that is also contained in the filter (but without the trailing =). Multiple sitekeys can be specified using "|" as separator: with the optionsitekey=abcdsitekeydcba|bcdesitekeyedcb
the filter will only be applied on pages providing either sitekey "abcdsitekeydcba" or "bcdesitekeyedcb". This is similar to domain restrictions but allows covering scenarios where a single filter should apply to a very large number of domains. Note that sitekey restrictions require modifications on the server-side. -
Content Security Policies: The option
csp=script-src: 'none'
causes a Content Security Policy header ofscript-src: 'none'
to be injected into HTTP responses for requested documents matching the filter — assuming that exception rules with the same option don't also match and that the document isn’t whitelisted. The Content Security Policyscript-src: 'none'
would in turn block all scripts — including inline — for the document. This filter option should generally be avoided, except as a last resort to counter advanced circumvention. (Adblock Plus 3.1 or higher required.) match-case
— hace que el filtro sólo se aplique a las direcciones donde coincide exactamente mayúsculas y minúsculas, por ejemplo, el filtro*/BannerAd.gif$match-case
bloquearáhttp://example.com/BannerAd.gif
pero nohttp://example.com/bannerad.gif
.
Utilización de expresiones regulares
Puede usar expresiones regulares para un mayor control sobre lo que sus filtros hagan coincidir. Por ejemplo, el filtro /banner\d+/
coincidirá con banner123
y banner321
pero no banners
. Puedes consultar la documentación sobre las expresiones regulares para aprender cómo escribilos.
Nota: Por motivos de rendimiento, se recomienda no utilizar expresiones regulares si se puede evitar.
Ocultar elementos
Reglas básicas
A veces se encuentran anuncios de publicidad que no puede ser bloqueada debido a que están incrustadas como texto en la propia página web. Si nos fijamos en el código fuente de la página web, usted puede encontrar algo como esto:
<div class="textad"> Cheapest tofu, only here and now! </div> <div id="sponsorad"> Really cheap tofu, click here! </div> <textad> Only here you get the best tofu! </textad>
Usted necesita descargar la página web, por lo que necesariamente va a descargar los anuncios de publicidad. Lo único que es posible en este case es ocultar la publicidad para no tener que verla. Ésta es la función para la cual la ocultación de elementos se ha diseñado.
El primer anuncio (del ejemplo de arriba) se encuentra dentro de un elemento div con clase de atributo "textad". Esta regla oculta exactamente esta combinación: ##.textad
. Aquí ## marca una regla para ocultar el elemento, mientras que el resto es un selector para la identificación de los elementos que deben ser escondidos. Puede ocultar los elementos por su atributo id del mismo modo, ###sponsorad
oculta el segundo anuncio de publicidad. No es necesario especificar el nombre del elemento, la regla ##textad
funcionará igual de bien. También puedes ocultar los elementos únicamente por su nombre de elemento, por ejemplo, {4}
para el tercer aviso de publicidad.
La extensión Element Hiding Helper ayuda a seleccionar el elemento correcto y la escritura de la regla correspondiente, sin tener que ver el código fuente de la página. Sin embargo es útil tener conocimientos básicos de HTML.
Nota: La ocultación de elementos funciona de manera muy diferente de los filtros normales. Esto tiene la implicación de que no se admitan los comodines en las reglas para ocultar elementos.
Cómo limitar las reglas a determinados dominios
Por lo general, se desea ocultar un anuncio específico en un sitio específico, y no se quiere que la regla que se aplique en otros sitios. Por ejemplo, la regla ##.sponsor
puede ocultar correctamente elementos en algunos sitios. Pero si se escribe como example.com##.sponsor
se va a aplicar en http://example.com/
y http://something.example.com/
pero no en http://example.org/
. También puede especificar varios dominios - simplemente separarlos con comas: domain1.example,domain2.example,domain3.example##.sponsor
.
Si un nombre de dominio es precedido con "~", la regla no se aplicará en las páginas de este dominio (requiere Adblock Plus 1.1 o superior). Por ejemplo, ~example.com##.sponsor
aplicará en las páginas de cualquier dominio, pero "example.com" y example.com,~foo.example.com##.sponsor
hace que la regla se aplique en "example.com", con la excepción de el subdominio "foo.example.com ".
Nota: Debido a la forma como se implementa la ocultación de elementos, realmente sólo se puede limitar a los nombres de dominio completo. Usted no puede utilizar ninguna otra parte de la dirección y no se puede utilizar domain
como un reemplazo para domain.example,domain.test
.
Nota: Las reglas para ocultación de elementos con limitación de dominio también pueden ser utilizadas para ocultar los elementos de la interfaz de usuario del navegador. Por ejemplo, la regla de filtrado browser##menuitem#javascriptConsole
oculta la consola de JavaScript en el menú de Herramientas de Firefox.
Selectores de atributos
Algunos anunciantes de publicidad no hacen que la tarea sea fácil - sus anuncios de texto no tienen ni un id ni un atributo de clase. Es posible utilizar otros atributos para ocultar los avisos de publicidad, por ejemplo ##table[width="80%"]
oculta tablas con el atributo width (ancho) establecido en 80%. Si no desea especificar el valor total del atributo, ##div[title*="adv"]
oculta todos los elementos div con atributo title (título) que contiene la cadena "adv". También puede consultar el principio y el final de un atributo, por ejemplo ##div[title^="adv"][title$="ert"]
oculta elementos div con el título que comienza con "ADV" y termina con "ert ". Como puedes ver, también es posible utilizar varias condiciones — table[width="80%"][bgcolor="white"]
coincide con las tablas con ancho del 80% y de atributos bgcolor en blanco.
Selectores avanzados
En general, cualquier selector CSS compatible con Firefox se puede utilizar para ocultar elementos. Por ejemplo, la siguiente regla oculta cualquier cosa tras un elemento div con clase "adheader": ##.adheader + *
. Para obtener una lista completa de la lista de CSS ver especificación CSS de W3C (Note que no todos los selectores son compatibles con Firefox todavía). Please keep in mind that browsers are slower to process these selectors than selectors based on class
or id
attribute only.
NotaEsta función es sólo para usuarios avanzados, usted debe sentirse cómodo con selectores CSS para utilizarlo. Adblock Plus no será capaz de verificar la sintaxis del selector que usted agregue. Si se utiliza una sintaxis inválida CSS, podrían dejar de funcionar otras reglas (válidas) que se hayan creado. Compruebe la consola de JavaScript para detectar los errores de CSS.
Extended CSS selectors (Adblock Plus specific)
Sometimes the standard CSS selectors aren't powerful enough to hide an advertisement. For those cases we have added some new selectors, namely :-abp-has()
, :-abp-contains()
and :-abp-properties()
(requires Adblock Plus 1.13.3 or higher for Chrome and Opera).
When writing an element hiding filter that makes use of these extended selectors you must use the #?#
syntax, e.g. example.com#?#selector
. But it's important to note that doing so carries a performance impact, so do so sparingly and make sure those filters are specific to as few domains and elements as possible.
:-abp-properties()
:-abp-properties(properties)
will select elements based upon stylesheet properties. For example :-abp-properties(width:300px;height:250px;)
will select elements that have a corresponding CSS rule in a stylesheet which sets the width
and height
to the values 300px
and 250px
respectively. Property names are matched case-insensitively. Furthermore, wildcards can be used so that :-abp-properties(width:*px;height:250px;)
will match any width specified in pixels and a height of 250 pixels.
You can also use regular expressions by surrounding the properties expression with "/". For example, :-abp-properties(/width:30[2-8]px;height:250px;/)
will match widths between 302 and 308 pixels and a height of 250 pixels.
Note: The older syntax for the CSS property filters is deprecated and will be automatically converted to the new format . The syntax to select the style properties remain the same. For example, [-abp-properties='width:300px;height:250px;']
will be converted to :-abp-properties(width:300px;height:250px;)
.
:-abp-properties()
will also select elements using the style properties found in their pseudo-elements, like ::before
and ::after
. For example, :-abp-properties(content:'Advertisment')
will match elements where the string Advertisment is found in either their ::before
or ::after
pseudo element.
:-abp-has()
:-abp-has(selector)
will select elements based on their content. For example :-abp-has(> div > a.advertiser)
will select elements that contain as a direct descendant a <div>
that contains an <a>
with the class advertiser
. The inner selector can be relative to the element scope, and can use any of the pseudo-selectors, including :-abp-has()
and will determine whether the selection will occur.
:-abp-contains()
:-abp-contains(text)
will select elements based on their text content. For example, div.sidebar > span:-abp-contains(Advertisment)
will select the <span>
elements within a <div>
, with a class of sidebar
that contains the word "Advertisment". In practice, you'd want to combine this with a :-abp-has()
to select the outer container — something like div.sidebar > div:-abp-has(span:-abp-contains(Advertisment))
to select the container that would contain an advertisement label.
Reglas de excepción
Las reglas de excepción pueden desactivar en ciertos dominios las reglas establecidas. Están pensadas sobre todo para los autores de suscripciones de filtros que están ampliando otras suscripciones de filtros que no pueden modificar. Por ejemplo, se puede desactivar la regla ##.textad
en example.com
usando la regla de excepción example.com#@#.textad
. La combinación de ambas reglas tiene exactamente el mismo efecto que la regla única ~example.com##.textad
. Se recomienda utilizar las reglas de excepción solamente cuando no se pueda modificar una regla general de ocultación de elementos, en todos los demás casos resulta preferible limitar dicha regla a los dominios en los que sea necesaria.
These exceptions will be applied to advanced pseudo-selector rules as well.
Generic / Specific filters
With the $generichide
and $genericblock
filter options the distinction between generic and specific filters becomes important.
We classify a filter to be specific if it matches one or more domains or matches a sitekey. If a filter has no domains specified (or only domain exceptions) and no sitekey then it counts as generic. For example, example.com##.textad
is a specific filter, whereas both ##.textad
and ~example.com##.textad
are generic.
Note that with blocking rules the domain must be specified under the $domain option for them to be considered specific. For example, ||example.com^
is considered generic whereas */ads/*$domain=example.com
is site-specific.
Implementing a sitekey on the server
For a sitekey-restricted filter to apply, a webpage needs to return base64-encoded versions of the public key and a signature which Adblock Plus can validate. Currently, this means including them in both the HTTP response header (X-Adblock-Key: abcdpublickeydcba_abcdsignaturedcba
) and the root tag of the document (<html data-adblockkey="abcdpublickeydcba_abcdsignaturedcba">
).
First you need to create a private RSA key (preferably 512 bit to keep the transfer volume low) and then a DER representation of the public key.
The data used for creating the signature is a concatenated list of request variables (namely URI, host and user agent) separated by the NUL
character "\0". For example:
/index.html?q=foo\0www.example.com\0Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0
Finally, generate the signature for this string by using the signature algorithm SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE (default when using OpenSSL).