Greasy Fork

Greasy Fork is available in English.

去你妈的批站诈骗广告

bilibili,B站,去广告,屏蔽小火箭推广视频,屏蔽首页左侧大图滑动推荐栏,屏蔽直播主页顶部自动播放的直播

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

// ==UserScript==
// @name         去你妈的批站诈骗广告
// @version      1.8
// @description  bilibili,B站,去广告,屏蔽小火箭推广视频,屏蔽首页左侧大图滑动推荐栏,屏蔽直播主页顶部自动播放的直播
// @author       爆菊大师
// @match        *://*.bilibili.com/*
// @icon         https://www.bilibili.com/favicon.ico
// @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 = `
        /* live */
        .player-area-ctnr.border-box.p-relative.t-center,
        /* video */
        .ad-report.ad-floor-exp.right-bottom-banner,
        .activity-m-v1.act-end,
        .activity-m-v1.act-now,
        .video-card-ad-small,
        .video-page-game-card-small,
        .slide-ad-exp,
         /* home */
         .bili-video-card__skeleton.loading_animation,
        .recommended-swipe.grid-anchor,
        .bili-live-card.is-rcmd.enable-no-interest,
        .ad-report.ad-floor-exp.left-banner,
        .floor-single-card,
        .fixed-card { display: none !important; }
        .feed-card { margin-top: 0 !important; }
    `;
    document.head.appendChild(style);
    const originalPlay = HTMLMediaElement.prototype.play;
    HTMLMediaElement.prototype.play = function() {
        const isRootPath = window.location.hostname === 'live.bilibili.com' &&
                          (window.location.pathname === '/' || window.location.pathname === '');
        const stack = new Error().stack || '';
        const isTargetScript = stack.includes('home-player.prod.min.js');
        if (isRootPath && isTargetScript) {
            this.pause();
            this.currentTime = 0;
            this.removeAttribute('autoplay');
            return Promise.reject(new DOMException('play() failed', 'NotAllowedError'));
        }
        return originalPlay.apply(this, arguments);
    };
    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();
})();