Форум OlegON > Компьютеры и Программное обеспечение > Сеть > Создание сайтов и поисковая оптимизация (SEO)

Как обнаружить AdBlock и попробовать его обойти : Создание сайтов и поисковая оптимизация (SEO)

29.03.2024 10:43


16.05.2017 18:01
OlegON
 
В интернете сломано много копий на тему "надо ли резать рекламу" или нет. Мое мнение, что рекламу резать не надо. Владельцам сайтов надо договариваться с посетителями, идти на компромисс, а посетителям просто не посещать ресурс, если его владелец их не уважает и все заполоняет рекламными баннерами. Но это не для этой темы спор, прошу обсуждать эту тему здесь: 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. Кстати, как правильно, блокировщики рекламы или блокираторы рекламы?
16.05.2017 20:41
OlegON
 
Вот, чтобы не терзать других форумчан борьбой, предлагаю желающим вырезать все, кроме нужного текста в тесте Анти-AdBlock. Если удастся - скажите, каким блокировщиком и как? :)
16.05.2017 21:49
twix
 
А что там должно происходить-то? Мне всегда говорит "выпилили объект я", "вы проиграли"... даже когда запускаю браузер без каких-либо резалок или расширений.
16.05.2017 21:52
OlegON
 
Цитата:
twix А что там должно происходить-то? Мне всегда говорит "выпилили объект я", "вы проиграли"... даже когда запускаю браузер без каких-либо резалок или расширений.
А баннер-то ты видишь? :) Там надпись и баннер. Если тебе по дороге кто-то баннер режет, я не виноват.
16.05.2017 22:06
twix
 
Цитата:
OlegON А баннер-то ты видишь? :) Там надпись и баннер. Если тебе по дороге кто-то баннер режет, я не виноват.
Вижу. А толку-то, если я проиграл, даже не поняв правил игры?
16.05.2017 22:33
OlegON
 
Правила простые, если видишь баннер, то видишь и только надпись, без сообщений. Надо настроить адблок так, чтобы ничего не вылазило и не было баннера (в т.ч. после Ctrl-F5). Но, видимо, для США баннер создается каким-то другим образом и объект Ya не создается.
Если честно, в тупик меня поставил. Убрал проверку Ya.
17.05.2017 11:28
OlegON
 
Заинтриговала тема, решил еще немного разобраться.
Да, если речь идет не о внешних баннерах, то просто измените немного размер картинки на нетиповой, уберите всякие ad в названии и он, скорее всего, отобразится. Меня больше всего интересовал сам метод обнаружения блокировщика и противодействия ему.

Ya не отображался, поскольку просто скорости инета не хватало. Бред полный, конечно, но пришлось его сдвинуть на несколько секунд. Если кто-то знает, как отловить окончание работы внешнего асинхронного скрипта - поделитесь, я пока такой способ не нашел, а поэтому поставить какой-то флажок на то, что скрипт работает или уже срезан не могу. Скрипт на Яндексе лежит, не мой.

У uBlock обнаружилась мерзкая особенность, он блокирует не только рекламу, но и переход по ней. Т.е. если даже пользователь и разрешил рекламу на домене, даже заинтересовался и кликнул на ней (что и создает доход по рекламе), то uBlock вылезет с предложением не ходить, причем, достаточно неоднозначным для того, чтобы переход дальше продолжить.

Еще одна интересная особенность блокировщиков в том, что при попытке пользователя что-то заблокировать на странице, блокировщик не стесняется внедрять в код страницы диалоговое окно iframe и div своих классов. Это, соответственно, тоже можно ловить, а можно просто выбрасывать. Делается это, например, так
Код:
function blockad(){
var i, frames;
frames = document.getElementsByTagName("iframe");
for (i = 0; i < frames.length; ++i){frames[i].remove();}
cosmet = document.getElementsByClassName("sg_border");
for (i = 0; i < cosmet.length; ++i){cosmet[i].remove();}
setTimeout(function(){blockad();},200);
}
соответственно, blockad(); надо вызвать один раз где-то в коде, обнаруживающем AdBlock.

Тестовую страницу выше немного проапгрейдил. Если есть еще идеи по противодействию блокировщикам рекламы - пишите :)
17.05.2017 16:01
twix
 
Выполнить в случае обнаружения блокировщика:

Код:
document.getElementsByTagName('body')[0].innerText = 'BLYAT';
17.05.2017 16:49
OlegON
 
:) можно по умолчанию сделать body.style.visibility="hidden", а скриптом делать body.style.visibility=""
Только это плохо отразится на поисковиках, которым нужен текст и которые не умеют JS.

Вариантов "как нагадить" очень много. Гораздо интереснее варианты, как вывести из строя само расширение AdBlock, например. Или как 100% его обнаруживать без возможности блокировки.
Часовой пояс GMT +3, время: 10:43.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.