// ==UserScript==
// @name Smart AD blocker for: Yandex, Mail.ru, Dzen.ru, VK, OK
// @name:ru Умный блокировщик рекламы для: Yandex, Mail.ru, Dzen.ru, VK, OK
// @namespace http://tampermonkey.net/
// @version 2024-11-14_20-12
// @description Smart AD blocker with dynamic blocking protection, for: Yandex, Mail.ru, Dzen.ru, VK, OK
// @description:ru Умный блокировщик рекламы при динамической защите от блокировки, для: Yandex, Mail.ru, Dzen.ru, VK, OK
// @author Igor Lebedev
// @license GPL-3.0-or-later
// @match http://*.mail.ru/*
// @match https://*.mail.ru/*
// @match https://sportmail.ru/*
// @match https://*.ya.ru/*
// @match https://*.yandex.ru/*
// @match https://*.dzen.ru/*
// @match https://*.ok.ru/*
// @match https://*.vk.com/*
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// ==/UserScript==
/* global GM_config */
(() => {
'use strict'
GM_config.init({
id: 'sc_config',
title: GM_info.script.name + ' Настройки',
fields: {
DEBUG_MODE: {
label: 'Debug mode',
type: 'checkbox',
default: false,
title: 'Log debug messages to the console'
},
MAILRU_ON: {
label: 'mail.ru',
type: 'checkbox',
default: true,
title: 'Включить для mail.ru'
},
SPORTMAILRU_ON: {
label: 'sportmail.ru',
type: 'checkbox',
default: true,
title: 'Включить для sportmail.ru'
},
YANDEX_ON: {
label: 'Яндекс',
type: 'checkbox',
default: true,
title: 'Включить для Яндекс (ya.ru и yandex.ru)'
},
DZEN_ON: {
label: 'Дзэн',
type: 'checkbox',
default: true,
title: 'Включить для Дзэн (dzen.ru)'
},
VK_ON: {
label: 'Вконтакте',
type: 'checkbox',
default: true,
title: 'Включить для Вконтакте (vk.com)'
},
OK_ON: {
label: 'Одноклассники',
type: 'checkbox',
default: true,
title: 'Включить для Одноклассники (ok.ru)'
},
},
events: {
init: onInit
}
})
GM_registerMenuCommand('Настройки', () => {
GM_config.open()
})
class Debugger {
constructor (name, enabled) {
this.debug = {}
if (!window.console) {
return () => { }
}
Object.getOwnPropertyNames(window.console).forEach(key => {
if (typeof window.console[key] === 'function') {
if (enabled) {
this.debug[key] = window.console[key].bind(window.console, name + ': ')
} else {
this.debug[key] = () => { }
}
}
})
return this.debug
}
}
var DEBUG
let MAILRU_ON = true, SPORTMAILRU_ON = true, YANDEX_ON = true, DZEN_ON = true, VK_ON = true, OK_ON = true
let FirstOpen = false
function onInit() {
DEBUG = new Debugger(GM_info.script.name, GM_config.get('DEBUG_MODE'))
MAILRU_ON = GM_config.get('MAILRU_ON')
SPORTMAILRU_ON = GM_config.get('SPORTMAILRU_ON')
YANDEX_ON = GM_config.get('YANDEX_ON')
DZEN_ON = GM_config.get('DZEN_ON')
VK_ON = GM_config.get('VK_ON')
OK_ON = GM_config.get('OK_ON')
// сюада надо бы поместить все функции, но пока под вопросом
if (!FirstOpen) {
FirstOpen = true
handleUrlChange()
}
}
// получаем текущий адрес страницы
let currentURL = window.location.href
const config = {
SettingsOnOff: true,
isRunningAsExtension: false,
nodes: {
mail_ru_email_GeneralBlock: 'div.application-mail__layout.application-mail__layout_main',
mail_ru_suggestions: 'div.themes-widget.themes-widget_full',
mail_ru_banner_top_parent: 'div[slot="main-column"]',
mail_ru_banner_top_parent_bannerClassList: ['span', 'article', 'p', 'section'], // все возможные типы нод, используемые в качестве контекнера рекламного баннера
ya_ru_banner_under_search: 'div.banner.i-mini-bem', // все возможные типы нод, используемые в качестве контекнера рекламного баннера
// ya_ru_search_suggestions: 'div.Modal.Modal_visible.Modal_hasAnimation.Distribution-SplashScreenModal.Distribution-SplashScreenModal_outerCross.SplashscreenDefault', // все возможные типы нод, используемые в качестве контекнера рекламного баннера
ya_ru_search_suggestions: 'div.Modal.Modal_visible.Modal_hasAnimation', // классы, используемые в качестве контекнера рекламного баннера
}
};
let intervalId
const observer_config = { childList: true, subtree: true } // общи конфиг обсервера
// Массив для хранения ссылок на обсерверы
const observers = []
// счётчики
let count_001 = 0, count_002 = 0
// Функция для обработки изменений URL
function handleUrlChange() {
// console.log('URL changed to:', window.location.href);
if (currentURL.startsWith('https://e.mail.ru/') && MAILRU_ON) {
// удаление верхнего рекламного блока
let fact_Remove_AD_Top_3column = false // факт удаления верхнего рекламного блока в интерфейсе с тремя столбцами где содержимое письма в 3-м столбце
function Remove_AD_Top(node) {
document.querySelectorAll('div.react-async').forEach(node2 => {node2?.remove()})
}
function Remove_AD_НадСпискомПисем () {
// Find the div with the class "ReactVirtualized__Grid__innerScrollContainer"
const container = document.querySelector('.ReactVirtualized__Grid__innerScrollContainer');
// Find all div elements with a style of "top: 0px;" inside the container
const targetDivs = Array.from(container.querySelectorAll('div')).filter(div => {
// return window.getComputedStyle(div).getPropertyValue('top') === '0px' && parseFloat(window.getComputedStyle(div).getPropertyValue('height')) > 0;
return window.getComputedStyle(div).getPropertyValue('top') === '0px' ;
});
// Get the first three elements from the targetDivs array
const firstThreeDivs = targetDivs.slice(0, 3);
// Set the display property to "none" for each of the first three target divs
firstThreeDivs.forEach(div => {
div.style.display = 'none';
});
}
// удаление правых рекламных блоков
function Remove_AD_Right(node) {
// Функция для проверки наличия CSS-свойства --right-column-width
const noads_button = document.querySelector('div.noads-button')
if(noads_button) {
noads_button.remove()
function hasRightColumnWidth(element) {
const style = window.getComputedStyle(element);
return style.getPropertyValue('--right-column-width') !== '';
}
// Получаем все элементы на странице
const allElements = document.querySelectorAll('*');
// Фильтруем элементы, у которых есть свойство --right-column-width
const elementsWithRightColumnWidth = Array.from(allElements).filter(hasRightColumnWidth);
// Переопределяем свойство --right-column-width на 0px для найденных элементов
elementsWithRightColumnWidth.forEach(element => {
element.style.setProperty('--right-column-width', '0px');
})
}
}
// // Функция для поиска и удаления всех элементов, имя класса которых содержит banner__content-wrapper
// function removeElementsByClassContaining(className) {
// const elements = document.querySelectorAll('a');
// elements.forEach(element => {
// if (element.classList.contains(className)) {
// element.remove();
// }
// });
// }
// установка наблюдения за изменением блока-родителя
const observer = new MutationObserver((mutationsList, observer) => {
let FactMutationChildList = false
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
FactMutationChildList = true
mutation.addedNodes.forEach(node => {
// Remove_AD_Top(node)
// Remove_AD_Right(node)
})
}
}
if (FactMutationChildList) {
Remove_AD_Top()
Remove_AD_НадСпискомПисем()
Remove_AD_Right()
}
})
observer.observe(document, observer_config) // удаление при изменении блока-родителя
observers.push(observer)
// удаление при загрузке
Remove_AD_Top()
Remove_AD_НадСпискомПисем ()
Remove_AD_Right()
function checkFor_GeneralBlock() {
const targetNode = document.querySelector(config.nodes.mail_ru_email_GeneralBlock) // 'div.application-mail__layout.application-mail__layout_main
if (targetNode) {
clearInterval(interval_GeneralBlock)
checkAndRemoveMailruSuggestions(null)
mail_ru_checkAndRemoveTopBlock()
// Настраиваем наблюдение за изменениями в документе
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.removedNodes.forEach(node => {
if (node.nodeType === Node.ELEMENT_NODE && node.matches('div.portal-menu-element.portal-menu-element_select.portal-menu-element_expanded.portal-menu-element_not-touch.portal-menu-element_pony-mode')) {
}
});
mutation.addedNodes.forEach(node => {
if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'A') {
checkAndRemoveMailruSuggestions(mutation)
mail_ru_checkAndRemoveTopBlock()
}
});
}
}
});
observer.observe(targetNode, observer_config);
observers.push(observer)
}
}
// Функция для проверки наличия и удаления блока рекламного банера Майлру в нижнем левом углу
function checkAndRemoveMailruSuggestions(mutation) {
const targetNode = document.querySelector(config.nodes.mail_ru_suggestions)
if (targetNode) {
// clearInterval(interval_MailruSuggestions); // Останавливаем интервал, так как элемент уже найден
targetNode.remove()
}
}
const interval_GeneralBlock = setInterval(checkFor_GeneralBlock, 200)
}
// почта на мобильном устройстве
else if (currentURL.startsWith('https://touch.mail.ru/messages/') && MAILRU_ON) {
// верхний узкий баннер
document.querySelector('div.mailru-visibility-check')?.parentNode?.remove()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
document.querySelector('div.mailru-visibility-check')?.parentNode?.remove()
}
})
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
}
else if (currentURL.startsWith('https://cloud.mail.ru/attaches/') && MAILRU_ON) {
// нижний узкий баннер
document.querySelector('div[class^="ReactViewer__attachesinfo"]')?.remove()
// правая панель
document.querySelector('div[class^="ReactViewer__attachesSidebar"]')?.remove()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
// нижний узкий баннер
document.querySelector('div[class^="ReactViewer__attachesinfo"]')?.remove()
// правая панель
document.querySelector('div[class^="ReactViewer__attachesSidebar"]')?.remove()
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
}
// else if (currentURL.startsWith('https://auto.mail.ru/forum/topic/')) {
// else if (currentURL.startsWith('https://auto.mail.ru/forum/')) {
else if (currentURL.startsWith('https://auto.mail.ru/') && MAILRU_ON) {
// удаление всей рекламы, но не очень аккуратно
// Функция для проверки, что элемент имеет только один класс
function hasSingleClass(element, className) {
return element.classList.length === 1 && element.classList.contains(className);
}
// Функция для поиска и удаления всех подходящих div элементов
function removeDivsWithSingleClassAndId() {
const divs = document.querySelectorAll('div');
divs.forEach(div => {
if (hasSingleClass(div, 'mailru-visibility-check') && div.id.startsWith('mailru')) {
div.remove();
}
});
}
// Вызов функции для удаления div элементов
removeDivsWithSingleClassAndId();
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
removeDivsWithSingleClassAndId();
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
}
else if ((currentURL.startsWith('https://cloud.mail.ru/home/') || currentURL.startsWith('https://doc.mail.ru/')) && MAILRU_ON) {
// верхний узкий баннер
document.querySelector('div[class^="Worm__root--"]')?.remove()
}
else if ((currentURL.startsWith('https://sportmail.ru/') && SPORTMAILRU_ON) ||
((currentURL.startsWith('https://news.mail.ru/') ||
currentURL.startsWith('https://vfokuse.mail.ru/') ||
currentURL.startsWith('https://finance.mail.ru/')
) && MAILRU_ON
)) {
// нижний узкий баннер
function AD_remove_node(node_test, mutation_test) {
if (currentURL.startsWith('https://finance.mail.ru/')) {
// поиск блока с рекламой, занимающего верхнее пространство страницы
function findParentWithProperties(targetNode) {
function checkParent(node, level) {
if (level > 4) {
return null;
}
const parent = node.parentElement;
if (!parent) {
return null;
}
const style = parent.style.minHeight;
const dataHideOrder = parent.getAttribute('data-hideorder');
const dataSize = parent.getAttribute('data-size');
if (style && dataHideOrder !== null && dataSize !== null) {
return parent;
}
return checkParent(parent, level + 1);
}
return checkParent(targetNode, 1);
}
const targetNode = document.querySelector('div.mailru-visibility-check')
if (targetNode) {
const parentWithProperties = findParentWithProperties(targetNode);
if (parentWithProperties) {
parentWithProperties.remove()
} else {
targetNode.remove()
}
}
}
else {
document.querySelector('div.mailru-visibility-check')?.remove()
}
}
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
AD_remove_node()
}
else if (currentURL.startsWith('https://mail.ru/') && MAILRU_ON) {
mail_ru_checkAndRemoveTopBlock()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
// console.log('Новые узлы добавлены:', mutation.addedNodes);
// для всех возможных типов нод-контейнеров баннера
config.nodes.mail_ru_banner_top_parent_bannerClassList.forEach(item => {
// mail_ru_checkAndRemoveTopBlock()
mutation.addedNodes.forEach(node => {
if (node.nodeName === item.toUpperCase()) {
// mail_ru_checkAndRemoveTopBlock_classList(node,mutation)
}
// признак добавления верхнего рекламного блока
if (node.nodeType === 1 && node.tagName === 'DIV' && parseInt(getComputedStyle(node).height) === 90) {
mail_ru_checkAndRemoveTopBlock()
}
});
});
// document.querySelectorAll('article.zenad-card-rtb').forEach(node => {
// document.querySelectorAll('article.zenad-card-rtb[data-testid="card-rtb"]').forEach(node => {
document.querySelectorAll('article.zenad-card-rtb[aria-label="Карточка рекламы"]').forEach((node, index, array) => {
// if (index > 0 && index < array.length - 1 ) {
// node?.remove()
node.style.display = 'none'
// }
// Если удалить сразу все ноды - возникают глюки. Удаляем первые ноды, оставляя последующие невидимыми
if (array.length > 10 && index < 5) {
node?.remove()
}
})
}
}
});
observer.observe(document.querySelector(config.nodes.mail_ru_banner_top_parent), observer_config)
observers.push(observer)
// }
// }
// const interval_AD_remove = setInterval(AD_remove, 500)
}
else if ((currentURL.startsWith('https://ya.ru/search') || currentURL.startsWith('https://yandex.ru/search')) && YANDEX_ON) {
function AD_remove_node(node, mutation_test) {
// баннер внизу справа "Сделать Яндекс основным поисковиком?"
let targetNode
targetNode = document.querySelector(config.nodes.ya_ru_search_suggestions) // 'div.Modal.Modal_visible.Modal_hasAnimation.Distribution-SplashScreenModal.Distribution-SplashScreenModal_outerCross.SplashscreenDefault'
targetNode?.remove()
targetNode = document.querySelector('div.Distribution-Popup')
targetNode?.remove()
// вверху слева кнопка "Установите Яндекс Браузер"
targetNode = document.querySelector('div.DistrNav') || document.querySelector('div.HeaderDesktopActions-Distribution')
targetNode?.remove()
}
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
AD_remove_node()
}
// настроить обсервер
else if ((currentURL.startsWith('https://ya.ru/images/') || currentURL.startsWith('https://yandex.ru/images/')) && YANDEX_ON) {
// Добавление кнопки "Реклама"
// const EspeciallyForYou = CreateEspeciallyForYou()
// let EspeciallyForYou_fact = false
const AdvDetails = {
Details: CreateEspeciallyForYou(),
Details_fact: false,
countBanners: 0,
}
let ADRight_fact = false // факт вывода рекоамного блока справа внутри "Реклама"
// блок справа
function AD_remove_node(node, mutation_test) {
let targetNode
let targetNodes
// баннер "Сделать поиск Яндекса основным?"
targetNode = document.querySelector(config.nodes.ya_ru_search_suggestions) || document.querySelector('div#distr-pcode-container') // 'div.Modal.Modal_visible.Modal_hasAnimation.Distribution-SplashScreenModal.Distribution-SplashScreenModal_outerCross.SplashscreenDefault'
// Modal Modal_visible Modal_hasAnimation Distribution-SplashScreenModal SplashscreenTopButton SplashscreenTopButton_layout_system_top_dark_close-button
if (targetNode) {
// if (EspeciallyForYou_fact === false) {
if (AdvDetails.Details_fact === false) {
targetNode.style.marginTop = '0.3rem'
// EspeciallyForYou?.appendChild(targetNode)
AdvDetails.Details.appendChild(targetNode)
AdvDetails.countBanners++
}
else {
targetNode?.remove()
}
}
// баннер справа
targetNode = document.querySelector('div.ImagesViewer-SidebarAdv')
targetNode?.parentNode.remove()
targetNode = document.querySelector('div#ImagesViewer-SidebarAdv')
targetNode?.parentNode.parentNode.parentNode.remove()
// баннер вверху
targetNode = document.querySelector('div.AdvMastHead')
targetNode?.remove()
// реклама среди картинок
document.querySelectorAll('div.JustifierRowLayout-Incut').forEach(node => {node?.remove()})
document.querySelectorAll('div.AdvRsyaCrossPage').forEach(node => {node?.remove()})
document.querySelectorAll('div[aria-label="Рекламный баннер"]').forEach(node => {node?.remove()})
// if (node) observer.disconnect()
// при нажатии на какую-либо картинку открывается модальное окно
const targetNodeModal = document.querySelector('div.Modal.Modal_visible.Modal_theme_normal.ImagesViewer-Modal.ImagesViewer')
if (targetNodeModal) {
// в модальном окне удаление рекламы справа
targetNodes = targetNodeModal.querySelectorAll('div[id^="ImagesViewer-"]')
targetNodes.forEach(node => {
// Поиск главного родительского блока, содержащего рекламу
const node_parentNode = findParentWithClassEndingInCard(node)
if (!ADRight_fact) {
node.style.marginTop = '0.3rem'
// EspeciallyForYou?.appendChild(node)
AdvDetails.Details.appendChild(node)
AdvDetails.countBanners++
ADRight_fact = true
}
node_parentNode?.remove()
});
// добавление "Реклама" под блок-ссылку на источник изображения
if (AdvDetails.countBanners > 0) {
// if (EspeciallyForYou_fact === false) {
if (AdvDetails.Details_fact === false) {
const div_imageSource = targetNodeModal.querySelector('div.ImagesViewer-LayoutSideblock')
if (div_imageSource) {
// EspeciallyForYou.querySelector('summary').textContent += ' (' + AdvDetails.countBanners + ')'
// div_imageSource.appendChild(EspeciallyForYou)
// AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ` (${AdvDetails.countBanners})`
div_imageSource.appendChild(AdvDetails.Details)
// EspeciallyForYou_fact = true
AdvDetails.Details_fact = true
}
}
}
// Поиск главного родительского блока, содержащего рекламу
function findParentWithClassEndingInCard(node) {
let currentNode = node
// Проверяем каждого родителя, пока не найдем нужный элемент или не дойдем до корня документа
while (currentNode && currentNode !== document.body) {
// Проверяем, есть ли у текущего элемента класс, оканчивающийся на "-Card"
if (currentNode.classList && Array.from(currentNode.classList).some(className => className.endsWith('-Card'))) {
return currentNode;
}
// Переходим к следующему родителю
currentNode = currentNode.parentNode
}
// Если нужный элемент не найден, возвращаем null
return null;
}
}
// else {
// // сброс флага вывода блока "Реклама" при закрытии модального окна
// EspeciallyForYou_fact = false
// }
}
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
// if (node.nodeName === 'DIV') {
if (node.className !== 'details_EspeciallyForYou') {
AD_remove_node(node, mutation)
}
});
mutation.removedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
const targetNodeModal = document.querySelector('div.Modal.Modal_visible.Modal_theme_normal.ImagesViewer-Modal.ImagesViewer')
// модальное окно изображения было закрыто или ещё не открылось
if (!targetNodeModal) {
// EspeciallyForYou_fact = false
AdvDetails.Details_fact = false
ADRight_fact = false
// Очистка <details>
// Выбираем все дочерние элементы <details>, кроме <summary>
// const childNodes = EspeciallyForYou.querySelectorAll('details > *:not(summary)')
const childNodes = AdvDetails.Details.querySelectorAll('details > *:not(summary)')
// Удаляем каждый из выбранных элементов
childNodes.forEach(node => {
// EspeciallyForYou.removeChild(node)
AdvDetails.Details.removeChild(node)
});
// AdvDetails.countBanners = 0
AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама')
}
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
AD_remove_node()
}
// настроить обсервер
// сделать пропуск видеозаставки
else if (currentURL.startsWith('https://ya.ru/video/') && YANDEX_ON) {
// баннер сверху
function AD_remove_node(node, mutation_test) {
const targetNodes = document.querySelectorAll('div[role="button"]')
targetNodes?.forEach(node => {
node.remove()
});
}
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
const targetNodes = document.querySelectorAll('div[role="button"]')
targetNodes?.forEach(node => {
node.remove()
});
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
AD_remove_node()
yandex_dzen_questionYandexGeneralSearch()
}
else if (currentURL.startsWith('https://ya.ru/') && YANDEX_ON) {
// если это мбильное устройство
if (isMobileDevice()) {
document.querySelector('div.dialog__wrapper')?.remove()
}
else {
// Добавление кнопки "Реклама"
// const EspeciallyForYou = CreateEspeciallyForYou()
const AdvDetails = {
Details: CreateEspeciallyForYou(),
Details_fact: false,
countBanners: 0,
}
// const EspeciallyForYou_Content = EspeciallyForYou.querySelector('div.shimmer')
// simple-popup dist-overlay__popup simple-popup_direction_center simple-popup_theme_modal simple-popup_autoclosable_yes simple-popup_overlay_yes simple-popup_has-close_yes simple-popup_delay-close_yes simple-popup_overlay-color_default simple-popup_shown_true simple-popup_delay-close-shown_yes
// simple-popup__content
// Удаление без наблюдения
// перенос всей рекламы в специальный фрейм "Специально для Вас..."
// const headline__personal = document.querySelector('div.headline__personal')
let targetNode
// курсы валют и нефти (сделать опциональным)
targetNode = document.querySelector('section.informers3__stocks')
// targetNode?.remove()
if (targetNode) {
targetNode.style.marginTop = '0.3rem'
// EspeciallyForYou?.appendChild(targetNode)
AdvDetails.Details.appendChild(targetNode)
AdvDetails.countBanners++
}
targetNode = document.querySelector(config.nodes.ya_ru_banner_under_search)
// targetNode?.remove()
if (targetNode) {
AdvDetails.Details?.appendChild(targetNode)
AdvDetails.countBanners++
}
// модальное окно посредине в начале "Сделайте Яндекс главной страницей"
targetNode = document.querySelector('div.simple-popup') ||
document.querySelector('div.dist-overlay__popup') ||
document.querySelector('div.simple-popup_direction_center') ||
document.querySelector('div.simple-popup_theme_modal') ||
document.querySelector('div.simple-popup_autoclosable_yes') ||
document.querySelector('div.simple-popup_overlay_yes') ||
document.querySelector('div.simple-popup_has-close_yes') ||
document.querySelector('div.simple-popup_delay-close_yes') ||
document.querySelector('div.simple-popup_overlay-color_default') ||
document.querySelector('div.simple-popup_shown_true') ||
document.querySelector('div.simple-popup_delay-close-shown_yes')
if (targetNode) {
targetNode.style.marginTop = '0.3rem'
AdvDetails.Details.appendChild(targetNode)
AdvDetails.countBanners++
targetNode.remove()
}
const dist_stripe = document.querySelector("div.dist-stripe")
// dist_stripe?.parentNode.remove()
if (targetNode) {
AdvDetails.Details.appendChild(targetNode)
AdvDetails.countBanners++
}
const mainElement = document.querySelector('main.body__wrapper');
if (mainElement) {
const targetNode = mainElement.querySelector('div[data-hydration-id] > div.dist-stripe');
if (targetNode) {
AdvDetails.Details.appendChild(targetNode.parentNode)
AdvDetails.countBanners++
}
}
// Добавление EspeciallyForYou под блок поля поиска
if (AdvDetails.countBanners > 0) {
const ForEspeciallyForYou_Container = document.querySelector('div.body__content')
if (ForEspeciallyForYou_Container && AdvDetails.Details.parentNode !== ForEspeciallyForYou_Container) {
AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
ForEspeciallyForYou_Container.appendChild(AdvDetails.Details)
}
}
// Удаление с наблюдением
function AD_remove_node(node, mutation_test) {
// Кнопка "Установить Яндекс.браузер"
let targetNode = document.querySelector('div.link-bro')
if (targetNode && targetNode.parentNode !== AdvDetails.Details) {
if (AdvDetails.Details.querySelector('div.link-bro')) {
targetNode?.remove()
// AdvDetails.countBanners--
}
else {
targetNode.style.position = 'unset'
targetNode.style.marginTop = '0.3rem'
const targetNodeA = targetNode.querySelector('a')
if (targetNodeA) targetNodeA.style.marginBottom = 0
AdvDetails.Details.appendChild(targetNode)
AdvDetails.countBanners++
AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
}
}
// модальное окно посредине в начале "Сделайте Яндекс главной страницей"
targetNode = document.querySelector('div.simple-popup') ||
document.querySelector('div.dist-overlay__popup') ||
document.querySelector('div.simple-popup_direction_center') ||
document.querySelector('div.simple-popup_theme_modal') ||
document.querySelector('div.simple-popup_autoclosable_yes') ||
document.querySelector('div.simple-popup_overlay_yes') ||
document.querySelector('div.simple-popup_has-close_yes') ||
document.querySelector('div.simple-popup_delay-close_yes') ||
document.querySelector('div.simple-popup_overlay-color_default') ||
document.querySelector('div.simple-popup_shown_true') ||
document.querySelector('div.simple-popup_delay-close-shown_yes')
if (targetNode) {
targetNode.style.marginTop = '0.3rem'
AdvDetails.Details.appendChild(targetNode)
AdvDetails.countBanners++
AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
}
}
function AD_remove() {
const targetNode = document.querySelector('div.search3__inner') // более точный блок для наблюдения изменений
if (targetNode) {
clearInterval(interval_AD_remove)
AD_remove_node()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(targetNode, observer_config)
observers.push(observer)
}
}
AD_remove()
const interval_AD_remove = setInterval(AD_remove, 500)
}
}
// каталог игр
else if (currentURL.startsWith('https://yandex.ru/games/') && !currentURL.startsWith('https://yandex.ru/games/app/') && YANDEX_ON) {
// реклама в каталоге игр
function AD_remove_node(node, mutation_test) {
const nodeDiv = node.querySelector('div')
// Проверяем, является ли элемент div и не содержит ли он указанные классы
if (nodeDiv &&
!nodeDiv.classList.contains('feed_block_suggested') &&
!nodeDiv.classList.contains('feed_block_categorized')) {
node.remove()
}
}
function AD_remove() {
const targetNodes = document.querySelectorAll('div.page__page.main-page > div#feeds > div.adaptive-width')
targetNodes?.forEach(node => {
AD_remove_node(node)
});
document.querySelectorAll('div[data-testid="feed-grid-banner"]')?.forEach(node => {
node.remove()
});
}
const interval_AD_remove = setInterval(AD_remove, 500);
const observer = new MutationObserver((mutationsList, observer) => {
clearInterval(interval_AD_remove) // отключение проверки по интервалу
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
if (node.className === 'adaptive-width') {
AD_remove_node(node, mutation)
}
}
else if (node.nodeName === 'LI' && node.matches('li.grid-list__game-item_adv')) {
// document.querySelectorAll('div[data-testid="feed-grid-banner"]')?.forEach(node => {
// node.remove()
// });
node.remove()
}
});
}
}
});
// observer.observe(document.querySelector('div.page__right'), observer_config)
observer.observe(document.body, observer_config)
observers.push(observer)
}
// на странице игры
else if (currentURL.startsWith('https://yandex.ru/games/app/') && YANDEX_ON) {
// центральный баннер
const interval_AD_center_remove = setInterval(AD_center_remove, 1000);
// правый блок рекламы
// const interval_RiggtBlock_remove = setInterval(RiggtBlock_remove, 1000);
// кнопка "Отключить рекламу"
const targetStackDivs = document.querySelectorAll('div.stack > div')
targetStackDivs?.forEach(node => {
// Проверяем, заканчивается ли класс на __desktop-disable-ad-button-wrapper
node.classList.forEach(className => {
if (className.endsWith('__desktop-disable-ad-button-wrapper')) {
node.parentNode.remove();
}
});
});
// правый блок рекламы
const targetNode_RiggtBlock = document.querySelector('div[class*="desktop-wrapper"]')
if (targetNode_RiggtBlock)
targetNode_RiggtBlock.style.display = 'none'
// нижний ряд других игр
document.querySelector('div.play-similar-games > span.close-button')?.click()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
// правый блок рекламы
if (node.matches('div[class*="desktop-wrapper"]')) {
node.style.display = 'none'
}
// нижний ряд других игр
else if (node.matches('div.play-similar-games')) {
node.querySelector('div.play-similar-games__all-games-tile > span.close-button')?.click() // программное закрытие на крестик
node?.remove() // контроль
}
// центральный баннер
else if (node.matches('div.play-modal_with-blur')) {
node.parentNode.style.display = 'none'
// node?.remove() // контроль
}
}
});
}
}
});
observer.observe(document.getElementById('mount'), observer_config)
observers.push(observer)
// центральный баннер
function AD_center_remove() {
const targetNodes = document.querySelectorAll('div.play-modal_with-blur')
if (targetNodes.length > 0) {
clearInterval(interval_AD_center_remove)
targetNodes.forEach(node => {
// Проверяем, является ли элемент div и не содержит ли он указанные классы
// node.parentNode.remove()
node.parentNode.style.display = 'none'
// node.querySelector('span.Icon')?.click()
});
}
// const targetNode = document.querySelector('div.prowo-container_with-blur > div.prowo__wrapper > div.prowo > span.Icon.Icon_size_m.close-button') || document.querySelector('div.play-modal__inner > div > span.Icon.Icon_size_m.close-button')
// if (targetNode) {
// // clearInterval(interval_AD_center_remove)
// targetNode.click()
// }
}
// правый блок рекламы
// function RiggtBlock_remove() {
// // const targetNode_RiggtBlock = document.querySelector('div.stack > div')
// const targetNode_RiggtBlock = document.querySelector('div[class*="desktop-wrapper"]');
// if (targetNode_RiggtBlock) {
// clearInterval(interval_RiggtBlock_remove)
// // targetNode_RiggtBlock.remove()
// targetNode_RiggtBlock.style.display = 'none'
// }
// }
}
// почтовый ящик
else if (currentURL.startsWith('https://mail.yandex.ru/') && YANDEX_ON) {
// реклама внизу слева
function AD_remove_node(node, mutation_test) {
// Проверяем, не содержит ли node он указанные классы
if (!node.classList.contains('ns-view-react-left-column') &&
!node.classList.contains('ns-view-fill-height-placeholder-box') &&
!node.classList.contains('ns-view-skin-saver-box') &&
!node.classList.contains('ns-view-copyright-box')) {
node.remove()
}
}
function AD_remove() {
const targetNode = document.querySelector('div.ns-view-left-box.mail-Layout-Aside-Inner-Box.js-layout-aside-inner-box[data-key="box=left-box"]')
if (targetNode) {
clearInterval(interval_AD_remove)
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
// console.log('Новые узлы добавлены:', mutation.addedNodes);
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV' &&
node.parentNode === targetNode) {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(targetNode, observer_config)
observers.push(observer)
const targetNodes = targetNode.querySelectorAll('div')
targetNodes?.forEach(node => {
AD_remove_node(node)
});
}
}
const interval_AD_remove = setInterval(AD_remove, 500);
}
// почтовый ящик
else if (currentURL.startsWith('https://yandex.ru/maps/') && YANDEX_ON) {
// реклама справа
function AD_remove_first() {
// реклама справа
const RightBlockFromImages = document.querySelector('div[data-chunk="promo"]')
if (RightBlockFromImages) RightBlockFromImages.parentNode.parentNode.parentNode.remove()
// реклама слева
const LeftBlock = document.querySelector('div.banner-view')
if (LeftBlock) LeftBlock.parentNode.parentNode.parentNode.remove()
// маленькая рекламная кнопка сверху
const TopBlock = document.querySelector('div.map-controls__additional-button')
if (TopBlock) TopBlock.parentNode.remove()
const LeftBlockFromPlaces = document.querySelector('div.banner-view')
if (LeftBlockFromPlaces) LeftBlockFromPlaces.parentNode.remove()
}
// требует донастройки
function AD_remove() {
// const targetNode = document.querySelector('div._has-banner') // более глобальный блок
const targetNode = document.querySelector('div.banner-view') // более точный блок
if (targetNode) {
clearInterval(interval_AD_remove)
AD_remove_first()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_first()
}
});
}
}
});
observer.observe(targetNode, observer_config)
observers.push(observer)
}
}
const interval_AD_remove = setInterval(AD_remove, 500);
}
// https://yandex.ru/health
// брать за образец в случае рекламы внутри наблюдаемой ноды
else if (currentURL.startsWith('https://yandex.ru/health') && YANDEX_ON) {
function AD_remove_node(node, mutation_test) {
let targetNode
let targetNodes
// баннер сверху
// реклама по всем направлениям
targetNodes = document.querySelectorAll('div.advert_type_horizontal')
targetNodes.forEach(node => {
node.remove()
})
targetNodes = document.querySelectorAll('span.advert_type_horizontal')
targetNodes.forEach(node => {
node.remove()
})
// правый стобец
targetNode = document.querySelector('div.row__col.layout__right')
targetNode?.remove()
}
// Удаление с наблюдением
function AD_remove() {
AD_remove_node()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
}
AD_remove()
}
// Яндекс.погода: карта
else if (currentURL.startsWith('https://dzen.ru/pogoda/maps/') && DZEN_ON) {
// внизу справа "Сделать поиск Яндекса основным?"
yandex_dzen_questionYandexGeneralSearch()
// реклама слева
const targetNode_leftColumn = document.querySelector('div.weather-maps__ad.weather-maps__ad_visible_yes.map-left-pane__ad')
if (targetNode_leftColumn) {
targetNode_leftColumn.remove()
}
}
// Яндекс.погода: сводка
else if ((currentURL.startsWith('https://dzen.ru/pogoda/?via=hl') || currentURL.startsWith('https://dzen.ru/pogoda/details') || currentURL.startsWith('https://dzen.ru/pogoda/?')) && DZEN_ON) {
// реклама справа
const targetNode_rightColumn = document.querySelector('div#content_right.content__right')
if (targetNode_rightColumn) {
targetNode_rightColumn.remove()
}
// реклама в теле страницы
// первый блок
const DivsTopAD = document.querySelector('div.adv_pos_index-details_top');
if (DivsTopAD) {
DivsTopAD.parentNode.remove()
}
// последующие блоки
// Выбираем все div
const allDivs = document.querySelectorAll('article.card.card_without-card-decoration');
allDivs.forEach(div => {
div.remove();
});
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
// console.log('Новые узлы добавлены:', mutation.addedNodes);
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'STYLE') {
const allDivs = document.querySelectorAll('article.card.card_without-card-decoration');
allDivs.forEach(div => {
div.remove();
});
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
yandex_dzen_questionYandexGeneralSearch()
}
// Яндекс.погода: на месяц
else if (currentURL.startsWith('https://dzen.ru/pogoda/month') && DZEN_ON) {
// реклама справа страницы
let targetNode_rightColumn
targetNode_rightColumn = document.querySelector('section.content__section.content__section_type_adv')
if (targetNode_rightColumn) {
targetNode_rightColumn.remove()
}
targetNode_rightColumn = document.querySelector('div.climate-calendar-container__adv-wide')
if (targetNode_rightColumn) {
targetNode_rightColumn.remove()
}
}
// Дзен.Статьи
// брать за образец в случае рекламы внутри наблюдаемой ноды
else if (currentURL.startsWith('https://dzen.ru/a/') && DZEN_ON) {
let targetNode_observer
function AD_remove_node(node, mutation_test) {
// верхний баннер
targetNode_observer.querySelector('div#top-banner')?.remove()
const targetNodes = targetNode_observer.querySelectorAll('aside:not(.navigation-sidebar__container-TO)') ||
targetNode_observer.querySelectorAll('ya-recommendation-widget')
targetNodes.forEach(node => {
node?.remove()
})
// рекламные блоки справа
// 'div.article-right-ad-block__sticky' 'div.article-right-ad-block__main' 'div.article-right-ad-block__ad-content-wrapper'
targetNode_observer.querySelectorAll('div[class^="article-right-ad-block__"]').forEach(node => {
node?.remove()
})
// рекламные блоки снизу статьи
if (node) {
targetNode_observer.querySelectorAll('div[class^="ad-split-embed"][id]').forEach(node => {
// ad-split-embed__container
node?.remove()
})
}
}
function AD_remove() {
targetNode_observer = document.querySelector('div#page-root') // более точный блок для наблюдения изменений
if (targetNode_observer) {
clearInterval(interval_AD_remove)
AD_remove_node()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(targetNode_observer, observer_config)
observers.push(observer)
}
}
const interval_AD_remove = setInterval(AD_remove, 500)
}
// Дзен.Видео
// брать за образец в случае рекламы внутри наблюдаемой ноды
else if (currentURL.startsWith('https://dzen.ru/video/') && DZEN_ON) {
function AD_remove_node(node, mutation_test) {
// document.querySelectorAll('div[class^="video-card-ad"]').forEach(node => {
document.querySelectorAll('div.video-card-ads').forEach(node => {
node?.remove()
})
}
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
AD_remove_node()
// Удаление видеорекламы
if (currentURL.startsWith('https://dzen.ru/video/watch/')) {
function ADvideo_remove() {
// Находим ноду <yaplayertag>
const yaplayertag = document.querySelector('yaplayertag')
if (yaplayertag) {
// Проверяем непосредственные потомки yaplayertag
const children = yaplayertag.children
if (children.length > 2) { // дочерние элементы заполняются на странице не сразу - ждём заполнения
clearInterval(interval_ADvideo_remove)
// Создаем массив для хранения div, которые нужно удалить
const divsToRemove = [];
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.tagName === 'DIV' && !child.querySelector('video')) {
divsToRemove.push(child);
}
}
// Удаляем все найденные div
divsToRemove.forEach(div => yaplayertag.removeChild(div))
}
}
}
const interval_ADvideo_remove = setInterval(ADvideo_remove, 500)
}
}
// Дзен.Shorts
// брать за образец в случае рекламы внутри наблюдаемой ноды
else if (currentURL.startsWith('https://dzen.ru/shorts/') && DZEN_ON) {
function AD_remove_node(node, mutation_test) {
// банерок вверху справа
// возможно, для более точноо поиска: auto-slide-ad__ ; более общий правый блок: short-viewer-layout__
if (!node) { // первый вызов без обсервера
// document.querySelectorAll('div[class^="short-viewer-layout__rightSidebarWrapper"]').forEach(node => {
// node?.remove()
// })
// возникает в единственном экземпляре
document.querySelector('div[class^="short-viewer-layout__rightSidebarWrapper"]')?.remove()
}
else { // вызов из обсервера
if (node.tagName === 'DIV') {
const classList = node.classList;
// for (let i = 0; i < classList.length; i++) {
// if (classList[i].startsWith('short-viewer-layout__rightSidebarWrapper')) {
// node?.remove()
// break
// }
// }
if (classList.contains('auto-slide-ad__container-1D')) {
node?.remove()
return true
}
}
}
// предложение скачат приложение по QR-коду
document.querySelector('div.Modal')?.remove()
return false
}
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
// при срабатывании удаления рекламы отключаетяс наблюдение, так как реклама бльше не появляется
// не отключаем наблюдение, так как появляются разные предлагалки. Красивые предлагалки по теме конкретного видео справа от видео не удаляю - такой и должна быть умная реклама
// if (AD_remove_node(node, mutation)) observer.disconnect()
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(document.body, observer_config)
observers.push(observer)
AD_remove_node()
}
// Дзен: общее
// брать за образец в случае хаотичной рекламы
else if ((currentURL.startsWith('https://dzen.ru/') || currentURL.startsWith('https://m.dzen.ru/')) && DZEN_ON) {
if (isMobileDevice()) {
// верхний баннер
document.querySelectorAll('div[class*="dzen-mobile--dzen-mobile__hasBanner"]').forEach(node => {node?.remove()})
// const observer = new MutationObserver((mutationsList, observer) => {
// for (let mutation of mutationsList) {
// if (mutation.type === 'childList') {
// mutation.addedNodes.forEach(node => {
// if (node.nodeName === 'DIV') {
// document.querySelectorAll('div[class*="dzen-mobile--dzen-mobile__hasBanner"]').forEach(node => {node?.remove()})
// }
// })
// }
// }
// })
// observer.observe(document.body, observer_config)
// observers.push(observer)
}
else {
// Добавление кнопки "Специально для Вас..."
const EspeciallyForYou = CreateEspeciallyForYou()
let targetNode_observer
function AD_remove_node(node, mutation_test) {
let targetNode
let targetNodes
// курсы валют и нефти (сделать опциональным)
targetNode = document.querySelector('div.header-widgets__rates-ii')
if (targetNode && targetNode.parentNode !== EspeciallyForYou) {
if (EspeciallyForYou.querySelector('div.header-widgets__rates-ii')) {
targetNode?.remove()
}
else {
targetNode.style.position = 'unset'
targetNode.style.marginTop = '0.3rem'
const targetNodeA = targetNode.querySelector('a')
if (targetNodeA) targetNodeA.style.marginBottom = 0
EspeciallyForYou?.appendChild(targetNode)
}
}
// Кнопка "Установить Яндекс.браузер" под поиском
// targetNode = document.querySelector('div#ya-dist-link_bro')
// if (targetNode && targetNode.parentNode !== EspeciallyForYou) {
// if (EspeciallyForYou.querySelector('div#ya-dist-link_bro')) {
// // targetNode?.remove()
// }
// else {
// targetNode.style.position = 'unset'
// targetNode.style.marginTop = '0.3rem'
// const targetNodeA = targetNode.querySelector('a')
// if (targetNodeA) targetNodeA.style.marginBottom = 0
// EspeciallyForYou?.appendChild(targetNode)
// }
// }
// Кнопка "Установить Яндекс.браузер" внизу справа
targetNode = document.querySelector('div#ya-dist-teaser')
if (targetNode) targetNode?.remove()
// баннер сверху
targetNodes = document.querySelectorAll('div[data-testid="ad-banner"]')
if (targetNodes.length > 0) {
const targetNodes_EspeciallyForYou = EspeciallyForYou.querySelectorAll('div[data-testid="ad-banner"]')
if (targetNodes_EspeciallyForYou.length > 0) {
targetNodes.forEach(node => {
if (node.parentNode !== EspeciallyForYou) {
node.remove()
}
})
}
else {
targetNodes.forEach(node => {
node.style.marginTop = '0.3rem'
EspeciallyForYou?.appendChild(node)
})
}
}
// реклама в видеоблоках
targetNodes = document.querySelectorAll('div.zenad-card-rtb__ad')
targetNodes.forEach(node => {
// if (node.parentNode !== EspeciallyForYou) {
// node.style.marginTop = '0.3rem'
// EspeciallyForYou?.appendChild(node)
// }
// удаление так как слишком много этой рекламы
node.remove()
})
// Модальное окно "Яндекс станет основным поиском"
document.querySelector('div#ya-dist-splashscreen')?.remove()
// Слева вверху "Сделать поиск Яндекса основным?"
document.querySelector('div#ya-dist-popup')?.remove()
// Добавление EspeciallyForYou под блок поля поиска
const ForEspeciallyForYou_Container = document.querySelector('div#banner-view') || document.querySelector('div#LayoutTopMicroRoot')
if (ForEspeciallyForYou_Container && EspeciallyForYou.parentNode !== ForEspeciallyForYou_Container) {
ForEspeciallyForYou_Container.appendChild(EspeciallyForYou)
}
}
// Удаление с наблюдением
function AD_remove() {
targetNode_observer = document.querySelector('div#banner-view') || document.querySelector('div#LayoutTopMicroRoot') // более точный блок для наблюдения изменений
if (targetNode_observer) {
clearInterval(interval_AD_remove)
AD_remove_node()
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
AD_remove_node(node, mutation)
}
});
}
}
});
observer.observe(targetNode_observer, observer_config)
observers.push(observer)
}
}
const interval_AD_remove = setInterval(AD_remove, 500)
}
}
// vk.com
else if (currentURL.startsWith('https://vk.com/') && VK_ON) {
// реклама слева
function AD_remove() {
const targetNode_leftColumn = document.querySelector('div#ads_left')
if (targetNode_leftColumn) {
clearInterval(interval_AD_remove)
targetNode_leftColumn.remove()
}
}
const interval_AD_remove = setInterval(AD_remove, 500);
// реклама в теле страницы
const spans = document.querySelectorAll('span.PostHeaderSubtitle__item');
for (let span of spans) {
if (span.textContent === 'Реклама в сообществе') {
span.parentNode.parentNode.parentNode.parentNode.parentNode.remove();
}
}
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
// console.log('Новые узлы добавлены:', mutation.addedNodes);
mutation.addedNodes.forEach(node => {
if (node.nodeName === 'DIV') {
if (node.classList.contains('page_block') &&
node.classList.contains('no_posts')) {
const spans = document.querySelectorAll('span.PostHeaderSubtitle__item');
// if (spans.length > 0) { // на время тестирования
spans.forEach(span => {
if (span.textContent === 'Реклама в сообществе') {
span.parentNode.parentNode.parentNode.parentNode.parentNode.remove();
}
});
// }
}
}
});
}
}
});
observer.observe(document.querySelector('div#public'), observer_config)
observers.push(observer)
}
// ok.ru
else if (currentURL.startsWith('https://ok.ru/') && OK_ON) {
// реклама справа
function AD_remove() {
const targetNode_rightColumn = document.querySelector('div#rightColumn')
if (targetNode_rightColumn) {
clearInterval(interval_AD_remove)
targetNode_rightColumn.remove()
}
}
const interval_AD_remove = setInterval(AD_remove, 500);
// реклама слева
function AD_Left_remove() {
const targetNode_LeftColumn = document.querySelector('div#hook_Block_StickyBannerContainer')
if (targetNode_LeftColumn) {
clearInterval(interval_AD_Left_remove)
targetNode_LeftColumn.remove()
}
}
const interval_AD_Left_remove = setInterval(AD_Left_remove, 500);
}
}
// Добавлекние раскрывающегося блока "Реклама"
function CreateEspeciallyForYou() {
// Создание стилей с помощью JavaScript
const style = document.createElement("style")
style.textContent = `
details {
// display: none;
font-family: Arial, sans-serif;
font-size: 18px;
color: #333;
position: relative;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
background-color: #fff;
max-height: 50vh;
overflow-y: auto;
}
summary {
cursor: pointer;
outline: none;
position: relative;
z-index: 1;
color: #df4a0f; /* Изменение цвета текста на красный */
}
.shimmer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.5) 50%, rgba(255, 255, 255, 0) 100%);
animation: shimmer 60s linear infinite;
pointer-events: none;
}
@keyframes shimmer {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(100%);
}
}
`;
document.head.appendChild(style);
// Создание элемента details
const details = document.createElement("details");
// Добавляем класс my-details-class к элементу <details>
details.classList.add('details_EspeciallyForYou');
const summary = document.createElement("summary");
summary.textContent = messageSpecialOffer('Реклама')
const shimmer = document.createElement("div");
shimmer.className = "shimmer";
// const content = document.createElement("p");
// content.textContent = "Содержимое деталей...";
details.appendChild(summary);
details.appendChild(shimmer);
// details.appendChild(content);
// document.body.appendChild(details);
return details
}
// Возврат строк в зависимости от языка
function messageSpecialOffer(idMsg) {
// Определение языка браузера
const browserLanguage = navigator.language || navigator.userLanguage
let messageSpecialOffer
switch (idMsg) {
case "Реклама":
messageSpecialOffer = 'Реклама'
switch (browserLanguage) {
case "uken":
messageSpecialOffer = 'Реклама'
break;
default:
messageSpecialOffer = 'Реклама'
}
return messageSpecialOffer
}
}
// https://mail.ru/
// Функция для проверки наличия и удаления верхнего рекламного блока
function mail_ru_checkAndRemoveTopBlock() {
let targetNode
targetNode = document.querySelector(config.nodes.mail_ru_banner_top_parent);
if (targetNode) {
// тип ноды меняется через каждые несколько секунд
let targetNode_banner
targetNode_banner = targetNode.querySelector('div.tgb-wrapper')
if (targetNode_banner) {
targetNode_banner.remove()
}
}
const targetNodes = document.querySelectorAll('div.letter-list-item-adv')
targetNodes.forEach(node => {
node.remove();
});
// Поиск элемент с текстом "Реклама" внутри всех #shadow-root и определение блоков до #shadow-root
// Функция для поиска элемента по текстовому содержимому внутри shadow DOM
function findElementByTextInShadow(shadowRoot, tag, text) {
const elements = shadowRoot.querySelectorAll(tag);
for (let i = 0; i < elements.length; i++) {
if (elements[i].textContent === text) {
return elements[i];
}
}
return null;
}
// Новый способ
// Получаем все элементы <div> на странице
const divElements = document.querySelectorAll('div');
// Проходимся по каждому элементу и проверяем его высоту и содержимое
divElements.forEach((element) => {
const height = parseInt(getComputedStyle(element).height);
const content = element.innerText.trim();
// Проверяем, является ли элемент <div> с высотой 0px и без содержимого
if (height === 0 && content === '') {
// Находим предшествующий элемент <div> с высотой 90px
const previousDiv = element.previousElementSibling;
if (previousDiv && previousDiv.tagName === 'DIV' && parseInt(getComputedStyle(previousDiv).height) === 90) {
// Проверяем, содержит ли предшествующий элемент <div> с высотой 90px элемент <div> с текстом "0+", "6+", "12+" или "16+"
const innerDivs = previousDiv.querySelectorAll('div');
let hasText = false;
innerDivs.forEach((innerDiv) => {
const innerDivText = innerDiv.innerText.trim();
if (innerDivText === '0+' || innerDivText === '6+' || innerDivText === '12+' || innerDivText === '16+') {
hasText = true;
}
});
if (hasText) {
previousDiv.style.display = 'none'
}
}
}
});
}
function mail_ru_checkAndRemove_РекламаInSpan(node_test, mutation_test) {
if (node_test && node_test.nodeName === 'DIV') {
const DivBlockclassList = Array.from(node_test.classList);
if (DivBlockclassList.some(className => className === 'mailru-dzen-themes') //||
// DivBlockclassList.some(className => className === 'feed__row') &&
// DivBlockclassList.some(className => className === '_is-mailru-morda')
) {
// document.querySelectorAll('article.card-wrapper').forEach(node => {
// node?.remove()
// })
document.querySelectorAll('article.zenad-card-rtb').forEach(node => {
node?.remove()
})
document.querySelectorAll('div.zenad-card-rtb__ad').forEach(node => {
node?.remove()
})
}
}
// if (node_test && node_test.nodeName === 'IMG') {
// const DivBlockclassList = Array.from(node_test.classList);
// if (DivBlockclassList.some(className => className === 'zen-ui-zen-image-cover__image')
// ) {
// document.querySelectorAll('article.card-wrapper').forEach(node => {
// node?.remove()
// })
// document.querySelectorAll('div.zenad-card-rtb__ad').forEach(node => {
// node?.remove()
// })
// }
// }
}
// Поиск элемент с текстом "Реклама" внутри всех #shadow-root и определение блоков до #shadow-root
function mail_ru_checkAndRemove_РекламаВShadow() {
// // Функция для поиска элемента по текстовому содержимому внутри shadow DOM
// function findElementByTextInShadow(shadowRoot, tag, text) {
// const elements = shadowRoot.querySelectorAll(tag);
// for (let i = 0; i < elements.length; i++) {
// if (elements[i].textContent === text) {
// return elements[i];
// }
// }
// return null;
// }
// // Найти все shadow host'ы на странице
// const shadowHosts = document.querySelectorAll('*');
// shadowHosts.forEach(shadowHost => {
// const shadowRoot = shadowHost.shadowRoot;
// if (shadowRoot) {
// // Найти элемент с текстом "Реклама" внутри shadow root
// const рекламаElement = findElementByTextInShadow(shadowRoot, 'span', 'Реклама');
// if (рекламаElement) {
// // Подняться по родительским нодам вплоть до shadow-root
// let currentNode = рекламаElement;
// while (currentNode && currentNode.parentNode !== shadowRoot) {
// currentNode = currentNode.parentNode;
// }
// // Теперь currentNode указывает на элемент, непосредственно следующий за shadow-root
// console.log(currentNode);
// } else {
// console.log('Элемент с текстом "Реклама" не найден внутри shadow root');
// }
// } else {
// console.log('Shadow root не найден');
// }
// });
//*************
// function findParentNodeAboveShadowRoot() {
// const adSpan = document.querySelector('span:contains("Реклама")');
// if (adSpan) {
// let currentNode = adSpan.parentNode;
// while (currentNode && currentNode.id !== 'shadow-root') {
// currentNode = currentNode.parentNode;
// }
// if (currentNode && currentNode.parentNode) {
// return currentNode.parentNode;
// }
// }
// return null;
// }
// const parentNode = findParentNodeAboveShadowRoot();
// if (parentNode) {
// console.log('Parent node above shadow-root:', parentNode);
// } else {
// console.log('Could not find the specified node.');
// }
//*****************
function findParentNodeAboveShadowRoot() {
// Find all elements with a closed shadow root
const shadowRoots = Array.from(document.querySelectorAll('*')).filter(el => el.shadowRoot && el.shadowRoot.mode === 'closed');
// Iterate through the shadow roots and change their mode to 'open'
shadowRoots.forEach(el => {
el.shadowRoot.mode = 'open';
});
// Find all span elements
const spans = document.querySelectorAll('span');
// Iterate through the spans and find the one with the text "Реклама"
for (let i = 0; i < spans.length; i++) {
if (spans[i].textContent === 'Реклама') {
let currentNode = spans[i].parentNode;
// Traverse up the DOM until the shadow root is found
while (currentNode && currentNode.id !== 'shadow-root') {
currentNode = currentNode.parentNode;
}
// Return the parent of the shadow root
if (currentNode && currentNode.parentNode) {
return currentNode.parentNode;
}
}
}
return null; // Return null if the node is not found
}
const parentNode = findParentNodeAboveShadowRoot();
if (parentNode) {
console.log('Parent node above shadow-root:', parentNode);
} else {
console.log('Could not find the specified node.');
}
}
function mail_ru_checkAndRemoveTopBlock_classList(Node,mutation_test) {
const classList = Array.from(Node.classList);
if (classList.length === 3 &&
classList.some(className => className.length === 7) &&
classList.some(className => className.length === 7) &&
classList.some(className => className.length >= 7 )) { // замечены варианты 15 и 17 длиной
Node.remove();
// Node.style.display = 'none';
}
}
// внизу справа "Сделать поиск Яндекса основным?"
function yandex_dzen_questionYandexGeneralSearch() {
// <div class="nvBl_ nvBl_g9JqZb38zCZXEw nvBl_g9Z8ZofTxz9QBra_"><div id="dhbz" class="qb5a868df"><div class="ta805822e bacc75f5 fce2ef19d j2b3be76f o2301de0b"><div class="w6845527">
// Выбираем все div
const allDivs = document.querySelectorAll('div');
// Фильтруем div, чтобы оставить только те, у которых ровно три класса
const divsWithThreeClasses = Array.from(allDivs).filter(div => {
const classes = div.classList;
return classes.length === 3;
});
divsWithThreeClasses.forEach(div => {
const DivChild = div.querySelector('div');
function checkDivHasAnyId(div) {
if (!div) {
// console.log('Div not found.');
return false;
}
if (!div.id) {
// console.log('Div does not have an id.');
return false;
}
// console.log('Div has an id.');
// Проверяем, что div имеет ровно один класс
if (div.classList.length !== 1) {
// console.log('Div does not have exactly one class.');
return false;
}
// есть вложенный div, принадлежащий пяти классам
const DivChild2 = div.querySelector('div');
if (!DivChild2) {
return false;
}
// Проверяем, что div принадлежит ровно 5-ти классам
if (DivChild2.classList.length !== 5) {
// console.log('Div does not have exactly 5 classes.');
return false;
}
return true;
}
const result = checkDivHasAnyId(DivChild);
if (result) div.remove()
});
// Новый способ
// Получаем все элементы <div> на странице
const divElements = document.querySelectorAll('div');
// Проходимся по каждому элементу и проверяем его содержимое
divElements.forEach((element) => {
if (element.innerText.includes('Сделать поиск Яндекса основным')) {
// Используем closest() для поиска родителя с указанным z-index
const parentElement = divElement.closest('[style*="z-index"]');
// Проверяем, найден ли родитель и его z-index
if (parentElement && parseInt(getComputedStyle(parentElement).zIndex) > 100) {
parentElement.remove()
}
}
});
}
// определение мобильное устройство или ПК
function isMobileDevice() {
return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
}
// // Обработка события hashchange (не срабатывает)
// window.addEventListener('hashchange', handleUrlChange);
// // Обработка события popstate (не срабатывает)
// window.addEventListener('popstate', handleUrlChange);
// Function to handle URL changes
function handleUrlChange2(newUrl) {
if (currentURL !== newUrl) {
// console.log('URL changed from', currentUrl, 'to', newUrl);
currentURL = newUrl;
// You can add your custom logic here
// handleUrlChange()
onInit()
}
}
// Override pushState and replaceState to track URL changes
const originalPushState = history.pushState;
const originalReplaceState = history.replaceState;
history.pushState = function() {
originalPushState.apply(history, arguments);
handleUrlChange2(window.location.href);
};
history.replaceState = function() {
originalReplaceState.apply(history, arguments);
handleUrlChange2(window.location.href);
};
// Проверка изменений в URL при загрузке страницы
// handleUrlChange(); // перенесено в Init
})();