menu

Как составлять фильтр антибаннера AdGuard
16.08.2011, 18:50
Введение:
Фильтр - это набор правил фильтрации рекламного контента (баннеров, всплывающих окон и тому подобного). Вместе с Adguard поставляется "Стандартный фильтр", создаваемый нами. Он постоянно дорабатывается и дополняется, и, как мы надеемся, удовлетворяет большинство пользователей. Версию стандартного фильтра вы можете увидеть на закладке "Защита", в поле "Версия базы". Каждое приложение Adguard время от времени автоматически обновляет стандартный фильтр до последней доступной версии.

Вместе с тем, Adguard позволяет создать ваш собственный фильтр, используя те же самые правила фильтрации, что используем мы в "Стандартном фильтре".

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

Примечание: не заблокируйте слишком много. Например правило http://example.ru/* заблокирует вообще все страницы сайта example.ru.

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

Для этого случая есть правила-исключения - они позволяют вам определить, в каком случае правила не должны применяться. Например, если правило adv блокирует http://example.ru/advice.html, вы можете добавить правило-исключение @@advice. Правила написания исключений ничем не отличаются от "общих правил", вы можете использовать символы обобщения и параметры дополнительной настройки (о них мы расскажем в разделе "Расширенные возможности".

Для того, чтобы Adguard понял, что правило является исключающим, начните его с @@.

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

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

Иногда хочется не только http://domain.ru, но и http://www.domain.ru, или http://adv.domain.ru. Это может быть достигнуто добавлением двух символов | в начало правила, который соответствует началу доменного имени: ||example.com/banner.gif будет блокировать все эти адреса, но не тронет http://gooddomain.ru/banner.gif или http://gooddomain.ru/analyze?http://domain.ru/banner.gif.

Разделительные символы:
Часто вам нужно будет применить в правиле любой разделительный символ. Например, вы можете написать правило, которое блокирует http://domain.com/ , но не http://domain.com.ua/. Здесь символ ^ может быть использован как указатель для одного разделительного символа: http://domain.com^.

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

Этот адрес может быть блокирован правилом ^domain.com^ или ^%D1%82%D0%B5%D1%81%D1%82^ или ^foo.bar^.

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

Расширенные возможности:
Возможности, описанные в этом разделе, обычно используются опытными пользователями. Они расширяют возможности "Общих правил", но для их применения необходимо иметь начальное представление о работе браузера.

Вы можете изменить поведение "общего правила", используя дополнительные параметры. Список этих параметров располагается в конце правила за знаком доллара $ и разделяется запятыми.
Например: 
||domain.ru$match-case,third-party.


Здесь ||domain.ru - это само правило, а match-case и third-party - его параметры.

Типы параметров:
domain - ограничивает действия правила списком доменов. Параметр domain=example.ru означает, что правило должно быть применено только на страницах домена "example.ru". Множество доменов можно установить, используя "|" как разделитель: с параметром domain=example.ru|example.net правило будет применяться только на страницах доменов "example.ru" или "example.ru". Если доменное имя начинается с "~", правило не должно применяться на страницах этого домена. Например, domain=~example.ru показывает, что правило должно применяться на страницах любого домена, кроме "example.com". А domain=example.com|~foo.example.com ограничивает правило доменом "example.com" исключая поддомен "foo.example.com".
third-party - ограничение на сторонние/собственные запросы. Если указан параметр third-party, то правило применяется лишь к запросам ресурсов из внешних источников. Аналогично, ~third-party ограничивает правило запросами из того же источника, что и открытая страница. Приведем пример. Правило ||domain.com$third-party применяется на всех сайтах кроме самого domain.com. Если переписать его как ||domain.com$~third-party, то оно будет применяться только на самом domain.com, но не на других сайтах.
match-case - определяет правило, которое применяется только к адресам с совпадением регистра букв, например правило */BannerAd.gif$match-case будет блокировать http://example.com/BannerAd.gif, но не http://example.com/bannerad.gif. По-умолчанию регистр символов не учитывается.
elemhide - этот параметр имеет смысл указывать только для правил-исключений. Запрещает правила сокрытия элементов на страницах, подходящих под правило. О правилах сокрытия элементов речь пойдет ниже.
content - этот параметр имеет смысл указывать только для правил-исключений. Запрещает правила фильтрации HTML-элементов на страницах, подходящих под правило. О правилах фильтрации HTML-элементов речь пойдет ниже.
document - этот параметр имеет смысл указывать только для правил-исключений. Запрещает одновременно и правила сокрытия элементов, и правила фильтрации HTML.
jscript - этот параметр имеет смысл указывать только для правил-исключений. Запрещает фильтрацию javascript-файлов, подгружаемых на страницу, подходящую под правило.
jsinject - этот параметр имеет смысл указывать только для правил-исключений. Запрещает добавление javascript-кода на страницу. Javascript-код добавляется для блокировки баннеров по размерам, а также для работы "помошника Adguard".
urlblock - этот параметр имеет смысл указывать только для правил-исключений. Запрещает блокировку запросов, отправленных со страниц подходящих под это правило.

