// ==UserScript== // @name 主流视频广告拦截 // @namespace http://tampermonkey.net/ // @version 1.0.0 // @description 拦截主流视频网站(B站、优酷、爱奇艺、腾讯视频、芒果TV、搜狐视频等)的片头广告、暂停广告、弹窗广告等 // @author You // @match *://*.bilibili.com/* // @match *://*.youku.com/* // @match *://*.iqiyi.com/* // @match *://*.v.qq.com/* // @match *://*.mgtv.com/* // @match *://*.sohu.com/* // @match *://*.le.com/* // @match *://*.pptv.com/* // @match *://*.1905.com/* // @match *://*.baofeng.com/* // @match *://*.cntv.cn/* // @match *://*.cctv.com/* // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant unsafeWindow // @run-at document-start // ==/UserScript== (function() { 'use strict'; // ==================== 通用广告拦截规则 ==================== const adSelectors = { // 通用广告选择器 common: [ '[class*="ad-"]', '[class*="advert"]', '[class*="advertisement"]', '[class*="banner"]', '[class*="popup"]', '[id*="ad-"]', '[id*="advert"]', '[id*="banner"]', '[id*="popup"]', '.ad-container', '.adsbygoogle', '.commercial', '.sponsored', '[data-ad]', '[data-ad-slot]' ], // B站 (bilibili.com) bilibili: [ '.ad-report', '.ad-floor', '.ad-link', '.banner-item', '.ad-swiper', '.gg-floor', '.ad-card', '[class*="ad-"]', '.video-page-game-card', '.pop-live', '.live-ad', '.activity-m', '.vip-wrap', '.nav-link-item:has(.gg-icon)', '.feed-card:has([href*="cm.bilibili.com"])', '.bili-video-card:has([href*="cm.bilibili.com"])', '.adblock-tips', '.adblock-tips-container' ], // 优酷 (youku.com) youku: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.yk-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown' ], // 爱奇艺 (iqiyi.com) iqiyi: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.qy-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown', '.cupid-panel', '.cupid-ad', '.qy-player-ad', '.qy-player-advertisement' ], // 腾讯视频 (v.qq.com) qq: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.txp-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown', '.txp_ad', '.txp-ad-skip', '.txp-ad-duration', '.mod_ad', '.ad_mod' ], // 芒果TV (mgtv.com) mgtv: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.mg-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown' ], // 搜狐视频 (sohu.com) sohu: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.sohu-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown' ], // 乐视 (le.com) le: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.le-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown' ], // PPTV (pptv.com) pptv: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.pptv-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown' ], // 央视网 (cntv.cn, cctv.com) cntv: [ '#ad-screen', '.ad-screen', '.advertisement', '.ad-container', '.ad-layer', '.ad-player', '.ad-mask', '.ad-wrapper', '.cntv-ad', '.ad-box', '.ad-banner', '.ad-popup', '.ad-float', '.ad-sidebar', '.ad-bottom', '.ad-top', '.ad-mid', '.ad-insert', '.ad-pause', '.ad-skip', '.ad-countdown' ] }; // ==================== CSS 隐藏规则 ==================== const hideStyles = ` /* 通用广告隐藏 */ [class*="ad-"], [class*="advert"], [class*="advertisement"], [class*="banner"], [class*="popup"], [id*="ad-"], [id*="advert"], [id*="banner"], [id*="popup"], .ad-container, .adsbygoogle, .commercial, .sponsored, [data-ad], [data-ad-slot] { display: none !important; visibility: hidden !important; opacity: 0 !important; height: 0 !important; width: 0 !important; pointer-events: none !important; } /* 视频广告层 */ .ad-screen, .ad-layer, .ad-mask, .ad-player, .ad-wrapper, .advertisement, .ad-box, .ad-banner, .ad-popup, .ad-float, .ad-sidebar, .ad-bottom, .ad-top, .ad-mid, .ad-insert, .ad-pause, .ad-skip, .ad-countdown { display: none !important; visibility: hidden !important; opacity: 0 !important; pointer-events: none !important; } /* B站特定 */ .ad-report, .ad-floor, .ad-link, .ad-swiper, .gg-floor, .ad-card, .video-page-game-card, .pop-live, .live-ad, .activity-m, .adblock-tips, .adblock-tips-container { display: none !important; } /* 优酷特定 */ .yk-ad, #ad-screen, .ad-screen { display: none !important; } /* 爱奇艺特定 */ .qy-ad, .cupid-panel, .cupid-ad, .qy-player-ad, .qy-player-advertisement { display: none !important; } /* 腾讯视频特定 */ .txp-ad, .txp_ad, .txp-ad-skip, .txp-ad-duration, .mod_ad, .ad_mod { display: none !important; } /* 芒果TV特定 */ .mg-ad { display: none !important; } /* 搜狐视频特定 */ .sohu-ad { display: none !important; } /* 乐视特定 */ .le-ad { display: none !important; } /* PPTV特定 */ .pptv-ad { display: none !important; } /* 央视网特定 */ .cntv-ad { display: none !important; } `; // 注入CSS样式 GM_addStyle(hideStyles); // ==================== 广告移除函数 ==================== function removeAds() { const hostname = window.location.hostname; let selectors = [...adSelectors.common]; // 根据域名添加特定选择器 if (hostname.includes('bilibili.com')) { selectors = selectors.concat(adSelectors.bilibili); } else if (hostname.includes('youku.com')) { selectors = selectors.concat(adSelectors.youku); } else if (hostname.includes('iqiyi.com')) { selectors = selectors.concat(adSelectors.iqiyi); } else if (hostname.includes('qq.com')) { selectors = selectors.concat(adSelectors.qq); } else if (hostname.includes('mgtv.com')) { selectors = selectors.concat(adSelectors.mgtv); } else if (hostname.includes('sohu.com')) { selectors = selectors.concat(adSelectors.sohu); } else if (hostname.includes('le.com')) { selectors = selectors.concat(adSelectors.le); } else if (hostname.includes('pptv.com')) { selectors = selectors.concat(adSelectors.pptv); } else if (hostname.includes('cntv.cn') || hostname.includes('cctv.com')) { selectors = selectors.concat(adSelectors.cntv); } // 去重 selectors = [...new Set(selectors)]; // 移除广告元素 selectors.forEach(selector => { try { const elements = document.querySelectorAll(selector); elements.forEach(el => { if (el && el.parentNode) { el.remove(); } }); } catch (e) { // 忽略无效选择器 } }); } // ==================== 视频广告拦截 ==================== function blockVideoAds() { // 拦截视频广告请求 const originalFetch = window.fetch; window.fetch = function(...args) { const url = args[0]; if (typeof url === 'string') { // 拦截广告相关请求 if (url.match(/ad|advert|commercial|sponsor/i)) { console.log('[广告拦截] 拦截请求:', url); return Promise.resolve(new Response('{}', { status: 200, headers: { 'Content-Type': 'application/json' } })); } } return originalFetch.apply(this, args); }; // 拦截 XMLHttpRequest const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url, ...rest) { if (typeof url === 'string' && url.match(/ad|advert|commercial|sponsor/i)) { console.log('[广告拦截] 拦截XHR:', url); // 修改URL使其返回空数据 arguments[1] = 'data:application/json;base64,eyJkYXRhIjpbXX0='; } return originalOpen.apply(this, arguments); }; } // ==================== 清理视频播放器 ==================== function cleanVideoPlayer() { // 查找视频播放器并清理广告层 const videoPlayers = document.querySelectorAll('video, .video-player, .player-container, #player'); videoPlayers.forEach(player => { // 移除播放器上的广告覆盖层 const parent = player.parentElement; if (parent) { const overlays = parent.querySelectorAll('[class*="ad"], [id*="ad"]'); overlays.forEach(overlay => overlay.remove()); } }); // 自动跳过广告 const skipButtons = document.querySelectorAll( '.ad-skip, .skip-ad, [class*="skip"], [id*="skip"], ' + '.txp-ad-skip, .qy-player-ad-skip, .yk-ad-skip' ); skipButtons.forEach(btn => { if (btn.style.display !== 'none') { btn.click(); console.log('[广告拦截] 自动跳过广告'); } }); } // ==================== MutationObserver 监听DOM变化 ==================== function observeDOM() { const observer = new MutationObserver((mutations) => { let shouldClean = false; mutations.forEach(mutation => { if (mutation.addedNodes.length > 0) { shouldClean = true; } }); if (shouldClean) { removeAds(); cleanVideoPlayer(); } }); observer.observe(document.body, { childList: true, subtree: true }); return observer; } // ==================== 初始化 ==================== function init() { console.log('[广告拦截] 脚本已启动 - 支持B站、优酷、爱奇艺、腾讯视频、芒果TV等主流视频网站'); // 立即执行一次 removeAds(); // 拦截视频广告请求 blockVideoAds(); // 清理视频播放器 cleanVideoPlayer(); // 监听DOM变化 if (document.body) { observeDOM(); } else { // 等待body加载 const checkBody = setInterval(() => { if (document.body) { clearInterval(checkBody); observeDOM(); } }, 10); } // 定期清理(每2秒) setInterval(() => { removeAds(); cleanVideoPlayer(); }, 2000); } // 启动脚本 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();