tgjarwl的博客

道可道,非常道;名可名,非常名

记录生活,记录更好的自己。


csdn复制斗争史

Life

万物皆可覆盖 - js

声明

本篇基于 TamperMonkey 脚本实现

故事的开始

作为一个白嫖党,在用csdn上面复制东西的时候,发现必须得登录,才能复制,妥妥的心里不开心,于是开始了攻防,研究后发现是通过 css 来限制复制的,于是便写了第一版的脚本

// 移除限制复制功能
if($("#content_views pre")[0])
{
    $("#content_views pre").attr("style","user-select:auto");
}

// 移除限制复制功能
if ($("#content_views pre code")[0])
{
    $("#content_views pre code").attr("style","user-select:auto");
}

// remove 登录后复制
if ($(".hljs-button.signin")[0])
{
    $(".hljs-button.signin").attr("style", "display:none");
}

如此便快活了好一阵子,后来有一天发现有些文章需要关注后才能查看,否则内容就给盖住,当然 开发者工具里面还是能看到的,总不能一直开发者工具吧。 于是通过改 css 样式,干掉了必须关注后才能查看的限制

// remove 关注后查看
if ($("#article_content")[0])
{
    $("#article_content").attr("style","height:auto");
}

// remove 关注后查看
if ($(".hide-article-box.hide-article-pos.text-center")[0])
{
    $(".hide-article-box.hide-article-pos.text-center").attr("style","display:none");
}

攻防升级

但是呢有一天,发现又复制不了了,一复制就 弹登录框,并且也没有复制成功,那么必然是又升级了。于是分析后发现,csdn 又新增了一个 copy 事件的监听。于是想着把这个copy事件给移除了。但是搞了半天, 效果并不理想,于是开始咨询我的人生导师,chat-gpt 。 我的老师跟我说,我给你的方法一定好使,你就先 Get all event handler,然后 再一个一个的 remove 就好了,顺带给我贴了一段代码。最后效果也并不是 如我导师说的那样,看来光说不练,ai也是会骗人的。

万物皆可覆盖

最后在一篇文章里面找到了这句话,js的世界,万物皆可覆盖,只要你注册的比他早,然后不把消息传递下去,那他就只能干瞪眼。这句话一下轰开了我理解js的大门,顺便又给了一句代码


// 阻止复制时弹窗,然后禁止复制的变态行为
window.addEventListener('copy', function(e){e.stopPropagation()}, true);

于是乎事情完美的解决了

完整代码

以下代码是 TamperMonkey 的脚本代码,后果自负

// ==UserScript==
// @name         去掉csdn登录复制限制
// @namespace    https://tgjarwl.github.io/
// @version      0.1
// @description  去掉csdn登录复制限制
// @author       tgjarwl
// @match        *://blog.csdn.net/*
// @match        *://www.php.cn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=csdn.net
// @grant        unsafeWindow
// @require      https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    // 阻止复制时弹窗,然后禁止复制的变态行为
    window.addEventListener('copy', function(e){e.stopPropagation()}, true);

    //var $ = unsafeWindow.jQuery;
    $(document).ready(function(){
        var sHost = unsafeWindow.location.href;
        console.log(sHost);
        if (sHost.indexOf("www.php.cn") != -1)
        {
            setTimeout(function(){
                if ($("code").length > 0)
                {
                    $("code").attr("style", "user-select:auto");
                }
                //$(".html .plain").attr("style", "user-select:auto");
            }, 2000);
        }
        else if (sHost.indexOf("blog.csdn.net") != -1)
        {
            // 移除限制复制功能
            if($("#content_views pre")[0])
            {
                $("#content_views pre").attr("style","user-select:auto");
            }

            // 移除限制复制功能
            if ($("#content_views pre code")[0])
            {
                $("#content_views pre code").attr("style","user-select:auto");
            }

            // remove 登录后复制
            if ($(".hljs-button.signin")[0])
            {
                $(".hljs-button.signin").attr("style", "display:none");
            }

            // remove 关注后查看
            if ($("#article_content")[0])
            {
                $("#article_content").attr("style","height:auto");
            }

            // remove 关注后查看
            if ($(".hide-article-box.hide-article-pos.text-center")[0])
            {
                $(".hide-article-box.hide-article-pos.text-center").attr("style","display:none");
            }
        }
    });

})();