YouTube AdBlock Stealth Mode

Скрывает факт использования AdBlock на YouTube без поломки интерфейса (ESC, полноэкранный режим, воспроизведение работают нормально). Убирает всплывающие уведомления и блокирует рекламные скрипты.

// ==UserScript==
// @name         YouTube AdBlock Stealth Mode
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  Скрывает факт использования AdBlock на YouTube без поломки интерфейса (ESC, полноэкранный режим, воспроизведение работают нормально). Убирает всплывающие уведомления и блокирует рекламные скрипты.
// @author       someonedev
// @match        https://www.youtube.com/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // [1] Подмена стандартных признаков наличия AdBlock
    Object.defineProperty(window, 'canRunAds', {
        get: () => true,
        configurable: false
    });
    if (!window.chrome) window.chrome = { runtime: {} };
    Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3],
        configurable: false
    });
    Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en'],
        configurable: false
    });

    // [2] Блокировка загрузки рекламных скриптов (fetch / XHR)
    const blocked = ['googleads', 'doubleclick', 'adservice'];
    const origFetch = window.fetch;
    window.fetch = function (input, init) {
        const url = typeof input === 'string' ? input : input.url;
        if (blocked.some(d => url.includes(d))) {
            return Promise.resolve(new Response('', { status: 204 }));
        }
        return origFetch.apply(this, arguments);
    };
    const origOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function (method, url) {
        this._block = blocked.some(d => url.includes(d));
        return origOpen.apply(this, arguments);
    };
    const origSend = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function (body) {
        if (this._block) {
            this.onload = this.onerror = () => { };
            this.abort();
            return;
        }
        return origSend.apply(this, arguments);
    };

    // [3] Скрытие всплывающих окон без удаления элементов
    const style = document.createElement('style');
    style.textContent = `
        ytd-enforcement-message-view-model,
        tp-yt-paper-dialog[role="dialog"],
        .ytd-popup-container,
        tp-yt-iron-overlay-backdrop,
        .ytp-ad-module,
        .ytp-ad-overlay-container,
        .ytp-ad-player-overlay {
            display: none !important;
            opacity: 0 !important;
            pointer-events: none !important;
        }
    `;
    document.documentElement.appendChild(style);

    // [4] Наблюдатель за появлением блокировок YouTube (MutationObserver)
    const hideAdPopup = () => {
        const popup = document.querySelector('ytd-enforcement-message-view-model');
        const overlay = document.querySelector('tp-yt-iron-overlay-backdrop');
        if (popup) popup.style.display = 'none';
        if (overlay) overlay.style.display = 'none';
    };
    const observer = new MutationObserver(hideAdPopup);
    const waitForBody = () => {
        if (document.body) {
            observer.observe(document.body, { childList: true, subtree: true });
            hideAdPopup();
        } else {
            requestAnimationFrame(waitForBody);
        }
    };
    waitForBody();

    // [5] Маскировка возможных будущих переменных-детекторов
    const mask = (obj, prop, val) => {
        try {
            Object.defineProperty(obj, prop, {
                get: () => val,
                configurable: false
            });
        } catch (_) { }
    };
    ['adblockDetected', '__adblock', '_AdBlockInit'].forEach(name =>
        mask(window, name, false)
    );

    // [6] Блокировка записи "adblock"-ключей в localStorage
    const origSetItem = localStorage.setItem;
    localStorage.setItem = function (key, value) {
        if (key.toLowerCase().includes('adblock')) return;
        return origSetItem.apply(this, arguments);
    };

    // [7] Отладка
    console.log('%c[YouTube Stealth AdBlock] Активирован', 'color: limegreen; font-weight: bold;');
})();