// ==UserScript== // @name CSDN文库VIP答案解锁复制 // @namespace csdn.wenku.unlock // @version 1.0.0 // @description 🔥 专门针对wenku.csdn.net的答案解锁,移除遮罩、解锁复制、尝试显示隐藏答案 // @author 参考52pojie方案 // @match *://wenku.csdn.net/* // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; console.log('[WenkuUnlock] CSDN文库解锁器启动...'); // ========== 第一步:注入CSS移除所有限制 ========== const style = document.createElement('style'); style.textContent = ` /* 移除VIP遮罩 */ .vip-mask, .open, .vip, .vip-limit-mask, .pay-wall, .hide-article-box, .column-mask, .login-mask, .passport-login-container, .login-container, .login-box { display: none !important; visibility: hidden !important; } /* 展开内容区域 */ .article-box .cont.first-show, .article-box .cont, .content-box, .answer-content { max-height: none !important; height: auto !important; overflow: visible !important; } /* 移除模糊 */ .blur, .blur-content, .vip-blur { filter: none !important; } /* 启用复制 */ body, .article-box, .cont, .answer-content { -webkit-user-select: text !important; user-select: text !important; } /* 移除按钮 */ .btn-readmore, .show-more-btn, .open-btn, .vip-btn { display: none !important; } `; // 安全注入CSS const injectCSS = () => { if (document.head) { document.head.appendChild(style); return true; } return false; }; if (!injectCSS()) { document.addEventListener('DOMContentLoaded', injectCSS); } // ========== 第二步:核心解锁函数 ========== const unlock = () => { // 1. 移除所有遮罩层 document.querySelectorAll('.vip-mask, .open, .vip, .hide-article-box, .login-mask').forEach(el => { el.remove(); console.log('[WenkuUnlock] 移除遮罩:', el.className); }); // 2. 展开内容区域(关键!) const selectors = [ '.article-box .cont.first-show', '.article-box .cont', '.content-box', '.answer-content', '.article-content' ]; selectors.forEach(sel => { document.querySelectorAll(sel).forEach(el => { el.style.maxHeight = 'none'; el.style.height = 'auto'; el.style.overflow = 'visible'; console.log('[WenkuUnlock] 展开内容:', sel); }); }); // 3. 移除模糊效果 document.querySelectorAll('.blur, .blur-content, .vip-blur').forEach(el => { el.style.filter = 'none'; }); // 4. 启用复制 document.body.oncopy = null; document.oncopy = null; document.querySelectorAll('*').forEach(el => { el.style.userSelect = 'text'; }); }; // ========== 第三步:劫持点击事件 ========== // 阻止跳转到开通会员页面 document.addEventListener('click', (e) => { const target = e.target; // 检查是否点击了"查看答案"或类似按钮 if (target.textContent.includes('查看') || target.textContent.includes('答案') || target.className.includes('open') || target.className.includes('vip')) { console.log('[WenkuUnlock] 拦截点击:', target.textContent); // 阻止默认行为 e.preventDefault(); e.stopPropagation(); // 尝试解锁 unlock(); // 如果内容已经加载但没显示,强制显示 document.querySelectorAll('[style*="display: none"]').forEach(el => { if (el.textContent.length > 50) { // 假设内容较长 el.style.display = 'block'; console.log('[WenkuUnlock] 强制显示隐藏内容'); } }); return false; } }, true); // ========== 第四步:多次执行解锁 ========== unlock(); setTimeout(unlock, 100); setTimeout(unlock, 500); setTimeout(unlock, 1000); setTimeout(unlock, 2000); // 页面加载完成后 window.addEventListener('load', () => { unlock(); setTimeout(unlock, 1000); }); // ========== 第五步:监听DOM变化 ========== const startObserver = () => { if (!document.body) { setTimeout(startObserver, 100); return; } const observer = new MutationObserver((mutations) => { let needUnlock = false; mutations.forEach((mutation) => { if (mutation.addedNodes.length > 0) { needUnlock = true; } }); if (needUnlock) { unlock(); } }); observer.observe(document.body, { childList: true, subtree: true }); console.log('[WenkuUnlock] DOM观察者已启动'); }; startObserver(); console.log('[WenkuUnlock] 初始化完成!'); console.log('[WenkuUnlock] 现在点击"查看答案"应该可以直接显示内容'); })();