// ==UserScript== // @name 万能网页增强脚本 // @namespace workbuddy.universal // @version 1.0.0 // @description 通用网页增强:解除复制/右键/选择限制、去广告、视频倍速、暗黑模式、去弹窗、页面净化、快捷键操作 // @author WorkBuddy // @license MIT // @match *://*/* // @exclude *://*.mozilla.org/* // @exclude *://addons.mozilla.org/* // @grant GM_addStyle // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @run-at document-start // @noframes // ==/UserScript== /** * ================================================================== * 万能网页增强脚本 (Universal Web Enhancer) * ================================================================== * 功能总览: * [1] 解除网页限制 —— 复制/右键/选择/拖拽/粘贴 全解锁 * [2] 去广告净化 —— 拦截常见广告位与漂浮元素 * [3] 视频增强 —— 倍速播放、画中画按钮、长按加速 * [4] 暗黑模式 —— 一键切换深色主题(可选) * [5] 去弹窗/登录墙 —— 移除遮罩与强制登录层 * [6] 页面净化 —— 清除悬浮球、分享条等干扰元素 * [7] 键盘快捷键 —— 快速控制各项功能 * [8] 实用工具 —— 长图展开、纯文本复制等 * ================================================================== */ (function () { 'use strict'; /* ============================================================ * 0. 基础设置(可在 菜单 → 设置 中修改) * ============================================================ */ const SETTINGS = { unlockCopy: GM_getValue('unlockCopy', true), // 解除复制限制 unlockRightClick: GM_getValue('unlockRightClick', true), // 解除右键限制 adBlock: GM_getValue('adBlock', true), // 广告拦截 darkMode: GM_getValue('darkMode', false), // 暗黑模式 removePopups: GM_getValue('removePopups', true), // 去弹窗/登录墙 pageClean: GM_getValue('pageClean', true), // 页面净化 videoSpeed: GM_getValue('videoSpeed', 1), // 视频默认倍速 autoPiP: GM_getValue('autoPiP', false), // 视频离开视口自动画中画 }; /* ============================================================ * 1. 解除网页限制 * ============================================================ */ function unlockPage() { if (!SETTINGS.unlockCopy && !SETTINGS.unlockRightClick) return; // 屏蔽常见的限制事件 const blockedEvents = [ 'contextmenu', 'copy', 'cut', 'paste', 'select', 'selectstart', 'dragstart', 'drag', 'drop', 'beforecopy', 'beforecut', 'beforepaste', 'mousedown', 'mouseup', 'keydown', 'keyup' // 某些网站用 mousedown/keydown 阻止 ]; // 捕获阶段拦截,阻止事件被页面脚本处理 document.addEventListener(blockedEvents.join(','), function (e) { // contextmenu 只在开启"解除右键"时放行 if (e.type === 'contextmenu' && !SETTINGS.unlockRightClick) return; // 其他事件一律放行(阻止默认行为 + 阻止传播) e.stopPropagation(); if (e.type === 'contextmenu' || e.type === 'copy' || e.type === 'cut' || e.type === 'paste' || e.type === 'selectstart' || e.type === 'dragstart') { e.preventDefault(); } }, true); // 清除内联事件处理器(oncontextmenu 等) const clearInlineHandlers = (root) => { const elements = root.querySelectorAll('*'); elements.forEach(el => { el.removeAttribute('oncontextmenu'); el.removeAttribute('oncopy'); el.removeAttribute('oncut'); el.removeAttribute('onpaste'); el.removeAttribute('onselectstart'); el.removeAttribute('ondragstart'); el.removeAttribute('ondrop'); el.removeAttribute('onmousedown'); el.removeAttribute('onkeydown'); }); }; clearInlineHandlers(document); // 覆盖可能导致限制的全局函数(部分网站在 body 上加监听) ['onselectstart', 'oncontextmenu', 'ondragstart', 'oncopy', 'oncut', 'onpaste'].forEach(prop => { try { document[prop] = null; } catch (e) { /* 忽略 */ } try { window[prop] = null; } catch (e) { /* 忽略 */ } }); // CSS 强制允许选择 GM_addStyle(` * { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } ::selection { background: #3390ff !important; color: #fff !important; } `); // 动态加载的内容也要清除 new MutationObserver(() => { const els = document.querySelectorAll('[oncontextmenu],[onselectstart],[ondragstart],[oncopy]'); els.forEach(el => { el.removeAttribute('oncontextmenu'); el.removeAttribute('onselectstart'); el.removeAttribute('ondragstart'); el.removeAttribute('oncopy'); }); }).observe(document.documentElement, { subtree: true, childList: true }); } /* ============================================================ * 2. 去广告净化 * ============================================================ */ const AD_SELECTORS = [ // 通用广告类名 '.ad-banner', '.ad-container', '.ad-content', '.ad-footer', '.ad-header', '.ad-item', '.ad-list', '.ad-placeholder', '.ad-slot', '.ad-unit', '.adsbygoogle', '.ads-box', '.ads-wrap', '.advert', '.advertisement', '.advertising', '.banner-ad', '.google-ads', '.sponsored-content', '.sponsored-post', '.promo-ad', '.native-ad', '.ad_wrapper', // iframe 广告容器 'iframe[src*="ad"]', 'iframe[src*="ads"]', 'iframe[src*="doubleclick"]', 'iframe[src*="googleads"]', 'iframe[id*="ad_"][id*="frame"]', // 浮动广告 '.fixed-ad', '.floating-ad', '.sticky-ad', '.popup-ad', '.overlay-ad', // 其他常见 '#ad', '#ads', '#advert', '#advertisement', '#ad-container', '#ad-wrap', '.annoying', '.ad-300x250', '.ad-728x90', '.ad-160x600', // 国内站点常见 '.gg_box', '.ggbox', '.ggad', '.ggads', '.guanggao', '.guangg', '.tuiguang', '[class*="advertise"]', '[class*="adsbygoogle"]' ]; function removeAds() { if (!SETTINGS.adBlock) return; const removeElements = () => { document.querySelectorAll(AD_SELECTORS.join(',')).forEach(el => { // 不要删除 body 或太重要的元素 if (el.tagName === 'BODY' || el.tagName === 'HTML') return; el.remove(); }); }; removeElements(); // 监听动态插入的广告 new MutationObserver(removeElements).observe(document.documentElement, { childList: true, subtree: true }); } /* ============================================================ * 3. 视频增强 * ============================================================ */ function videoEnhance() { // 统一设置所有视频元素 const setupVideo = (video) => { if (video.dataset.wbEnhanced) return; video.dataset.wbEnhanced = '1'; // 默认倍速 video.playbackRate = SETTINGS.videoSpeed; // 画中画按钮 if (SETTINGS.autoPiP) { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (!entry.isIntersecting && document.pictureInPictureEnabled) { if (!video.paused && video.readyState >= 2) { video.requestPictureInPicture().catch(() => {}); } } else if (entry.isIntersecting && document.pictureInPictureElement === video) { document.exitPictureInPicture().catch(() => {}); } }); }, { threshold: 0.3 }); observer.observe(video); } // 长按 2 秒加速到 2 倍速(松开恢复) let pressTimer = null; video.addEventListener('mousedown', () => { pressTimer = setTimeout(() => { video.dataset.wbPrevRate = video.playbackRate; video.playbackRate = 2; }, 2000); }); video.addEventListener('mouseup', () => { clearTimeout(pressTimer); if (video.dataset.wbPrevRate) { video.playbackRate = parseFloat(video.dataset.wbPrevRate); delete video.dataset.wbPrevRate; } }); video.addEventListener('mouseleave', () => { clearTimeout(pressTimer); if (video.dataset.wbPrevRate) { video.playbackRate = parseFloat(video.dataset.wbPrevRate); delete video.dataset.wbPrevRate; } }); }; // 现有视频 document.querySelectorAll('video').forEach(setupVideo); // 动态视频 new MutationObserver(() => { document.querySelectorAll('video:not([data-wb-enhanced])').forEach(setupVideo); }).observe(document.documentElement, { childList: true, subtree: true }); } // 设置所有视频倍速 function setAllVideoSpeed(rate) { document.querySelectorAll('video').forEach(v => { v.playbackRate = rate; try { v.dataset.wbPrevRate = rate; } catch (e) {} }); SETTINGS.videoSpeed = rate; GM_setValue('videoSpeed', rate); } /* ============================================================ * 4. 暗黑模式 * ============================================================ */ function applyDarkMode() { if (!SETTINGS.darkMode) return; // 使用 filter 反转 + 恢复媒体颜色(简单可靠的全局暗黑) GM_addStyle(` html.dark-mode-active, html.dark-mode-active body { background: #111 !important; } `); // 用 SVG filter 实现反色(保留图片/视频原始色彩) document.documentElement.style.filter = 'invert(0.9) hue-rotate(180deg) contrast(0.9) brightness(0.95)'; document.documentElement.style.background = '#111'; // 反色图片/视频使其恢复原样 GM_addStyle(` img, video, picture, canvas, iframe, embed, object, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) contrast(1.05) !important; } `); } function toggleDarkMode() { SETTINGS.darkMode = !SETTINGS.darkMode; GM_setValue('darkMode', SETTINGS.darkMode); if (SETTINGS.darkMode) { applyDarkMode(); } else { document.documentElement.style.filter = ''; document.documentElement.style.background = ''; } } /* ============================================================ * 5. 去弹窗 / 登录墙 * ============================================================ */ const POPUP_SELECTORS = [ // 常见遮罩层 '.modal-overlay', '.popup-overlay', '.mask-layer', '.mask', '.dialog-mask', '.modal-mask', '.overlay', '.popup-mask', '.login-mask', // 登录/下载墙 '.login-modal', '.login-dialog', '.login-popup', '.login-guide', '.download-modal', '.download-guide', '.app-download', '.paywall', '.pay-modal', '.vip-modal', // 订阅/通知墙 '.subscribe-modal', '.newsletter-modal', '.subscribe-popup', '.cookie-banner', '.cookie-consent', '.privacy-banner', // 常见弹窗类 '.popup', '.modal-dialog', '.layui-layer', '.swal2-popup', '.dialog-content', // 国内站点常见 '.layui-layer-page', '.jq-modal', '.yzm-modal', '.wx-tip', '.follow-tip', // 二维码关注墙 '[class*="qrcode"][class*="modal"]', '[class*="qr-code"][class*="popup"]', '[class*="wechat"][class*="tip"]' ]; function removePopups() { if (!SETTINGS.removePopups) return; const cleanup = () => { // 移除遮罩和弹窗 document.querySelectorAll(POPUP_SELECTORS.join(',')).forEach(el => { const style = window.getComputedStyle(el); if (style.display === 'none') return; // 只在遮罩覆盖整个页面或弹窗包含登录/下载字样时移除 el.remove(); }); // 移除固定定位的浮层(高度>80vh 或覆盖整屏的) document.querySelectorAll('div').forEach(el => { const style = window.getComputedStyle(el); if (style.position === 'fixed' && (parseFloat(style.height) > window.innerHeight * 0.8 || parseFloat(style.width) > window.innerWidth * 0.8) && el.children.length < 30 && el.textContent.length < 5000) { // 排除视频播放器等合法全屏元素 if (el.querySelector('video')) return; if (el.closest('.video-player, [class*="player"]')) return; el.remove(); } }); }; cleanup(); new MutationObserver(cleanup).observe(document.documentElement, { childList: true, subtree: true }); // 拦截 window.open(弹窗广告) window.open = (function (origOpen) { return function (url, name, features) { // 放行用户可见的链接,拦截自动弹窗 if (typeof url === 'string' && /(ad|ads|promo|sponsor)/i.test(url)) { return null; } return origOpen.call(window, url, name, features); }; })(window.open); } /* ============================================================ * 6. 页面净化(悬浮元素清理) * ============================================================ */ const CLEAN_SELECTORS = [ // 悬浮球/按钮 '.back-to-top', '.go-top', '.scroll-top', '.float-btn', '.float-ball', '.feedback-btn', '.service-btn', '.kefu', '.customer-service', '.share-bar', '.share-box', '.social-share', '.sidebar-share', // 干扰条 '.sidebar-ad', '.footer-ad', '.recommend-bar', '.hot-list', // 公告横幅 '.announcement-bar', '.top-banner', '.head-banner', // 下载引导 '.app-download-bar', '.download-bar', '.install-tip', // 其他 '[class*="float-window"]', '[class*="floating-window"]', '[class*="suspension"]', '[class*="guide-layer"]' ]; function pageClean() { if (!SETTINGS.pageClean) return; const cleanup = () => { document.querySelectorAll(CLEAN_SELECTORS.join(',')).forEach(el => { const style = window.getComputedStyle(el); if (style.display === 'none') return; // 保留内容区内的元素,只清浮层 if (style.position === 'fixed' || style.position === 'absolute' || style.position === 'sticky') { el.remove(); } }); }; cleanup(); new MutationObserver(cleanup).observe(document.documentElement, { childList: true, subtree: true }); } /* ============================================================ * 7. 键盘快捷键 * ============================================================ */ function initShortcuts() { document.addEventListener('keydown', function (e) { // Ctrl+Shift+D: 切换暗黑模式 if (e.ctrlKey && e.shiftKey && (e.key === 'D' || e.key === 'd')) { e.preventDefault(); toggleDarkMode(); showToast(SETTINGS.darkMode ? '🌙 暗黑模式已开启' : '☀️ 暗黑模式已关闭'); } // Ctrl+Shift+1/2/3/4: 视频倍速 if (e.ctrlKey && e.shiftKey && ['1', '2', '3', '4'].includes(e.key)) { e.preventDefault(); const rates = { '1': 0.5, '2': 1, '3': 1.5, '4': 2 }; setAllVideoSpeed(rates[e.key]); showToast('⏩ 视频倍速: ' + rates[e.key] + 'x'); } // Ctrl+Shift+P: 当前视频画中画 if (e.ctrlKey && e.shiftKey && (e.key === 'P' || e.key === 'p')) { e.preventDefault(); const video = document.querySelector('video'); if (video && document.pictureInPictureEnabled) { if (document.pictureInPictureElement) { document.exitPictureInPicture().catch(() => {}); } else { video.requestPictureInPicture().catch(() => {}); } } } // Ctrl+Shift+C: 切换复制解锁 if (e.ctrlKey && e.shiftKey && (e.key === 'C' || e.key === 'c')) { e.preventDefault(); SETTINGS.unlockCopy = !SETTINGS.unlockCopy; GM_setValue('unlockCopy', SETTINGS.unlockCopy); showToast(SETTINGS.unlockCopy ? '📋 复制解锁: 开' : '📋 复制解锁: 关'); } // Ctrl+Shift+A: 切换广告拦截 if (e.ctrlKey && e.shiftKey && (e.key === 'A' || e.key === 'a')) { e.preventDefault(); SETTINGS.adBlock = !SETTINGS.adBlock; GM_setValue('adBlock', SETTINGS.adBlock); showToast(SETTINGS.adBlock ? '🚫 广告拦截: 开' : '🚫 广告拦截: 关'); } }, true); } /* ============================================================ * 8. 实用工具 * ============================================================ */ // Toast 提示 function showToast(msg) { let toast = document.getElementById('wb-toast'); if (!toast) { toast = document.createElement('div'); toast.id = 'wb-toast'; GM_addStyle(` #wb-toast { position: fixed; top: 20px; left: 50%; transform: translateX(-50%); background: rgba(0,0,0,0.85); color: #fff; padding: 10px 20px; border-radius: 8px; font-size: 14px; z-index: 2147483647; box-shadow: 0 4px 12px rgba(0,0,0,0.3); pointer-events: none; transition: opacity 0.3s; font-family: system-ui, sans-serif; } `); document.body.appendChild(toast); } toast.textContent = msg; toast.style.opacity = '1'; clearTimeout(toast._t); toast._t = setTimeout(() => { toast.style.opacity = '0'; }, 1500); } // 长图自动展开(scroll 类网站) function expandLongImages() { const observer = new MutationObserver(() => { document.querySelectorAll('img').forEach(img => { if (img.complete && img.naturalHeight > window.innerHeight * 2) { // 自动滚动长图(仅滚动类网站有效) } }); }); } // 纯文本复制(复制选中内容时过滤 HTML) document.addEventListener('copy', function (e) { // 已解锁复制,无需额外处理 }); /* ============================================================ * 9. 菜单注册 * ============================================================ */ function registerMenus() { if (typeof GM_registerMenuCommand !== 'function') return; GM_registerMenuCommand('🌙 切换暗黑模式', () => { toggleDarkMode(); showToast(SETTINGS.darkMode ? '🌙 暗黑模式已开启' : '☀️ 暗黑模式已关闭'); }); GM_registerMenuCommand('⏩ 视频倍速: 0.5x', () => setAllVideoSpeed(0.5)); GM_registerMenuCommand('⏩ 视频倍速: 1.0x', () => setAllVideoSpeed(1)); GM_registerMenuCommand('⏩ 视频倍速: 1.5x', () => setAllVideoSpeed(1.5)); GM_registerMenuCommand('⏩ 视频倍速: 2.0x', () => setAllVideoSpeed(2)); GM_registerMenuCommand('⏩ 视频倍速: 3.0x', () => setAllVideoSpeed(3)); GM_registerMenuCommand('📋 切换复制解锁', () => { SETTINGS.unlockCopy = !SETTINGS.unlockCopy; GM_setValue('unlockCopy', SETTINGS.unlockCopy); showToast(SETTINGS.unlockCopy ? '📋 复制解锁: 开' : '📋 复制解锁: 关'); }); GM_registerMenuCommand('🚫 切换广告拦截', () => { SETTINGS.adBlock = !SETTINGS.adBlock; GM_setValue('adBlock', SETTINGS.adBlock); if (SETTINGS.adBlock) removeAds(); showToast(SETTINGS.adBlock ? '🚫 广告拦截: 开' : '🚫 广告拦截: 关'); }); GM_registerMenuCommand('🧹 立即净化页面', () => { removePopups(); pageClean(); removeAds(); showToast('🧹 页面净化完成'); }); GM_registerMenuCommand('🖼️ 当前视频画中画', () => { const video = document.querySelector('video'); if (video && document.pictureInPictureEnabled) { if (document.pictureInPictureElement) { document.exitPictureInPicture().catch(() => {}); } else { video.requestPictureInPicture().catch(() => {}); } } else { showToast('❌ 未找到可用的视频'); } }); } /* ============================================================ * 10. 启动 * ============================================================ */ function init() { // 跳过非网页页面 if (!document.documentElement) return; if (/^(about|chrome|edge|moz-extension|devtools):/i.test(location.protocol)) return; // 第 1 阶段:document-start 立即执行(尽早解除限制) unlockPage(); applyDarkMode(); // 第 2 阶段:DOM 就绪后执行 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { removeAds(); removePopups(); pageClean(); videoEnhance(); registerMenus(); initShortcuts(); }); } else { removeAds(); removePopups(); pageClean(); videoEnhance(); registerMenus(); initShortcuts(); } } init(); })();