Greasy Fork

【最强】【最全面】【全网页可用】【持续更新中】解除禁止复制和粘贴限制并支持手动粘贴

⭐学习通⭐pta⭐csdn⭐飞书云文档⭐破解所有网站【禁止复制】和【禁止粘贴】限制,支持【模拟人工输入】。安装后,打开目标网页即可解除限制。若粘贴解锁不生效,可以使用ctrl+m呼出浮动输入框进行模拟人工输入,详情请阅读下方说明。有疑问或者反馈都可以发我邮箱啊:[email protected]

目前为 2024-12-31 提交的版本。查看 最新版本

// ==UserScript==
// @name         【最强】【最全面】【全网页可用】【持续更新中】解除禁止复制和粘贴限制并支持手动粘贴
// @namespace    http://jiangning_sama/pojie_cpoy.net/
// @version      7.3.2
// @description  ⭐学习通⭐pta⭐csdn⭐飞书云文档⭐破解所有网站【禁止复制】和【禁止粘贴】限制,支持【模拟人工输入】。安装后,打开目标网页即可解除限制。若粘贴解锁不生效,可以使用ctrl+m呼出浮动输入框进行模拟人工输入,详情请阅读下方说明。有疑问或者反馈都可以发我邮箱啊:[email protected]
// @author       江宁sama
// @match        *://*/*
// @exclude      https://chatgpt.com/*
// @exclude      https://www.bilibili.com/*
// @exclude      https://www.bing.com/*
// @exclude      https://fanyi.*/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==

/*
 * 免责声明:
 * 本脚本为教育和学习用途而开发,旨在帮助用户了解网页元素的控制与交互操作。
 * 使用本脚本即表示用户同意自行承担由此带来的一切风险和后果,开发者不对因使用本脚本
 * 造成的任何直接或间接损失负责。
 * 
 * 请勿使用本脚本用于任何违反服务条款、侵害他人权益或违反当地法律法规的行为。
 * 建议仅在个人测试环境中使用,不建议用于生产环境或未经授权的网页。
 * 
 * 使用前请务必仔细阅读本免责声明,开发者保留随时更改或终止该脚本的权利。
 */

