youtube去广告

简单高效的youtube去广告脚本,拒绝花里胡哨。如果你有一丢丢编程知识,可以尝试为常量cssSeletorArr定义元素。如果你有好的建议可以联系我[email protected]

目前为 2023-02-07 提交的版本。查看 最新版本

// ==UserScript==
// @name         youtube去广告
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  简单高效的youtube去广告脚本,拒绝花里胡哨。如果你有一丢丢编程知识,可以尝试为常量cssSeletorArr定义元素。如果你有好的建议可以联系我[email protected]。
// @author       FuckAD
// @match        https://www.youtube.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant        none
// @license MIT
// ==/UserScript==
(function() {
    'use strict';

    //界面广告选择器
    const cssSeletorArr = [
        `ytd-rich-item-renderer.style-scope.ytd-rich-grid-row:has(.ytd-display-ad-renderer)`,//首页广告
        `.video-ads.ytp-ad-module`,//播放器底部广告
        `#related #player-ads`,//播放页评论区右侧推广广告
        `#related ytd-ad-slot-renderer`,//播放页评论区右侧视频推荐广告
    ];

    /**
    * 生成去除广告的css元素style并附加到HTML节点上
    * @param {String} styles 样式文本
    * @param {String} styleId 元素id
    * @return {undefined}
    */
    function generateRemoveAdHTMLElement(styles,styleId) {
        //如果已经设置过,退出
        if (document.getElementById(styleId)) {
            return false
        }

        //设置移除广告样式
        let style = document.createElement(`style`);//创建style元素
        style.id = styleId;
        (document.querySelector(`head`) || document.querySelector(`body`)).appendChild(style);//将节点附加到HTML
        if (style.styleSheet) {
            style.styleSheet.cssText = styles;//for ie浏览器有更加方便的api
        } else {
            style.appendChild(document.createTextNode(styles));//for w3c
        }
    }

    /**
    * 生成去除广告的css文本
    * @param {Array} cssSeletorArr 待设置css选择器数组
    * @return {String}
    */
    function generateRemoveAdCssText(cssSeletorArr){
        cssSeletorArr.forEach((seletor,index)=>{
            cssSeletorArr[index]=`${seletor}{display:none!important}`;//遍历并设置样式
        });
        return cssSeletorArr.join(" ");//拼接成字符串
    }

    /**
    * 去除播放中的广告
    * @return {undefined}
    */
    function removePlayerAd(){
        let timerId =setInterval(function(){
            //拥有跳过按钮的广告
            let skipButton = document.querySelector(`.ytp-ad-skip-button`);
            if(skipButton)
            {
                skipButton.click();// 跳过广告
                return false;//防止后面错判
            }

            //片头短广告
            let adShortMsg = document.querySelector(`.video-ads.ytp-ad-module .ytp-ad-player-overlay`);
            if(adShortMsg){
                location.href = location.href;//重新加载
                clearInterval(timerId);
            }

        }, 16);//主流屏幕刷新率为60hz,此设置与16.666666毫秒每帧对应
    }

    /**
    * main函数
    */
    function main(){
        generateRemoveAdHTMLElement(generateRemoveAdCssText(cssSeletorArr),`removeAd`);//移除界面中的广告
        removePlayerAd();//移除播放中的广告
    }
    main();

})();