Помню давно, в детстве, при просмотре телевизора, во время рекламных блоков, всегда делался некий перерыв как школьная перемена, сходить на кухню или отхожее место, по переключать по другим каналам, с возрастом добавился перекур.
Сейчас телевизор смотрю редко, новости читаю в интернете, пользуюсь блокировщиками рекламы. По телефону когда звонят и пытаются навязать финансовые услуги или оконного мастера, кладу трубку. Иногда за редким исключением бывают интересные или веселые рекламные ролики, но даже такие ролики после второго просмотра превращаются в обычную рекламу.
Пару лет назад, заметил, что на всех новостных сайтах, можно сказать ни дня не проходило без новостей про блогеров: у таких-то блогеров конфликт или блогеры в госдуме. Блогер такой-то «какое-то новое имя» и как обычно ,«самый, самый» блогер из всех остальных блогеров. При этом, редко когда пишут критерии, почему он «самый, самый», чтобы читающий посмотрел ролики или поискал в интернете, что в очередном блогере «самого, самого». Блогеры вводят новое слово «зашквар», блогеры ополчились на того-то, блогеры делают своё шоу.
Последний год про блогеров новостей стало меньше, лидер нынче «Б… ва», специально не упоминаю, есть риск превратить статью в очередную новость про «Б… ву», и так каждый день новая новость. Журналисты, зачастую, игрой слов в заголовке буквально заставляют перейти по ссылке.
Написал бы еще несколько примеров, но не буду, так как описанное выше — не попытка с помощью критики других самому быть хорошим. С любыми вещами может быть перебор или overdose. Я, более чем уверен, что у всех есть свои «лидеры» в новостях, которых они предпочли бы не видеть, без них их день стал бы лучше.
Приведенные примеры по сути являются своеобразной рекламой, но распространяясь в виде новостей, не попадают под всякие блокировщики рекламы. Во многих браузерах есть встроенная блокировка рекламы, но к сожалению, там нет возможности блокировать контент по словам в содержании. Пробовал искать в расширениях, но с нужным описанием не нашел, попадались на глаза блокировщики рекламы, вроде бы так же умеющие блокировать по словам, но не стал пробовать ставить. Видел, недавно, несколько статей о том, что не все расширения безопасны, да и интереснее написать свое, простое, только с необходимой функцией выпиливания контента.
Статей по созданию расширений много, но эта статья не инструкция по созданию.
Первая версия расширения получилась буквально за пару часов, алгоритм выпиливания прост и универсален. Обратная сторона универсальности это то, что алгоритм может не подойти для всех сайтов. Но для видимости работы расширения пришлось написать еще много кода для отображения счетчиков, скрытого контента для каждой страницы.
Часть content_script.js – основная логика блокировки контента:
let search = document.evaluate('/html/body//*[contains(., "Б...в") and count(child::node())<childsLimit]', document.body, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
let thisHeading = search.iterateNext();
while (thisHeading) {
if (thisHeading.tagName !== 'script' && thisHeading.style.display != 'none') {
thisHeading.style.display = 'none';
}
thisHeading = search.iterateNext();
}
В приведенном фрагменте видно, что используется метод «document.evaluate». При поиске текста в тегах в результаты также попадают и корневые элементы. Например текст всей страницы, текст блока новостей и.т.д. Для исключения лишних элементов используется второе условие на количество вложенных child. В моем случае подошло число 9. На трех сайтах лишнее скрывается быстро и просто, правда иногда на одном из сайтов в определенном блоке остается фото, но без ссылки на новость и ссылки на картинке.
Было изначально желание, сделать также страницу настроек расширения, возможно позднее сделаю. А пока основные настройки делаются в прямо в коде.
Часть background.js – настройки блокировки контента:
let childsLimit = 9;
let blockString = '[contains(., "Б...в") and count(child::node())<childsLimit]';
let blockOnlyUrlOpt = false;
let urlOptions = [{url: 'https://exampleSite.com', unBlock: true, childsLimit: 4}];
Первая переменная «childsLimit» позволяет задать общий уровень вложенности, блокируемых элементов.
Вторая переменная «blockString» содержит условие xpath, при добавлении нового слова необходимо скопировать все вместе с квадратными скобками и добавить в конец со словом «or» и после заменить слово поиска в кавычках.
let blockString = '[contains(., "СловоБлокировки1") and count(.//*)<childsLimit] or [contains(., "СловоБлокировки2") and count(.//*)<childsLimit]';
Третья переменная «urlOptions» позволяет сделать тонкую настройку для разных сайтов.
Свойство «url» — содержит адрес для которого будет применена настройка.
Свойство «unBlock» — булево значение true позволяет не блокировать контент на указанном в «url» сайте
Свойство «childsLimit» уровень вложенности блокируемого элемента контента.
Четвертая переменная «blockOnlyUrlOpt» позволяет определить общую логику. Если значение «true» блокировка работает только на сайтах перечисленных в переменной массиве «urlOptions», где свойство «unBlock» равно «false».
Файлы расширения доступны по ссылке
Для установки необходимо:
- Скачать все файлы в любую удобную вам папку.
- В браузере перейти в расширения и включить режим разработчика.
- По кнопке «Загрузить распакованное расширение...» указать папку из пункта один.
Разрабатывал и тестировал в браузере Opera, также должно работать и других chromium браузерах.
Комментарии (5)
PloAl Автор
04.10.2018 23:50Упоминал в статье, пользуюсь встроенным adblock. Не скажу в adblock что все устраивает, настроек не так много.
Видел несколько статей о небезопасности расширений. Вот последняя https://habr.com/post/421735/. В какой то из них видел утверждение что самое безопасное свое.
В моем велосипеде нет привязки к конкретным тегам и классам, весь сто строк с лишним.dollar
05.10.2018 00:35Волков бояться — в лес не ходить. Можно просто скачать, посмотреть на наличие обфускации (и удалить сразу). Если её нет, то пробежаться глазами по коду. Всякие узкие места с точки зрения безопасности сразу бросаются в глаза, типа http, onreadystatechange, eval, script, innerHTML и т.д. Просто есть полно полезных расширений, для нормальной работы которых нужен доступ к продвинутым функциям. Зачем себя лишать достижений человечества?
100 строк это только по началу. Я тоже неделю назад сделал расширение для себя, там было 100 строк. Сейчас уже 1500.
nik210
05.10.2018 09:18Я использую расширение для файрфокса, greasemonkey, в котором написал скрипты под определенные развлекательные сайты, который скрывает почти все рекламные статьи по фильтру из слов и других вещей свойственных рекламным статьям
LevOrdabesov
05.10.2018 17:27
dollar
Пользуюсь лучшим на сегодняшний день uBlock Origin, а точнее его форком AdNauseam (который не только скрывает, но и кликает на рекламу).
Правило блокировки по тексту будет примерно таким:
example.com##div.news:has-text(/Б...в/)
Подробнее можно почитать документацию.