Если у вас со включенной защитой страница открывается неправильно, или не работает какой-то функционал, попробуйте создать для нее правило-исключение вида ||domain.ru$content,elemhide,jsinject,urlblock. В случае, если ошибка связана с фильтрацией контента страницы - она должна исчезнуть.

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

<div class="textad">
Дешевые пельмени, здесь и сейчас!
</div>
<div id="sponsorad">
Ну очень дешевые пельмени, клацай сюда!
</div>
<textad>
Здесь и только здесь лучшие пельмешки!
</textad>


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

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

ВАЖНО: Для работы с правилами скрытия необходимы знания HTML и CSS. Фактически, правила скрытия - это просто CSS-селекторы. Adguard добавляет на страницу собственные стили, состоящие из правил скрытия. Ко всем CSS-селекторам применяется стиль {display:none!important}.

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

Вы также можете определить множество доменов - просто разделите их запятыми: domain1.example,domain2.example,domain3.example##.sponsor.

Если доменному имени предшествует "~", правило не будет применяться на страницах этого домена. Примеры: Правило ~example.com##.sponsor будет применяться на страницах любых сайтов, кроме "example.com". Правило example.com,~foo.example.com##.sponsor позволяет применять правило на сайте "example.com" исключая поддомен "foo.example.com".

Правила фильтрации HTML-контента:
В большинстве случаев достаточно перечисленных правил. Но иногда для фильтрации рекламы необходимо изменять HTML-код самой страницы. Для того, чтобы сделать это применяются правила фильтрации HTML-контента. Они позволяют указать, какие HTML-элементы необходимо вырезать из страницы перед тем как отдать ее браузеру.

Рассмотрим следующий пример кода страницы.
<script type="text/javascript">
document.write('<div>Покупайте пельмешки <a href="http://pelmeshki.com">Здесь!</a></div>" />');
</script>


В данном случае рекламный слоган появляется на странице не сразу, а после загрузки страницы. Для вывода используется Javascript. Используя первые два вида правил мы ничего сделать не можем. Тут нам на помощь и приходят правила фильтрации HTML-контента. Для того, чтобы избавиться от рекламы, нам нужно вырезать из страницы весь элемент script. Но все элементы script вырезать нельзя - они могут быть нужны для работы сайта. Используем следующее правило:

$$script[type="text/javascript"][tag-content="pelmeshki.com"]

Это правило расшифровывается следующим образом: удаляются все элементы script, атрибут type которых равен text/javascript, а внутри элемента встречается строка pelmeshki.com.

Но это правило достаточно общее, и, если применять его ко всем сайтам, мы можем нарушить их работоспособность. Для этого вы можете ограничить применение правила выбранными сайтами. Ограничение на домены выглядит также, как и для правил сокрытия элементов. То есть, правило example.com,~foo.example.com$$script[type="text/javascript"][tag-content="pelmeshki.com"] будет применено только для сайта example.com, исключая его поддомен foo.example.com.

Дополнительные атрибуты правил фильтрации HTML:


Правила фильтрации HTML-элементов могут быть расширены за счет применения дополнительных атрибутов. Список этих атрибутов приведен ниже.

loaded-script - позволяет применять правило не только к элементам script на странице, но также и к подгружаемым скриптам. Иногда это необходимо, так как скрипты рекламных сетей хранят в закриптованном виде на самом сайте. Пример такого правила: $$script[tag-content="crypted script"][loaded-script="true"]. Важно, чтобы правило, применяемое к подгружаемым скриптам, не содержало никаких атрибутов кроме: tag-content, loaded-script, max-length, min-length.
max-length - задает максимальную длину содержимого HTML-элемента. Если этот параметр задан, и длина содержимого превышает заданное значение - правило не применяется к элементу.
min-length - задает минимальную длину содержимого HTML-элемента. Если этот параметр задан, и длина содержимого меньше заданного значения - правило не применяется к элементу.
parent-elements - очень важный атрибут. Он сильно изменяет то, как работает это правило. Суть в том, что вырезается теперь не тот элемент, который найден, а заданный родительский элемент.
Рассмотрим пример:
<table style="background: url('http://domain.com/banner.gif')">
<tr>
<td>
<a href="http://pelmeshki.com">Купил пельмешки БЫСТРО</a>
</td>
</tr>
</table>

Проблема этого HTML-кода в том, что нам недостаточно вырезать ссылку на рекламу. Сам баннер показывается с помощью родительской таблицы (как ее background). Тут нам и приходит на помощь атрибут parent-elements. Мы используем вот такое правило, чтобы заблокировать всю таблицу: $$a[href="pelmeshki.com"][parent-elements="table"]. Когда Adguard найдет на странице ссылку на "pelmeshki.com", вместо того, чтобы вырезать ее - он будет искать ближайший родительский элемент table, и, если найдет - вырежет его. Вы можете указать несколько искомых родительских элементов через запятую. Заблокирован будет ближайший.
parent-search-level - задает максимальную глубину поиска родительского элемента. По умолчанию максимальная глубина поиска равна 3. Это сделано для того, чтобы не вырезать лишнего, если HTML страницы поменяется. Не ставьте слишком большие значения для этого атрибута.
Категория: Статьи | Добавил: Bravo-zzz
Просмотров: 6176 | Загрузок: 0 | Комментарии: 3 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: