среда, 27 декабря 2017 г.

Как убрать баннеры Яндекс Директ. Пишем расширение для Хрома сами



Не знаю, как ты, дорогой читатель, а я люблю читать текст. Привык вот с детства. И когда иду в интернет за сведениями – то получить хочу сведения. А не мигающие цветастые картинки с ипотекой, кизяками в брикетах и вещами, которые я уже купил. Последнее, кстати, особо смущает.
Я живу с ad-block'ами практически с момента их появления. Без них интернет вообще другой и похож на помойку (не пробуйте отключать адблоки дома!). Но
в последнее время реклама стала хитрее, а Ad-блокеры – что-то сильно потяжелели, да ещё и обзавелись белыми списками.
Особенно наглы, на мой вкус, яндекс директ и его детище яндекс дзен. Директ постоянно вас отслеживает, пролезает через обычные адблоки и плевал на все галки "не отслеживать". А с дзеном вообще особая песня: это всё тот же "шок! Заработала на врачах, которые вскрывали младенцев", только одобренный Яндексом. От спасибочки, не хватало вас.

Беглый поиск решения мне не дал. Так что поступим сурово и сделаем всё сами.

Посмотрим на директовские баннеры. За кнопку "X" спасибо, конечно. Но вообще я на кнопки тыкать и базу им пополнять не нанимался. А что по клику на кнопку? О! Пункт "мешает просмотру контента" ! Да они просто вынуждают меня сделать это.

Итак, пишем расширение для Google Chrome, которое будет блокировать баннеры Яндекс директа его же средствами.

Расширение для Хрома состоит из:
> Манифест. Файл manifest.json . Там относительно человеческим языком написано, о чём расширение и что ему нужно для работы;
> popup.html . Меню расширения, когда кликаем на иконку расширения в Хроме;
> background.js . Там собственно код, который мы хотим выполнять;
> 16x16.png . Иконочка. Без иконочки не заработает. Докатились, а.

Я взял матрёшечку.



Пардон, не та матрёшечка:


Это не полное и не точное описание структуры расширений Chrome. Но нам пока хватит. С этими данными мы уже можем сделать что-то рабочее!

Делаем манифест:

{
"manifest_version": 2,
"name": "Hide yandex banners",
"version": "0.1",
"icons": {
"16": "16x16.png"
},
//тут говорим, что расширение будет работать на всех страницах
"permissions": [
"tabs",
"<all_urls>"
],
"browser_action": {
"default_title": "Hide Yandex banners by sending annoying",
"default_icon": "16x16.png",
"default_popup" : "popup.html"
},
"content_scripts": [
    {
      //отдельные разрешения для работы скриптов. Делаем, чтобы работало на всех http и https страницах
  "matches": [ "https://*/*", "http://*/*" ],
  //Обрати внимание: подключаем библиотеку jQuery
  "js": [ "jquery.js", "background.js" ],
  "run_at": "document_end"
    }
]
}

JQuery берём тут
Ничего сложного.

Теперь собственно код в файле background.js. Будем писать на Javascript с примесью jQuery:

//Хитрые баннеры подгружаются как результат работы скриптов, так что нужна задержка
var loginTimer;

function doact(){

if (loginTimer) {

window.clearTimeout(loginTimer);
}

//ищем нашу ссылку, на которую будем кликать автоматом
var what = $('a:contains("Мешает просмотру контента")').text();
//если нашлось, то
if (what && what != ""){

//обходим все найденные строки
$('a:contains("Мешает просмотру контента")').each(function() {

//здесь получаем тег, окружающий нашу строку. Там <a> ссылка
var wha = $(this)[0].outerHTML;
//получаем класс, чтобы потом произвести по нему действие-клик. У хитрого яндекса класс рандомный, так что приходится искать руками
var clickid = $($.parseHTML(wha)).attr('class');
//кликаем
document.getElementsByClassName(clickid)[0].click();
});
}
//если не нашлось, ждём ещё секунду
else{

loginTimer = window.setTimeout(doact, 1000);
}

}

//добавляем обработчик события "страница загружена". После загрузки выполнится наш скрипт
window.addEventListener("load", doact() );

В popup.html можно написать что угодно, лишь бы было.

Ты будешь смеяться, но мы уже закончили.
Заходим в Расширения Chrome, включаем "режим разработчика", подключаем наше расширение и радуемся.

Код на Гитхабе 

(оно не то чтобы 100% рабочее – страницу нужно периодически перепроверять – но уже что-то)

А с дзеном будем разбираться в следующий раз. Там всё ещё проще.

P.S. Реклама определённо превращает интернет в помойку. Надеюсь и верю, что рекламу заменят клиенты распределённых вычислений или майнинга, распределённое хранение и прочие современные вещи. Если кто разрабатывает такие проекты – зовите!





4 комментария:

  1. Будет ли обновление для использования в новой версии Firefox?

    ОтветитьУдалить
    Ответы
    1. Обязательно!
      Собственно, часть с дзеном уже реализована и доступна в расширениях:
      https://automatize-it.blogspot.ru/2018/04/kak-ubrat-bannery-yandex-zen.html
      На очереди как раз директ.

      Удалить
  2. Кстати, перед Дзен появляется блок ТВ online и блок Фильмы, тоже выбешивают.

    ОтветитьУдалить
    Ответы
    1. Тогда уж совсем проще использовать ya.ru.
      Хотя, ради спорта, можно попробовать. У них там есть div c id "topnews", его потенциально можно забирать в iframe. Это если ради новостей. Всё, что ниже новостной строки и поиска, можно отрезать, обойдя div'ы в главном классе, начиная с class="Lw Lw__Ay", и задав им visibility: hidden !important; в style.
      Может, сделаю как-нибудь.

      Удалить