LINUX.ORG.RU
ФорумTalks

Как заблокировать рекламу на ютубе?

 , ,


0

2

Хочу понять, как её заблокировать самому (своим расширением), то бишь некий алгоритм. Пытался вкурить в Developer Console, но там слишком много активности. Пытался смотреть EasyList, но там тоже как-то всё неструктурировано. В идеале какое-нибудь обсуждение бы найти тех, кто пишет адблоки, где они это дело обсуждают, чтобы там почерпнуть информацию, но сходу не нашёл.

★★★★★
youtube.com##.ytp-ce-covering-overlay
youtube.com##.ytp-ce-element-shadow
youtube.com##.ytp-ce-covering-image
youtube.com##.ytp-ce-expanding-image
youtube.com##.ytp-pause-overlay
youtube.com##.ytp-scroll-min.ytp-pause-overlay
youtube.com##.iv-click-target
youtube.com##.ytp-cards-button
youtube.com##.ytp-cards-teaser
youtube.com##.ytp-ce-covering-image
youtube.com##.ytp-ce-covering-overlay
youtube.com##.ytp-ce-element
youtube.com##.ytp-ce-element-shadow
youtube.com##.ytp-ce-element.ytp-ce-channel.ytp-ce-ch
youtube.com##.ytp-ce-element.ytp-ce-video.ytp-ce-elem
youtube.com##.ytp-ce-element.ytp-ce-bottom-right-quad
Lordwind ★★★★★
()
Ответ на: комментарий от Lordwind

А какие-нибудь URL-ы заблокировать не получится? До блокирования элементов я ещё не добрался.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Lordwind

Вставил

.ytp-ce-covering-overlay,
...,
.ytp-ce-element.ytp-ce-bottom-right-quad {
    display: none;
}

в страницу. Рекламу по прежнему крутит.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Lordwind

Вот ublock не хочу ставить, хром переходит на declarative_net_request, а ublock, как я понимаю, не собирается, вот и решил сам поблокировать самое раздражающее. Всякие гугл ады легко блокируются, тупо через googletagmanager.com, google-analytics.com, googletagservices.com, google.*/ads/. А вот у ютуба какая-то магия, вообще не могу там ничего заблокировать. Только если * { display: none } делаю, то пустая страница получается. Такое ощущение, что он как-то убирает мои стили со своих элементов.

Legioner ★★★★★
() автор топика

Поставил Cercube и горя не знаю.

Miguel ★★★★★
()

Пока покопав юзерскрипты на гризманки и поэкспериментировав прихожу к таким выводам. Нужно отслеживать появление в DOM кнопки с классом ytp-ad-skip-button. Если такая кнопка появилась, надо на неё сразу нажать. Это пропускает рекламу, 5 секунд ждать вроде как не надо. Сам скрипт ещё не написал, но вроде как-то так оно работает.

Legioner ★★★★★
() автор топика

На YouTube надо чтобы вся реклама была пропускаемая, и не было так, что 20 секунд непропускаемой рекламы. Надо плагин, чтобы такая реклама пропускалась, и красная надпись сбоку такой рекламы «автор рекламы %CENSORED%».

ZenitharChampion ★★★★★
()

На смарте NewPipe.

На компе mpv+youtube-dl.

user42 ★★
()

Думаю, что окончательно разобрался.

В общем есть возможность заблокировать видео-рекламу фильром сетевых запросов, но при этом ютуб начинает заменять видеорекламу картинками. Что уже неплохо, но не до конца решает задачу. Самый подходящий способ это фильтровать ответы от гугла. Для этого нужно вставить JavaScript на страницу. Я родил такой вариант (вставляемый content script-ом), частично стырив у юблока:

