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:

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:

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).