抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

受疫情影响,现在基本都是远程上课,眼看学期末就要到了,各个课程也纷纷结课。往常的结课考试,自然也就行不通,所以大部分课程开始改为递交课程报告的形式。于是乎,现在天天就是看论文,找资料,写报告……头都大了!特别有时候,好不容易在网上找到一些资料,结果还不让我使用传统的 Crtl C+V 大法,有的是让你登录,更狠的直接给你禁了,你都找不到这个选项。现在版权意识越来越重,要说不让随意下载转发,尚还接受,可是,有时候我就想用一下那么几句话,亦或者做下阅读笔记,还得一字一句的打,效率太低了。然后,就开始了各种捣鼓,这里总结出了所有我知道的办法,欢迎评论补充!

写在前面

介绍具体破解方法前,我们还是有必要先弄清楚这种「复制禁用」到底是怎么实现的,只有知其然亦知其所以然,才能不变应万变;(如果你只是简单的想找个破解方法,可以跳过此章节)

目前,绝大多数网页禁用复制功能,都可以囊括到如下三类:

1)JavaScript 脚本的方式

也是目前最常用的方式,常用的实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 禁止右键菜单
document.body.oncontextmenu = e => {
console.log(e, '右键');
return false;
// e.preventDefault();
};

// 禁止文字选择。
document.body.onselectstart = e => {
console.log(e, '文字选择');
return false;
// e.preventDefault();
};

// 禁止复制
document.body.oncopy = e => {
console.log(e, 'copy');
return false;
// e.preventDefault();
}

// 禁止剪切
document.body.oncut = e => {
console.log(e, 'cut');
return false;
// e.preventDefault();
};

// 禁止粘贴
document.body.onpaste = e => {
console.log(e, 'paste');
return false;
// e.preventDefault();
};

// 使用e.preventDefault()也可以禁用,但建议使用 return false 这样就不用去访问 e 和 e 的方法了;
// 示例中 document.body 全局都禁用了,也可以对 dom (某些区域)进行禁用。

2)CSS 的方式

使用 CSS 能够保证在用户禁用 JavaScript 脚本的情况下,复制功能也会被禁止;

1
2
3
4
5
6
7
8
body {
-moz-user-select:none; /* Firefox私有属性 */
-webkit-user-select:none; /* WebKit内核私有属性 */
-ms-user-select:none; /* IE私有属性(IE10及以后) */
-khtml-user-select:none; /* KHTML内核私有属性 */
-o-user-select:none; /* Opera私有属性 */
user-select:none; /* CSS3属性 */
}

3)HTML 属性的方式

这种方式就用的不多了;

1
<body oncopy="return false" oncut="return false;" onselectstart="return false" >    

最后,还必须提一下,有些爱捣鼓的网站(很少很少)会想办法禁用开发者模式,但是这种禁用通常是不可能 100% 禁用的;

有的只是单纯通过禁用 F12 按键,又或者高级一些的:

“利用 console.log 打印一个对象然后覆盖这个对象的 toString 方法,一旦开发者工具存在,toString 方法就会被调用。”

基础方法

首先最简单最笨的办法,当然就是,百度搜索这篇文章,看看有没有别的地方可以直接复制或者下载的。这不符合本文主题,pass!

利用网页打印

这里说的打印,不是让你真的打印(当然,不嫌麻烦话当我没说);

具体做法就是:

  • 在文档上:右键 -> 打印
  • 然后,就可以直接在弹出的打印预览页面的,愉快的复制粘贴了;

print

拖拽法

选中所需要的文字,鼠标点击拖入到文本文件中;
drag

查看源码

F12 进入开发者模式,在 hmtl 源码里就可以找到你所需要的文字;

html

这种方法很明显有个弊端就是,我们复制的文字量比较大时,会复制到一些不必要的 <p><div> 这种标签,这就需要自己去手动修改了,比较麻烦;

