Greasy Fork

Greasy Fork is available in English.

opgg去广告

去除opgg 英雄联盟,云顶之弈,无畏契约的左侧视屏广告

当前为 2024-10-17 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         opgg去广告
// @namespace    http://akiyamamio.online/
// @version      0.0.7
// @description  去除opgg 英雄联盟,云顶之弈,无畏契约的左侧视屏广告
// @author       alive
// @match        *://*.op.gg/*
// @icon         https://s-lol-web.op.gg/favicon.ico
// @license      MIT
// @grant        none
// @run-at       document-end
// ==/UserScript==
(function () {
    'use strict';

    // JSON 配置对象
    const configData = {
        configs: [
            {
                configName: "LOL_Config",
                urlPattern: ".*://www.op.gg/.*",
                adSelectors: [
                    "#opgg-video",
                    "#primisPlayerContainerDiv",
                    "#banner-container",
                    "#opgg-kit-house-image-banner",
                    ".vm-skin",
                    ".vm-footer",
                    ".banner-container",
                    "#banner-container",
                    ".banner",
                    "#aniplayer",
                    "div[style='width: 405px; height: 228px;']",
                    "div[class='css-14mw2gw e1ye94yl7']",
                    "div[style='position: fixed; overflow: hidden; pointer-events: none; inset: 255px 1314.5px 0px 0px; text-align: right; z-index: 2;']",
                    "div[style='position: fixed; overflow: hidden; pointer-events: none; inset: 255px 0px 0px 1314.5px; text-align: left; z-index: 2;']"
                ]
            },
            {
                configName: "TFT_Config",
                urlPattern: ".*://tft.op.gg/.*",
                adSelectors: [
                    "#opgg-kit-house-image-banner",
                    "#video-meta-trend-ad",
                    "#video-tools-ad",
                    ".css-13lit7a",
                    ".desktop",
                    ".css-1t8t0it"
                ]
            },
            {
                configName: "V_Config",
                urlPattern: ".*://valorant.op.gg/.*",
                adSelectors: [
                    "#opgg-kit-house-image-banner",
                    "#video-leaderboards-ad",
                    "#video-stats-ad",
                    "#video-crosshair-ad",
                    "#video-agents-ad",
                    "#video-weapons-ad",
                    "#video-profile-ad",
                    ".ad",
                    ".ad--desktop",
                    "#primis_container_div"
                ]
            }
        ]
    };

    // Config 对象
    function Config(configName, urlPattern, adSelectors) {
        this.configName = configName;
        this.urlPattern = urlPattern;
        this.adSelectors = adSelectors;
    }

    // 获取广告选择器的方法,直接返回选择器字符串
    Config.prototype.getADSelector = function () {
        return this.adSelectors.join(",");
    };

    // 动态创建Config的函数,根据当前URL匹配并创建
    function createConfigIfMatch(configName, urlPattern, adSelectors) {
        const currentUrl = window.location.href; // 获取当前页面的URL
        const pattern = new RegExp(urlPattern); // 创建正则表达式

        // 判断当前URL是否匹配指定的URL模式
        return pattern.test(currentUrl) ? new Config(configName, urlPattern, adSelectors) : null;
    }

    // 动态创建多个配置对象,从 JSON 数据中读取
    const configs = configData.configs
        .map(({ configName, urlPattern, adSelectors }) =>
            createConfigIfMatch(configName, urlPattern, adSelectors)
        )
        .filter(config => config !== null); // 过滤掉没有匹配的配置

    if (configs.length > 0) {
        const matchedConfig = configs[0]; // 使用匹配到的第一个配置
        console.log("匹配到的配置:", matchedConfig.configName);
        const adSelector = matchedConfig.getADSelector();

        // 观察DOM并自动隐藏广告
        const observer = new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                if (mutation.type === 'childList' || (mutation.type === 'attributes' && mutation.attributeName === 'style')) {
                    hideAdsAndIframes(adSelector);
                }
            });
        });

        // 开始观察DOM的变化,监听子元素、属性的变化
        observer.observe(document.body, {
            childList: true,
            subtree: true,
            attributes: true,
            attributeFilter: ['style'] // 只监听`style`属性的变化
        });

        // 初始隐藏广告和 iframe
        hideAdsAndIframes(adSelector);
    } else {
        console.log("没有找到匹配的配置");
    }

    // 隐藏广告和 iframe 的函数
    function hideAdsAndIframes(adSelector) {
        // 隐藏广告元素
        const elements = document.querySelectorAll(adSelector);
        elements.forEach(element => {
            if (element && element.style.display !== 'none') {
                element.style.display = 'none';
            }
        });

        // 隐藏所有 iframes
        const iframes = document.getElementsByTagName('iframe');
        Array.from(iframes).forEach(iframe => {
            if (iframe && iframe.style.display !== 'none') {
                iframe.style.display = 'none';
            }
        });
    }
})();