Greasy Fork

Greasy Fork is available in English.

去你妈的批站诈骗广告

bilibili,B站,去广告,屏蔽小火箭推广视频,屏蔽首页左侧大图滑动推荐栏

目前为 2025-03-18 提交的版本。查看 最新版本

// ==UserScript==
// @name         去你妈的批站诈骗广告
// @version      1.6
// @description  bilibili,B站,去广告,屏蔽小火箭推广视频,屏蔽首页左侧大图滑动推荐栏
// @author       爆菊大师
// @match        *://*.bilibili.com/*
// @grant        none
// @license MIT
// @namespace http://tampermonkey.net/
// ==/UserScript==

(function () {
    'use strict';
    const selectors = {
        pseudo: '.bili-video-card.is-rcmd',
        icons: '.vui_icon.bili-video-card__stats--icon',
        adFeed: '.bili-video-card__mask .bili-video-card__stats--text'
    };
    const style = document.createElement('style');
    style.textContent = `
        .recommended-swipe.grid-anchor,
        .bili-live-card.is-rcmd.enable-no-interest,
        .ad-report.ad-floor-exp.left-banner,
        .activity-m-v1.act-end,
        .activity-m-v1.act-now,
        .video-card-ad-small,
        .video-page-game-card-small,
        .slide-ad-exp,
        .floor-single-card,
        .fixed-card { display: none !important; }
        .feed-card { margin-top: 0 !important; }
    `;
    document.head.appendChild(style);
    function runAllChecks() {
        checkElements(selectors.pseudo, el =>
            isBlocked(el) || Array.from(el.children).some(isBlocked)
        );
        checkElements(selectors.icons, null, '.bili-video-card');
        checkElements(selectors.adFeed, el =>
            el.textContent.includes('广告'), '.bili-video-card__wrap'
        );
    }
    function hideElement(element) {
        if (element.dataset.processed) return;
        element.style.display = 'none';
        element.dataset.processed = 'true';
    }
    function isBlocked(element) {
        if (element.dataset.checked) return element.dataset.blocked === 'true';
        const content = window.getComputedStyle(element, '::before').content;
        const blocked = content.includes('AdGuard') || content.includes('AdBlock');
        element.dataset.checked = 'true';
        element.dataset.blocked = blocked;
        return blocked;
    }
    function checkElements(selector, condition, parentSelector) {
        document.querySelectorAll(selector).forEach(el => {
            const target = parentSelector ? el.closest(parentSelector) : el;
            if (target && (!condition || condition(el))) hideElement(target);
        });
    }
    const debounce = (fn, delay = 100) => {
        let timeout;
        return (...args) => {
            clearTimeout(timeout);
            timeout = setTimeout(() => fn(...args), delay);
        };
    };
    const observer = new MutationObserver(debounce(runAllChecks));
    observer.observe(document.body, { subtree: true, childList: true });
    runAllChecks();
})();