进阶

前面我们知道了,网站禁用复制的实现原理,那么,只需要按照对应的原理进行破解就 OK 了;

$=0 命令

许多网站在复制时会弹窗,提示让你登录,或者其它信息,这些网站通常是让你复制时触发 js 代码实现;

而在 js 中,由于受到 prototype.js(老外写的框架,用于将一些常用的函数封装,方便操作)的影响,现在很多人都$ 来表示一个查找对象的函数,于是也就有了命令: $=0,这样就能破坏 js 代码的执行;

具体操作:

  • F12 进入开发者模式,点击 Console
  • 输入:$=0,回车执行,再返回去复制即可;

jscode

禁用 js 代码

上面提到的办法,不能保证 100% 的让 js 失效,所以接下来,我们直接设置禁用 js 代码;

以 Google 浏览器为例(其它浏览器大同小异):

  • 进入 设置 -> 隐私设置和安全性 -> 网站设置 -> JavaScript
  • 允许 关闭,或者,将文档那个网站加入到禁止名单即可;
  • 回去,刷新网站,就可以复制了;

使用完后,别忘了将设置还原!

其他

如果,你尝试完上述所有方法依旧不管用,那就是我们之前提到过得,网站使用了 user-select: none; 设置 css 样式进而停用用户选择,它是不受 js 影响的。所以,此方法处理起来比较复杂;

通常,F12 进入开发者模式,进入 Elements 选项卡,然后取消选中 body 下面的 CSS 规则:

  • 具体规则见前文:规则查看
  • 主要是:user-select: none;webkit-user-select:none;

或者说,可以使用用户脚本来覆盖设置(方法来源):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ==UserScript==
// @name Force Select
// @version 1.0
// @description Stop sites from disabling selection of text
// @author You
// @match *://*/*
// @grant none
// ==/UserScript==

(function() {
'use strict';

let style = document.createElement('style');
style.innerHTML = '*{ user-select: auto !important; }';

document.body.appendChild(style);
})();
  • 如果启用此功能,则将适用于每个页面,这在所有情况下都不是理想的;
  • 因此,可以使用 Violentmonkey,Tampermonkey 或 Greasemonkey 之类的用户脚本管理器来安装脚本,并轻松打开/关闭该脚本;

补充

如果你能熟练掌握上述所有方法,那么基本所有的文档都能任由你复制了;

但是,如果还非要说上面那些方法不会使用,想要更加轻松的方式,那就直接使用第三方插件吧!

推荐几款谷歌插件:

  • Enable Copy』:安装完后会在 chrome 插件栏上增加一个对勾形状按钮,以后碰到不能直接复制的网页,每次复制网页内容之前,先点此勾形按钮即可;
  • simple allow copy』:使用方法,和 Enable Copy 基本相同;

再就是前面提到过的脚本管理器:『Tampermonkey

  • 你可以用该脚本管理器添加,前面提及的脚本,也可以自己在上面查找一些相关脚本;
  • 再提供一款脚本『网页限制解除(改)』供选择;

最后,送佛送到西,再安利一个文档下载器:

最最最后,只要不嫌麻烦,包治百病的终极大法

  • 截图 + 文字识别
  • 至于这两个工具,直接百度,那就是一大堆了;

那就再附加一个,网页内容选择性打印的脚本:

1
2
3
4
5
6
7
8
9
10
11
// 找到你所需要打印的部分的 div,这里是利用 ID 识别
// 你也可以利用 JSP 的 DOM(Document Object Model)的其他方式
// 常用的三种方法:getElementById、getElementsByName、getElementsByTagName
// Element.innerHTML 属性用于设置或返回指定标签之间的 HTML 内容
var printData = document.getElementById("article_content").innerHTML;

//把 html 里的数据复制给 body 的 html 数据 ,相当于重置了整个页面的内容
window.document.body.innerHTML = printData; 

// 开始打印
window.print();