В интернете сломано много копий на тему "надо ли резать рекламу" или нет. Мое мнение, что рекламу резать не надо. Владельцам сайтов надо договариваться с посетителями, идти на компромисс, а посетителям просто не посещать ресурс, если его владелец их не уважает и все заполоняет рекламными баннерами. Но это не для этой темы спор, прошу обсуждать эту тему здесь:
https://olegon.ru/showthread.php?t=26854
Поскольку из-за дикого количества мусора в интернете многие по умолчанию включают баннерорезку, тем, кто хочет ее обойти, придется немного повозиться. Я не считаю себя программистом, поэтому если есть какие-то способы обойти AdBlock более прямые и правильные - прошу поделиться.
Виды блокировщиков рекламы
Для себя я выделяю из блокировщиков рекламы два вида, первый, самый распространенный - AdBlock, в который входят, собственно, сам AdBlock, AdBlock Plus, uBlock Origin и uBlock. Это семейство резаков. Они примечательны тем, что контент, который считают рекламой, тупо блокируют для загрузки и вырезают ошметки со страниц. Кстати, лучше всех и грамотнее в семействе этого вида работает uBlock Origin. Я, как правило, по нему и проверяю на специально отведенном браузере, где есть все популярные блокировщики рекламы. Второе семейство на данный момент включает в себя только AdGuard. Я не сильно углублялся в принципы его работы, но он меньше блокирует, зато больше правит страницу. За счет этого, видимо, более тормозной (у меня на слабой машинке скорость страниц падала раза в два) и реже детектируется. Можно еще рассмотреть какой-нибудь NoScript, но он малоинтересен, поскольку тупо блокирует выполнение скриптов и слишком малопригоден для посещения разных сайтов.
Варианты обнаружения AdBlock и других блокировщиков
Самый простой вариант: притворяемся рекламой, создаем внешний скрипт advert.js с единственной строкой
Код:
window.okab = false;
после чего на странице с рекламой сначала включаем этот скрипт в загружаемые
Код:
<script src="/advert.js"></script>
и далее проверяем, работал ли он
Код:
<script>
if (!('okab' in window)) {
что-то делаем
}
</script>
все сверхпросто. Большинство AdBlock-подобных блокировщиков очень не любят файл с таким именем и блокируют его загрузку, не интересуясь содержимым. Соответственно, переменная okab не появится. Данный способ плохо работает с AdGuard (в разных браузерах то ловится, то нет) и слишком легко обходится вручную терпеливыми и думающими пользователями.
Дальше идут более сложные варианты с определением наличия рекламного блока в принципе. Сначала я тупо смотрел на clientHeight рекламного <div> через 3 секунды, не стал разбираться, почему, но этот способ работает не всегда и со сбоями. Причем, что самое плохое, не то, чтобы не детектил блокировщик, а честным гражданам показывал, что они режут баннеры. Ну и нельзя забывать про то, что иногда баннеры могут не отображаться самой рекламной сетью.
Тут не обойдется без ручной работы. Я специально детализирую, чтобы вы могли собрать уникальное решение, а блокировщики рекламы замучились подбирать маски под каждый сайт. Итак, для начала смотрим все свойства окна простейшим скриптом.
Код:
<script>
setTimeout(function(){
for (var prop in window) {
if (window.hasOwnProperty(prop)) {
console.log(prop, window[prop]);
}
}
}, 1000);
</script>
этот скрипт выведет все свойства в JS console, которую можно увидеть, например, в Chrome, нажав Ctrl-Shift-J и переключившись на соответствующий раздел. Сравните содержимое с AdBlock и без. Например, в случае с Yandex RTB вырезается объект Ya. И простой скрипт (я не буду все в <script> заключать)
Код:
if (!window.hasOwnProperty("Ya")) alert("AdBlock detected!");
это выявит. Однако, тот же AdGuard этот объект не убивает. Зато, с ним появляются другие объекты, которых у нас на странице не было, что тоже ловится
Код:
if (window.hasOwnProperty("AG_removeElementById")) alert("AdGuard detected!!!");
Что делать с AdBlock и прочими блокировщиками рекламы
Прежде чем забивать страницы кодом, определитесь, что именно вы ставите целью. Если вы делитесь материалом (ненавижу слово контент), созданным лично вами, то можете его вообще не показывать, пока включен AdBlock. Другое дело, например, форум. Это сообщество, соответственно диктатура неуместна. Тут можно намекнуть небольшим сообщением, что хорошо бы отключить блокировщик, поскольку многие даже могут не догадываться, что на ресурсе баннеры. Это мое мнение, оно может не совпадать с вашим.
Итак, неправильный вариант, но дающий возможность через блокировщик рекламы вырезать и само уведомление-напоминание, что многие очень любят делать.
Код:
document.getElementById('okmenu').innerHTML="<div style=\"font-weight: bold;color:white;background-color:red;text-align:center;padding:5px;margin:2px\">Отключите, пожалуйста, блокировщик.</div>";
В том же AdBlock можно вырезать само сообщение. Другой вариант - добавлять текст к имеющемуся тексту или, как я один раз ошибся, вместо какого-то ключевого элемента. Суть в том, чтобы сообщение было видно, но не отделялось от нужного объекта, чтобы нельзя было вырезать все вместе. Это сделано на этом форуме в данный момент.
Еще один вариант - при загрузке страницы ее значимую часть выводите JS и при условии, что не обнаружен блокировщик рекламы. Этот вариант чреват проседанием в поисковых машинах, которые JS не смогут разобрать. Категорически отсоветую подгружать что-то снаружи через JS отдельно. Поисковые боты от этого вообще дуреют.
Варианты деструктивные в большей своей части лежат в циклах. Вы можете бабахнуть создание горы <div> с рекламой внутри, если обнаружен блокиратор и всей машине и браузеру юзера, скорее всего, поплохеет. При некоторой удаче расширение блокиратора упадет. В любом случае можно несинхронным скриптом задерживать отображение страницы на время, большее, чем отображение баннера и еще через setTimeout страницу дергать, мешая осуществлять по ней навигацию. Мне эти варианты не нравятся, но они могут зачем-то понадобиться вам.
Не так много времени, чтобы описать все в подробностях, если тема интересна - задавайте вопросы, давайте разберем какие-то примеры или устроим соревнование против вашего блокиратора рекламы.
P.S. Кстати, как правильно, блокировщики рекламы или блокираторы рекламы?