Greasy Fork

Greasy Fork is available in English.

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

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

当前为 2024-12-18 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         【最强】【最全面】【全网页可用】【持续更新中】解除禁止复制和粘贴限制并支持手动粘贴
// @namespace    http://jiangning_sama/pojie_cpoy.net/
// @version      7.3.0
// @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: () => {
            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';
        },

        /**
         * 强制移除所有元素的样式限制
         */
        forceRemoveStyles: () => {
            document.querySelectorAll('*').forEach(el => {
                el.style.userSelect = 'auto';
                el.style.pointerEvents = 'auto';
            });
        },

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

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

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

        /**
         * 拦截XHR请求并修改响应
         */
        interceptXHR: () => {
            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);
            };
        },

        /**
         * 自定义复制处理
         */
        customCopyHandler: () => {
            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);
        }
    };

    // 飞书专用功能
    const feishuScript = () => {
        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();
    };

    // 通用解锁功能
    const universalUnlockScript = () => {
        utils.observeVipMask();
        utils.removeSpecificEventListeners();
        utils.unlockCssRestrictions();
        utils.interceptXHR();
        utils.customCopyHandler();
    };

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

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

    utils.createFloatingInputBox = () => {
        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();
    };

    utils.typeTextSlowly = (element, text) => {
        let i = 0;
        function typeChar() {
            if (i < text.length) {
                utils.insertChar(element, text[i]);
                i++;
                requestAnimationFrame(typeChar);
            }
        }
        typeChar();
    };

    utils.insertChar = (element, char) => {
        if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
            const start = element.selectionStart;
            const end = element.selectionEnd;
            const value = element.value;
            element.value = value.substring(0, start) + char + value.substring(end);
            element.selectionStart = element.selectionEnd = start + 1;
            const inputEvent = new Event('input', { bubbles: true });
            element.dispatchEvent(inputEvent);
        } else if (element.isContentEditable) {
            const textNode = document.createTextNode(char);
            const selection = window.getSelection();
            const range = selection.getRangeAt(0);
            range.insertNode(textNode);
            range.setStartAfter(textNode);
            selection.removeAllRanges();
            selection.addRange(range);
        }
    };

    // 针对超星网课页面的功能
    if (isChaoxingPage) {
        $(function() {
            setTimeout(() => {
                $("body").removeAttr("onselectstart");
                $("html").css("user-select", "unset");
                UE.EventBase.prototype.fireEvent = function() {
                    return null;
                };
            }, 1000);

            if (window.location.href.includes("newMooc=true")) {
                $("<div style='background: #86b430;display:inline;border: solid 1px #6f8e30;color: #FFF;padding: 2px 10px;cursor: pointer;' onclick='copyContentNew(event)'>复制题目</div>").insertAfter($(".colorShallow"));
            } else {
                $("<div style='background: #86b430;display:inline;border: solid 1px #6f8e30;color: #FFF;padding: 2px 10px;cursor: pointer;' onclick='copyContentOld(event)'>复制题目</div>").insertAfter($(".Cy_TItle").find("p"));
            }

            window.copyContentOld = function(event) {
                setTimeout(() => {
                    var range = document.createRange();
                    var selection = window.getSelection();
                    selection.removeAllRanges();
                    range.selectNodeContents($(event.srcElement.parentNode).find("p")[0]);
                    selection.addRange(range);
                    document.execCommand('copy');
                    selection.removeAllRanges();
                    let tips = $("<span style='color:red'>复制成功</span>").appendTo($(event.srcElement.parentNode));
                    setTimeout(() => {
                        tips.remove();
                    }, 1000);
                }, 1000);
            };

            window.copyContentNew = function(event) {
                setTimeout(() => {
                    var range = document.createRange();
                    var selection = window.getSelection();
                    selection.removeAllRanges();
                    range.selectNodeContents($(event.srcElement.nextSibling)[0]);
                    selection.addRange(range);
                    document.execCommand('copy');
                    selection.removeAllRanges();
                    let tips = $("<span style='color:red'>复制成功</span>").insertAfter($(event.srcElement));
                    setTimeout(() => {
                        tips.remove();
                    }, 1000);
                }, 1000);
            };
        });
    }

    // 初始化
    document.addEventListener('DOMContentLoaded', () => {
        if (isFeishuPage) {
            feishuScript();
        } else {
            universalUnlockScript();
        }
    });
})();