Создание фильтров для 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. 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». Следующее правило скроет скроет именно такую комбинацию: ##div.textad. Тут «##» является признаком правила скрытия, а остальное — селектором, определяющим скрываемый элемент. Скрывать элементы по их атрибуту ID можно аналогичным образом, ##div#sponsorad скроет второй слоган. Указывать имя самого элемента не обязательно, фильтр ##*#sponsorad так же будет работать (* тоже не обязательна). Также можно скрывать элементы лишь по их имени. Например, ##textad скроет третий рекламный слоган.

Расширение 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»: ##div.adheader + *. Полный список CSS селекторов смотрите в спецификации CSS от W3C (учтите: на данный момент Firefox поддерживает ещё не все селекторы).

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

Исключения

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

Упрощённый синтаксис скрытия элементов

Исключительно для сохранения обратной совместимости Adblock Plus поддерживает упрощённый синтаксис скрытия элементов (напр., #div(id=foo)). Использовать его крайне не желательно, а лучше использовать обычные CSS селекторы. В будущем поддержка будет вовсе удалена.

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##div.textad is a specific filter, whereas both ##div.textad and ~example.com##div.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).