(() => {
    "use strict";

    const pageScript = () => {
        "use strict";

        const processors = [];
        window.addJSONPostProcessor = processor => processors.push(processor);

        const originalJSONParse = JSON.parse;
        JSON.parse = (text, reviver) => {
            const result = originalJSONParse(text, reviver);
            for (const processor of processors) {
                processor(result);
            }
            return result;
        };

        const originalResponsePrototypeJson = Response.prototype.json;
        Response.prototype.json = () =>
            originalResponsePrototypeJson.call(this).then(result => {
                for (const processor of processors) {
                    processor(result);
                }
                return result;
            });
    };

    const script = document.createElement("script");
    script.append("(" + pageScript + ")();");
    document.documentElement.append(script);

    window.addJSONPostProcessor = processor => {
        const script = document.createElement("script");
        script.append("addJSONPostProcessor(" + processor + ");");
        document.documentElement.append(script);
    };
})();

(() => {
    "use strict";

    addJSONPostProcessor(result => {
        delete result.adPlacements;
    });
})();

Также использую следующий CSS, чтобы скрывать рекламу в виде маленьких картинок, порой появляющихся поверх видео:

.video-ads {
    display: none;
}

Кроме этого реклама остаётся ещё в некоторых местах, но мне она уже не мешает, поэтому трогать я её не стал, вроде вся вырезается CSS-ом.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
15 января 2021 г.

Очередная итерация. Оказалось, что youtube засовывает рекламу прямо в страницу, чистить JSON-ответы не всегда достаточно. Сделал такой вариант, пока вроде работает.

(() => {
    "use strict";
    // remove JSON ads
    const originalJSONParse = JSON.parse;
    JSON.parse = function (text, reviver) {
        const obj = originalJSONParse.call(this, text, reviver);
        removeJSONAds(obj);
        return obj;
    };

    const originalResponsePrototypeJson = Response.prototype.json;
    Response.prototype.json = function () {
        return originalResponsePrototypeJson.call(this).then(obj => {
            removeJSONAds(obj);
            return obj;
        });
    };

    function removeJSONAds(obj) {
        if (obj == null || typeof obj !== "object") {
            return;
        }
        if (Array.isArray(obj)) {
            for (const item of obj) {
                // noinspection JSUnresolvedVariable
                delete item?.playerResponse?.adPlacements;
            }
        }
        // noinspection JSUnresolvedVariable
        delete obj.adPlacements;
        // noinspection JSUnresolvedVariable
        delete obj.playerResponse?.adPlacements;
    }

    // remove global object ads
    function defineProxyProperty(object, property, behaviour) {
        const value = object[property];
        const proxyHandler = getProxyHandler(behaviour);
        let proxyValue = value == null ? value : new Proxy(value, proxyHandler);
        Object.defineProperty(object, property, {
            enumerable: true,

            get() {
                return proxyValue;
            },

            set(newValue) {
                proxyValue = newValue == null ? newValue : new Proxy(newValue, proxyHandler);
            }
        });
    }

    function getProxyHandler(behaviour) {
        // noinspection JSUnusedGlobalSymbols
        return {
            get(target, property) {
                if (property in behaviour) {
                    const propertyBehaviour = behaviour[property];
                    if (propertyBehaviour == null) {
                        return propertyBehaviour;
                    }
                    const propertyValue = target[property];
                    if (propertyValue == null) {
                        return propertyValue;
                    }
                    return new Proxy(propertyValue, getProxyHandler(propertyBehaviour));
                } else {
                    return target[property];
                }
            },

            has(target, property) {
                if (property in behaviour) {
                    const propertyBehaviour = behaviour[property];
                    if (propertyBehaviour === undefined) {
                        return false;
                    }
                }
                return property in target;
            }
        };
    }

    defineProxyProperty(window, "ytInitialPlayerResponse", {adPlacements: undefined});
})();
Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)

лайк за старания, вот вариант для ленивых

https://www.youtube.com/watch?v=GH9V_7i4ik4

заменяем на

https://yewtu.be/watch?v=GH9V_7i4ik4

есть плагин Invidition который должен делать это автоматически, но он иногда ломает воспроизведение, видео перестает загружаться в рандомном месте во время просмотра.

BLOBster ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.