Не знаю, как ты, дорогой читатель, а я люблю читать текст. Привык вот с детства. И когда иду в интернет за сведениями – то получить хочу сведения. А не мигающие цветастые картинки с ипотекой, кизяками в брикетах и вещами, которые я уже купил. Последнее, кстати, особо смущает.
Я живу с 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"
}
]
}
Ничего сложного.
Теперь собственно код в файле 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() );
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. Реклама определённо превращает интернет в помойку. Надеюсь и верю, что рекламу заменят клиенты распределённых вычислений или майнинга, распределённое хранение и прочие современные вещи. Если кто разрабатывает такие проекты – зовите!
Будет ли обновление для использования в новой версии Firefox?
ОтветитьУдалитьОбязательно!
УдалитьСобственно, часть с дзеном уже реализована и доступна в расширениях:
https://automatize-it.blogspot.ru/2018/04/kak-ubrat-bannery-yandex-zen.html
На очереди как раз директ.
Кстати, перед Дзен появляется блок ТВ online и блок Фильмы, тоже выбешивают.
ОтветитьУдалитьТогда уж совсем проще использовать ya.ru.
УдалитьХотя, ради спорта, можно попробовать. У них там есть div c id "topnews", его потенциально можно забирать в iframe. Это если ради новостей. Всё, что ниже новостной строки и поиска, можно отрезать, обойдя div'ы в главном классе, начиная с class="Lw Lw__Ay", и задав им visibility: hidden !important; в style.
Может, сделаю как-нибудь.