Создание фильтров для Adblock Plus

Текущие версии Adblock Plus позволяют вам "настраивать" фильтры многими разными способами. Этот документ расскажет о выборе, который у вас есть, и о том, как его использовать.

Ответственность: Все примеры фильтров приведённые здесь являются только примерами и не предназначены для использования.

Введение

Параметров описанных в этом разделе должно быть достаточно для создания фильтров по мере необходимости.

Основные правила

Наиболее простой фильтр это адрес баннера, который вы хотите заблокировать. Однако, часто этот адрес изменяется каждый раз при загрузке страницы. Например, он может быть http://example.com/ads/banner123.gif где 123 -случайное число. В этом случае блокирование по адресу вам не поможет, вам нужен более общий фильтр, такой как http://example.com/ads/banner*.gif. Или, может быть, даже http://example.com/ads/*.

Примечание: Убедитесь, что вы не обобщили слишком многое. Фильтр http://example.com/* безусловно, заблокирует все баннеры, но также заблокирует всё остальное с example.com то, что вы можете захотеть увидеть.

Исключающие правила

Иногда вы можете заметить, что один из ваших фильтров обычно работающий нормально, блокирует то, что не должно быть блокировано. Вы не хотите удалять этот фильтр, но вы также не хотите, чтобы это продолжалось.

Для этого случая есть исключающие правила - они позволяют вам определить, в каком случае фильтры не должны применяться. Например, если фильтр adv блокирует http://example.com/advice.html, вы можете установить исключающее правило @@advice. Исключающие правила не отличаются правил фильтров, вы можете использовать символы обобщения или регулярные выражения. Только вы должны начинать их с @@, указывающее на исключающее правило.

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.

Соответствие началу/концу адреса

Обычно Adblock Plus обрабатывает каждый фильтр так,как если бы он имел обобщения в начале и в конце. Например, нет разницы между фильтрами ad и *ad*.Обычно это не является проблемой, но иногда вы можете захотеть, чтобы ваш фильтр соответствовал в начале или в конце адресов. Например, вы можете захотеть заблокировать весь Flash, но если вы добавите фильтр swf , адрес http://example.com/swf/index.html также будет заблокирован.

Решение проблемы: добавьте к фильтру символ |, чтобы показать, что конец адреса находится в этой точке. Например, фильтр swf| будет блокировать http://example.com/annoyingflash.swf , но не http://example.com/swf/index.html. А фильтр |http://baddomain.example/ будет блокировать http://baddomain.example/banner.gif , но не http://gooddomain.example/analyze?http://baddomain.example.

Иногда хочется заблокировать http://example.com/banner.gif вместе с https://example.com/banner.gif и http://www.example.com/banner.gif. Этого можно достичь добавлением пары символов | в начало фильтра соответствующего началу доменного имени: ||example.com/banner.gif заблокирует все эти адреса и не тронет http://badexample.com/banner.gif или http://gooddomain.example/analyze?http://example.com/banner.gif (необходим Adblock Plus 1.1 и выше).

Разделительные символы

Часто вам нужно будет применить в фильтре любой разделительный символ. Например, вы можете написать фильтр, который блокирует http://example.com/ и http://example.com:8000/ , но не http://example.com.ar/. Здесь символ ^ может быть использован как указатель для одного разделительного символа: http://example.com^ (необходим Adblock Plus 1.1 и выше).

Разделителем может быть любой символ кроме буквы, цифры и следующих символов: _ - . %. К концу адреса также применим разделитель. В следующем примере все разделители показаны красным: http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82. Также этот адрес может быть блокирован фильтром ^example.com^ или ^%D1%82%D0%B5%D1%81%D1%82^ или ^foo.bar^.

Комментарии

Любое правило, начинающееся с восклицательного знака содержит комментарий. Оно отображается в списке фильтров серым цветом. Adblock Plus будет игнорировать это правило при блокировании, так что можете спокойно писать там всё, что хотите. Вы можете расположить комментарий выше реального фильтра, чтобы описать для чего он нужен. Или вы можете разместить комментарий с указанием вашего авторства вверху списка фильтров (так делают большинство авторов).

Special comments

Special comments will only have an effect in downloaded filter lists, not in custom filters. Special comments must be given at the top of the filter list right below the header. They can set a number of parameters for the filter list:

Расширенные возможности

Возможности, описанные в этом разделе, обычно используются опытными пользователями или создателями подписок. Вы можете пропустить его.

Специфические опции фильтра

Adblock Plus позволяет вам определить число параметров, изменяющих поведение фильтра. Список этих параметров располагается в конце фильтра после знака доллара ($) и разделяется запятыми, например:

