Greasy Fork is available in English.

网页复制破解助手

破解网页防复制限制,支持破解百度文库 (wk.baidu.com)、腾讯文档 (docs.qq.com) 和道客巴巴 (doc88.com) 等网站的文本复制。

// ==UserScript==
// @name        网页复制破解助手
// @namespace   ack20a@gmail.com
// @version     0.1
// @description  破解网页防复制限制,支持破解百度文库 (wk.baidu.com)、腾讯文档 (docs.qq.com) 和道客巴巴 (doc88.com) 等网站的文本复制。
// @author      ack20
// @match       *://*/*
// @grant       none
// @run-at      document-end
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    // 常量定义
    const SCRIPT_NAME = "网页复制破解助手";
    const SUPPORTED_DOMAINS = ["wk.baidu.com", "docs.qq.com", "doc88.com"];
    const SUPER_COPY_CSS = `
        #_copy {
            align-items: center;
            background: #4494d5;
            border-radius: 3px;
            color: #fff;
            cursor: pointer;
            display: flex;
            font-size: 13px;
            height: 30px;
            justify-content: center;
            position: absolute;
            width: 60px;
            z-index: 1000;
        }
        #select-tooltip,#sfModal,.modal-backdrop,div[id^=reader-helper]{
            display: none !important;
        }
        .modal-open {
            overflow: auto !important;
        }
        ._sf_adjust_body {
            padding-right: 0 !important;
        }
        .enable_copy_btns_div {
            position: fixed;
            width: 154px;
            left: 10px;
            top: 45%;
            background: #e7f1ff;
            border: 2px solid #4595d5;
            font-weight: 600;
            border-radius: 2px;
            font-family: -apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;
            z-index: 5000;
        }
        .enable_copy_btns_logo {
            width: 100%;
            background: #4595d5;
            text-align: center;
            font-size: 12px;
            color: #e7f1ff;
            line-height: 30px;
            height: 30px;
        }
        .enable_copy_btns_btn {
            display: block;
            width: 128px;
            height: 28px;
            background: #7f5711;
            border-radius: 4px;
            color: #fff;
            font-size: 12px;
            border: 0;
            outline: 0;
            margin: 8px auto;
            font-weight: 700;
            cursor: pointer;
            opacity: 0.9;
        }
        .enable_copy_btns_btn:hover {
            opacity: 0.8;
        }
        .enable_copy_btns_btn:active {
            opacity: 1;
        }
    `;

    // 注入 CSS 样式
    function injectCSS(css) {
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        (document.head || document.getElementsByTagName('head')[0]).appendChild(style);
    }

    // 检查当前域名是否受支持
    function isDomainSupported() {
        return SUPPORTED_DOMAINS.some(domain => window.location.hostname.includes(domain));
    }

    // 工具函数:移除网页中的复制限制事件
    function removeCopyRestrictions(element) {
        ["copy", "cut", "contextmenu", "selectstart", "mousedown", "mouseup", "mousemove", "keydown", "keypress", "keyup"].forEach(event => {
            element.addEventListener(event, function (e) {
                e.stopPropagation();
                e.stopImmediatePropagation && e.stopImmediatePropagation();
                e.returnValue = true;
            }, { capture: true });
        });
    }

    // 通用破解逻辑
    function genericCrack(domain, $){
        // 显示悬浮复制按钮
        $('body').on('mouseup', function (e) {
            const selection = window.getSelection().toString();
            if (selection) {
                $('#_copy').remove(); // 移除已有的复制按钮
                const copyButtonHtml = `
                    <div id="_copy" style="left:${e.pageX + 30}px;top:${e.pageY}px;"
                    data-clipboard-text="${selection.replace(/"/g, '"')}">复制</div>
                `;
                $('body').append(copyButtonHtml); // 插入新的复制按钮

                // 阻止按钮本身的事件冒泡
                $('#_copy').on('mousedown mouseup', function (e) {
                    e.stopPropagation();
                });

                // 使用 ClipboardJS 库实现复制功能
                const clipboard = new ClipboardJS('#_copy');
                clipboard.on('success', function (e) {
                    $('#_copy').html('复制成功!');
                    setTimeout(function () { $('#_copy').fadeOut(1000); }, 1000);
                    e.clearSelection(); // 清除选区
                });
                clipboard.on('error', function (e) {
                    $('#_copy').html('复制失败!');
                    setTimeout(function () { $('#_copy').fadeOut(1000); }, 1000);
                    e.clearSelection(); // 清除选区
                });
            }
        });

        // 特定网站处理逻辑
        switch (domain) {
            case 'wk.baidu.com':
                $('head').append("<style>@media print { body{ display:block; } }</style>"); // 解决百度文库打印问题
                $('body').addClass('_sf_adjust_body'); // 调整SegmentFault 页面
                $('body').on('click', () => $('body').css('padding-right', 0));
                break;
            case 'docs.qq.com':
                break; // 无特殊处理
            case 'doc88.com':
                // 在脚本注入后执行复制
                setTimeout(async () => {
                    const getSelectedText = eval(localStorage.super_js_copy_doc88); // 获取复制函数
                    const text = await getSelectedText(); // 等待复制结果
                    navigator.clipboard.writeText(text) // 将结果写入剪贴板
                        .then(() => console.log(`${SCRIPT_NAME}: Doc88 文档已复制`))
                        .catch(err => console.error(`${SCRIPT_NAME}: Doc88 文档复制失败 - ${err}`));
                }, 1000);
                break;
        }
    }

    // 加载 ClipboardJS 库
    function loadClipboardJS() {
        if (typeof ClipboardJS === 'undefined') {
            var script = document.createElement("script");
            script.src = 'https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js';
            document.getElementsByTagName("head")[0].appendChild(script);

            // 等待 ClipboardJS 加载完成后执行破解逻辑
            script.onload = function () {
                if (isDomainSupported()) {
                    const $ = jQuery || window.$;
                    injectCSS(SUPER_COPY_CSS);
                    removeCopyRestrictions(document.body); // 移除网页复制限制
                    genericCrack(window.location.hostname, $);
                }
            };
        }
    }

    // 加载 jQuery 库 (如果未加载)
    function loadJQuery() {
        if (typeof jQuery === 'undefined') {
            var script = document.createElement("script");
            script.src = 'https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js';
            document.getElementsByTagName("head")[0].appendChild(script);

            // 等待 jQuery 加载完成后加载 ClipboardJS
            script.onload = loadClipboardJS;
        } else {
            loadClipboardJS();
        }
    }

    // 初始化,加载必要的库
    loadJQuery();
})();