如何解除网页不让复制?

长腿白菜
长腿白菜
发布于 2025-03-17 / 7 阅读
0
0

如何解除网页不让复制?

方法1:使用替代的DOM遍历和事件劫持方式:

(function() {
    // 使用改进的方法清除限制
    function enableTextSelection() {
        // 创建并应用强制允许选择的样式
        const style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = `
            * {
                -webkit-user-select: text !important;
                -moz-user-select: text !important;
                -ms-user-select: text !important;
                user-select: text !important;
                -webkit-touch-callout: default !important;
            }
            ::selection {
                background: #3390ff !important;
                color: #fff !important;
            }
        `;
        document.head.appendChild(style);
        
        // 递归地移除所有限制
        function processNode(node) {
            if (node.nodeType === 1) { // 元素节点
                node.style.setProperty('user-select', 'text', 'important');
                node.style.setProperty('-webkit-user-select', 'text', 'important');
                node.style.setProperty('-moz-user-select', 'text', 'important');
                node.style.setProperty('-ms-user-select', 'text', 'important');
                
                // 移除可能的事件监听器
                node.oncontextmenu = null;
                node.onselectstart = null;
                node.ondragstart = null;
                node.onmousedown = null;
                node.onmouseup = null;
                node.oncopy = null;
                
                // 处理所有子节点
                for (let i = 0; i < node.childNodes.length; i++) {
                    processNode(node.childNodes[i]);
                }
            }
        }
        
        // 处理整个文档
        processNode(document.documentElement);
        
        // 使用事件捕获拦截所有阻止选择的尝试
        const events = ['selectstart', 'mousedown', 'mouseup', 'contextmenu', 'copy', 'dragstart'];
        events.forEach(eventType => {
            document.addEventListener(eventType, function(e) {
                e.stopImmediatePropagation();
                return true;
            }, true);
            
            // 尝试完全移除这些事件的所有监听器
            const old = Element.prototype.addEventListener;
            Element.prototype.addEventListener = function(type) {
                if (events.includes(type)) {
                    // 不添加这些类型的事件监听器
                    return;
                }
                return old.apply(this, arguments);
            };
        });
    }
    
    // 立即执行一次
    enableTextSelection();
    
    // 每秒执行一次,以应对动态加载的内容或动态添加的限制
    setInterval(enableTextSelection, 1000);
    
    console.log("强制文本选择功能已启用");
})();

方法2:如果你只是想获取页面内容而不一定需要选择和复制,可以使用这个方法来获取页面文本:

(function() {
    // 提取所有可见文本
    function getAllVisibleText() {
        const textNodes = [];
        function extractText(node) {
            if (node.nodeType === 3) { // 文本节点
                const text = node.textContent.trim();
                if (text) textNodes.push(text);
            } else if (node.nodeType === 1) { // 元素节点
                // 检查节点是否可见
                const style = window.getComputedStyle(node);
                if (style.display !== 'none' && style.visibility !== 'hidden') {
                    // 遍历子节点
                    for (let i = 0; i < node.childNodes.length; i++) {
                        extractText(node.childNodes[i]);
                    }
                }
            }
        }
        
        extractText(document.body);
        
        // 创建一个临时元素来显示提取的文本
        const div = document.createElement('div');
        div.style.cssText = `
            position: fixed;
            top: 10px;
            left: 10px;
            right: 10px;
            bottom: 10px;
            background: white;
            color: black;
            padding: 20px;
            z-index: 999999;
            overflow: auto;
            border: 2px solid black;
            font-family: Arial, sans-serif;
            font-size: 14px;
            white-space: pre-wrap;
            user-select: text;
        `;
        
        div.innerHTML = `
            <h2>页面文本内容 (可以选择和复制)</h2>
            <button id="closeBtn" style="position:absolute;top:10px;right:10px;padding:5px;">关闭</button>
            <button id="copyBtn" style="position:absolute;top:10px;right:70px;padding:5px;">复制全部</button>
            <hr>
            <div style="margin-top: 40px;">${textNodes.join('\n\n')}</div>
        `;
        
        document.body.appendChild(div);
        
        // 添加按钮功能
        document.getElementById('closeBtn').onclick = function() {
            document.body.removeChild(div);
        };
        
        document.getElementById('copyBtn').onclick = function() {
            const textToCopy = textNodes.join('\n\n');
            navigator.clipboard.writeText(textToCopy)
                .then(() => alert('文本已复制到剪贴板'))
                .catch(err => console.error('复制失败: ', err));
        };
    }
    
    getAllVisibleText();
    console.log("已提取页面文本内容到可选择区域");
})();

方法3:尝试使用缓慢选择方法(有时网站只阻止快速选择):

(function() {
    // 先应用所有可能的选择样式
    const style = document.createElement('style');
    style.innerHTML = '* {user-select: text !important; -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important;}';
    document.head.appendChild(style);
    
    // 尝试禁用所有JavaScript事件(这可能会破坏页面功能,但可以暂时让你复制文本)
    function disableJS() {
        const disableFor = 10; // 秒
        // 创建覆盖层通知用户
        const overlay = document.createElement('div');
        overlay.style.cssText = 'position:fixed;top:0;left:0;right:0;background:rgba(0,0,0,0.8);color:white;padding:20px;z-index:999999;text-align:center;';
        overlay.innerHTML = `
            <p>已临时禁用JavaScript (${disableFor}秒)。</p>
            <p>现在尝试选择文本。</p>
        `;
        document.body.appendChild(overlay);
        
        // 备份并破坏主要事件函数
        const old = {
            addEventListener: EventTarget.prototype.addEventListener,
            removeEventListener: EventTarget.prototype.removeEventListener,
            dispatchEvent: EventTarget.prototype.dispatchEvent
        };
        
        // 禁用事件系统
        EventTarget.prototype.addEventListener = function(){};
        EventTarget.prototype.removeEventListener = function(){};
        EventTarget.prototype.dispatchEvent = function(){return true;};
        
        // 设置计时器恢复功能
        setTimeout(() => {
            EventTarget.prototype.addEventListener = old.addEventListener;
            EventTarget.prototype.removeEventListener = old.removeEventListener;
            EventTarget.prototype.dispatchEvent = old.dispatchEvent;
            document.body.removeChild(overlay);
        }, disableFor * 1000);
    }
    
    // 执行
    disableJS();
})();

如果这些方法都不起作用,最后的选择是尝试使用浏览器的阅读模式(如果可用),或考虑使用网页截图工具然后通过OCR软件提取文本。


评论