*/ads/*$script,match-case

Здесь */ads/* текущий фильтр script и match-case его параметры. В настоящее время поддерживаются следующие параметры:

Использование регулярных выражений

Если желаете добиться большего контроля над тем, к чему ваши фильтры подходят, а к чему нет, то можете использовать регулярные выражения. Например, фильтр /banner\d+/ подойдёт к banner123 и banner321 , но не banners. Изучите документацию по регулярным выражениям и сможете составлять их сами.

Примечание: Для повышения производительности рекомендуется не использовать регулярные выражения, если этого можно избежать.

Скрытие элементов

Основные правила

Иногда вы будете встречать рекламу, которая не может быть заблокирована потому, что она была внедрена как текст в саму веб-страницу. Если вы посмотрите исходный код такой страницы, то найдёте нечто вроде этого:

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

Для корректного отображения страницу необходимо полностью, а значит и реклама будет скачана и этого нельзя избежать. Всё, что тут можно сделать - скрыть то, что не желаете видеть. Для этого и применяются правила скрытие элементов.

Первый рекламный слоган выше находится внутри элемента DIV с классом «textad». Следующее правило скроет скроет именно такую комбинацию: ##.textad. Тут «##» является признаком правила скрытия, а остальное — селектором, определяющим скрываемый элемент. Скрывать элементы по их атрибуту ID можно аналогичным образом, ###sponsorad скроет второй слоган. Указывать имя самого элемента не обязательно, фильтр ##textad так же будет работать (* тоже не обязательна). Также можно скрывать элементы лишь по их имени. Например, {4} скроет третий рекламный слоган.

Расширение Element Hiding Helper поможет в выборе нужного элемента и написании соответствующего правила без изучения исходного кода страницы. Базовые знания в HTML желательны в любом случае.

Примечание: Правила скрытие кардинально отличается от обычных фильтров. Например, не поддерживаются привычные символы масок — они имеют другое значение и применение.

Ограничение правил определенными доменами

Обычно вы хотите скрыть определенную рекламу на определенном сайте и не хотите, чтобы это правило применялось на других сайтах. Например, правило ##.sponsor может скрыть полезный код на некоторых сайтах. Но если вы напишете его как example.com##.sponsor оно будет применено на http://example.com/ и http://something.example.com/ но не на http://example.org/. Вы также можете определить множество доменов - просто разделите их запятыми: domain1.example,domain2.example,domain3.example##.sponsor.

Если доменному имени предшествует "~", правило не будет применяться на страницах этого домена (требуется Adblock Plus 1.1 и выше). Например, ~example.com##.sponsor будет применяться на страницах с других доменов, "example.com" и example.com,~foo.example.com##.sponsor делает правило применимым к домену "example.com" с исключением поддомена "foo.example.com".

Примечание: Из-за способа, который применяется при скрытии элементов, вы можете использовать только полные доменные имена. Нельзя использовать другие части адресов и нельзя использовать domain как замену domain.example,domain.test.

Примечание: Правила скрытия элементов с ограничением доменов могут использоваться для скрытия элементов интерфейса браузера. Например, правило browser##menuitem#javascriptConsole скроет пункт Консоль JavaScript в меню Инструменты браузера Firefox.

Селекторы атрибутов

С некоторыми рекламными вставками справиться не так просто - их рекламный текст не имеет ни id, ни атрибута class. Вы можете использовать другие атрибуты для их скрытия, например ##table[width="80%"] будет скрывать таблицы атрибут width у которых установлен в 80%. Если вы не хотите определять полное значение атрибута, ##div[title*="adv"] будет скрывать все элементы div с атрибутом заголовка, содержащим строку "adv". Вы также можете проверять начало и конец атрибута, например ##div[title^="adv"][title$="ert"] будет скрывать элементы div начинающиеся с "adv" и заканчивающиеся "ert". Как видите, вы также можете использовать множество состояний — table[width="80%"][bgcolor="white"] будет подходить для таблиц с атрибутом width установленным в 80% и атрибутом bgcolor установленным в white.

Дополнительные селекторы

В принципе любой CSS селектор моно работающий в Firefox можно использовать для скрытия. Например следующее правило скроет всё, что вложено в элемент DIV с классом «adheader»: ##.adheader + *. Полный список CSS селекторов смотрите в спецификации CSS от W3C (учтите: на данный момент Firefox поддерживает ещё не все селекторы). Please keep in mind that browsers are slower to process these selectors than selectors based on class or id attribute only.

Примечание: Эта функция для продвинутых пользователей, необходимо свободное владение CSS селекторами, чтоб их корректно использовать. Adblock Plus не способен проверить синтаксис добавляемого селектора и если использовать неправильный синтаксис, то можно сломать другие (корректные) фильтры. Проверяйте консоль ошибок JavaScript на предмет сообщений об ошибках в 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.

Исключения

Правила-исключения «выключают» отдельные правила блокировки и скрытия на определённых доменах. В основном они полезны авторам подписок, дополняющих сторонние подписки, которые они не могут изменить. Например, правило ##.textad можно выключить на example.com добавив исключение example.com#@#.textad. Комбинация этих двух правил идентична по эффекту одному правилу ~example.com##.textad. Применять такие исключения рекомендуется только в случае, когда изменить само правило скрытия не представляется возможным, во всех остальных случаях лучше изменить само правило. 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).