(function () {
    'use strict';

    // 环境判断
    const isFeishuPage = /feishu\.cn|larkoffice\.com/.test(window.location.hostname);
    const isChaoxingPage = /chaoxing\.com/.test(window.location.hostname);

    // 通用工具函数
    const utils = {
        /**
         * 移除VIP遮罩层
         */
        removeVipMask: () => {
            try {
                const masks = document.querySelectorAll('div[class*="hide-article"], div[class*="overlay"], div[class*="mask"]');
                masks.forEach(mask => {
                    mask.style.display = 'none';
                    mask.remove();
                });
                document.body.style.overflow = 'auto';
                document.body.style.pointerEvents = 'auto';
            } catch (e) {
                console.error('Failed to remove VIP mask:', e);
            }
        },

        /**
         * 强制移除所有元素的样式限制
         */
        forceRemoveStyles: () => {
            try {
                document.querySelectorAll('*').forEach(el => {
                    el.style.userSelect = 'auto';
                    el.style.pointerEvents = 'auto';
                });
            } catch (e) {
                console.error('Failed to remove styles:', e);
            }
        },

        /**
         * 动态监听并移除VIP遮罩层
         */
        observeVipMask: () => {
            try {
                const observer = new MutationObserver(() => utils.removeVipMask());
                observer.observe(document.body, { childList: true, subtree: true });
                utils.removeVipMask();
            } catch (e) {
                console.error('Failed to observe VIP mask:', e);
            }
        },

        /**
         * 移除特定事件监听器
         */
        removeSpecificEventListeners: () => {
            try {
                ['copy', 'cut', 'paste', 'contextmenu', 'selectstart'].forEach(event => {
                    document.body.addEventListener(event, e => e.stopImmediatePropagation(), true);
                });
            } catch (e) {
                console.error('Failed to remove event listeners:', e);
            }
        },

        /**
         * 解锁CSS限制
         */
        unlockCssRestrictions: () => {
            try {
                document.querySelectorAll('*:not([data-unlock-applied])').forEach(el => {
                    el.style.userSelect = 'auto';
                    el.style.pointerEvents = 'auto';
                    el.setAttribute('data-unlock-applied', 'true');
                });
            } catch (e) {
                console.error('Failed to unlock CSS restrictions:', e);
            }
        },

        /**
         * 拦截XHR请求并修改响应
         */
        interceptXHR: () => {
            try {
                const rawOpen = XMLHttpRequest.prototype.open;
                XMLHttpRequest.prototype.open = function (method, url, ...rest) {
                    this.addEventListener('readystatechange', () => {
                        if (this.readyState === 4) {
                            try {
                                const jsonResponse = JSON.parse(this.responseText);
                                if (jsonResponse.data && jsonResponse.data.actions && jsonResponse.data.actions.copy !== 1) {
                                    jsonResponse.data.actions.copy = 1;
                                    Object.defineProperty(this, 'responseText', { value: JSON.stringify(jsonResponse) });
                                    Object.defineProperty(this, 'response', { value: jsonResponse });
                                }
                            } catch (e) {
                                console.error('Failed to modify response:', e);
                            }
                        }
                    }, false);
                    rawOpen.call(this, method, url, ...rest);
                };
            } catch (e) {
                console.error('Failed to intercept XHR:', e);
            }
        },

        /**
         * 自定义复制处理
         */
        customCopyHandler: () => {
            try {
                document.addEventListener('keydown', e => {
                    if (e.ctrlKey && e.key === 'c') {
                        e.preventDefault();
                        e.stopPropagation();
                        try {
                            document.execCommand('copy');
                            console.log("Content copied to clipboard!");
                        } catch (err) {
                            console.error("Copy operation failed:", err);
                        }
                    }
                }, true);
            } catch (e) {
                console.error('Failed to set custom copy handler:', e);
            }
        },

        /**
         * 创建浮动输入框
         */
        createFloatingInputBox: () => {
            try {
                if (document.getElementById('floatingInputBox')) return;

                const floatingBox = document.createElement('div');
                floatingBox.id = 'floatingInputBox';
                Object.assign(floatingBox.style, {
                    position: 'fixed',
                    top: '20px',
                    right: '20px',
                    width: '300px',
                    padding: '10px',
                    backgroundColor: 'white',
                    border: '1px solid black',
                    zIndex: '10000'
                });

                const closeButton = document.createElement('button');
                closeButton.textContent = '关闭';
                closeButton.style.marginBottom = '10px';
                closeButton.onclick = () => document.body.removeChild(floatingBox);

                const textarea = document.createElement('textarea');
                Object.assign(textarea.style, {
                    width: '100%',
                    height: '80px'
                });
                textarea.placeholder = '在此粘贴内容,然后按 Enter';
                textarea.addEventListener('keydown', function (e) {
                    if (e.key === 'Enter') {
                        e.preventDefault();
                        const text = textarea.value;
                        document.body.removeChild(floatingBox);
                        if (targetElement) {
                            utils.typeTextSlowly(targetElement, text);
                        }
                    } else if (e.key === 'Escape') {
                        document.body.removeChild(floatingBox);
                    }
                });

                floatingBox.appendChild(closeButton);
                floatingBox.appendChild(textarea);
                document.body.appendChild(floatingBox);
                textarea.focus();
            } catch (e) {
                console.error('Failed to create floating input box:', e);
            }
        },

        /**
         * 缓慢输入文本
         */
        typeTextSlowly: (element, text) => {
            try {
                let i = 0;
                function typeChar() {
                    if (i < text.length) {
                        utils.insertChar(element, text[i]);
                        i++;
                        requestAnimationFrame(typeChar);
                    }
                }
                typeChar();
            } catch (e) {
                console.error('Failed to type text slowly:', e);
            }
        },

        /**
         * 插入字符
         */
        insertChar: (element, char) => {
            try {
                if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
                    element.focus();
                    document.execCommand('insertText', false, char);
                } else if (element.isContentEditable) {
                    element.focus();
                    document.execCommand('insertText', false, char);
                }
            } catch (e) {
                console.error('Failed to insert char:', e);
            }
        }
    };

    // 飞书专用功能
    const feishuScript = () => {
        try {
            const overrideEventListeners = () => {
                const rawAddEventListener = EventTarget.prototype.addEventListener;
                EventTarget.prototype.addEventListener = function (type, listener, options) {
                    if (['copy', 'contextmenu'].includes(type)) {
                        rawAddEventListener.call(this, type, event => {
                            event.stopImmediatePropagation();
                            if (type === 'contextmenu') {
                                return listener(event);
                            }
                        }, options);
                        return;
                    }
                    rawAddEventListener.call(this, type, listener, options);
                };
            };

            const overrideXHR = () => {
                utils.interceptXHR();
            };

            overrideEventListeners();
            overrideXHR();
        } catch (e) {
            console.error('Failed to execute feishu script:', e);
        }
    };

    // 通用解锁功能
    const universalUnlockScript = () => {
        try {
            utils.observeVipMask();
            utils.removeSpecificEventListeners();
            utils.unlockCssRestrictions();
            utils.interceptXHR();
            utils.customCopyHandler();
        } catch (e) {
            console.error('Failed to execute universal unlock script:', e);
        }
    };

    // 手动粘贴功能
    let targetElement = null;

    document.addEventListener('keydown', function (event) {
        if (event.ctrlKey && event.key === 'm') {
            event.preventDefault();
            targetElement = document.activeElement;
            utils.createFloatingInputBox();
        }
    });

    // 初始化
    document.addEventListener('DOMContentLoaded', () => {
        try {
            if (isFeishuPage) {
                feishuScript();
            } else {
                universalUnlockScript();
            }
        } catch (e) {
            console.error('Failed to initialize script:', e);
        }
    });
})();