写在前面
各位读者好,这里是笔者 Orbit,本文由 sunnysab 代发,感谢 sunnysab 提供个人博客平台!
本文的示例网站(防止网站所有者自搜,已用 base64 编码): aHR0cHM6Ly93d3cuNTFjeWguY29tL2dvbmd6dW96b25namllLzM3NDk3MS5odG1s
本文介绍了如何解除某网站的复制限制,共四个部分
分析网站代码
打开网页,选取一段内容,当按下 Ctrl-C 或者右键复制时,网页弹出充值提示框,且无法粘贴。由于防复制行为出现在复制动作后,所以考虑站方通过 js 监听复制动作的可能性,
查看网页源代码,找出所有 <script>
代码块,依次查看,找到一处疑似代码(为了观感删除部分非必要代码)
1 | <script type="text/javascript"> |
这段代码根据客户端的种类加载 js 文件,笔者使用 PC 端,加载了 copy_pc.js
文件,文件名似乎暗示与防复制有关,打开 “F12 开发者工具 - 网络选项”,加载一次网页,找到 copy_pc.js
,源码如下:
1 | // 复制事件 |
从注释来看无疑是防复制代码,这段代码调用 jQuery 的 bind
函数,将 <body>
标签的 copy
事件和防复制函数绑定。
经过调查实践,是否阻止复制动作取决于函数的返回值(false
为阻止,true
不阻止)。
因此解除复制限制的思路有以下三种:
- 修改
userid
变量和is_vip
变量绕过return false
语句 - 修改
conInfo
变量绕过return false
语句 - 解除
<body>
标签的事件绑定
实践 & 分析
思路1
通过查询, userid
和 is_vip
变量出现在网页源代码中,恰好在“代码1”处定义,初始为空值。通过为其赋值来跳过 if 语句,在控制台输入:
1 | userid = '1'; |
执行,复制网页文字,未弹出充值提示且粘贴成功,思路可行。
思路2
conInfo
变量于 “代码2” 定义,与之关联的还有 d_name
变量。代码2 调用 jQuery 操作 Cookie 的方法,将 Cookie 中名为 d_name
的值赋值给 conInfo
变量。
由于 conInfo
变量在复制动作开始后才被定义赋值,所以通过在控制台修改并不能改变其值,那么自然想到干预 Cookie 内容,控制台输入:
1 | $.cookie('down_url_' + content_id, '1'); |
执行,复制网页文字,未弹出充值提示且粘贴成功,思路可行。
思路3
既然通过 jQuery 绑定 copy 事件,那么一定有解除绑定的方法,一通百度后找到 unbind
方法,控制台输入:
1 | $(document.body).unbind('copy'); |
执行,复制网页文字,未弹出充值提示且粘贴成功,思路可行。
编写油猴脚本
上面三种思路,任意一种都可以做到单次解除复制限制,然而关闭浏览器、再次打开网页后,除了持久化的 Cookie
信息,其余两种思路都要再输入一次,脑内 RAM 就那么多,干脆写个油猴脚本,每次打开该类网站自动执行控制台输入。
新建油猴脚本,根据提示将三种思路代码加入其中,将开头 @match
注解的内容修改为示例网站,最后在 “设置 - 通用 - 运行时期” 选择 “document-end”,保存。
随想随记
-
网页源代码中有个有趣的处理,在 HTML 中通过条件拉取对应的 js 文件,这点在“代码1”中有体现。
-
从结果来看,先排查获得的 js 文件
然后根据文件名猜功能能快速定位防复制代码,除非前端把防复制代码写到 HTML 里面。 -
示例网站把文章内容直接写在了
<body>
中,最佳解决方法是将网页源代码解析成富文本或者 Word 文档,可惜俺不会_(:з」∠)_。 -
不仅把文章内容直接写在了
<body>
中,连传输的 js 文件都是明文看不懂还有注释前端TA真的我哭死,期待稍微有点难度的挑战。 -
欢迎大家讨论和批评指正,再次感谢 sunnysab 的大力支持✿ヽ(°▽°)ノ✿