【Web逆向】关于我是如何解决mooc禁止右键、复制
本帖最后由 hualy 于 2024-4-18 23:24 编辑[** **![](https://wdcdn.qpic.cn/MTMxMDI2NjIxNjUxODY1MTM_395550_94VReq_RHEN3uhRt_1713443639)
查找资料(https://www.jianshu.com/p/a7be27c7d56d),说是当用户点击鼠标右键的时候oncontextmenu事件被触发** **![](https://wdcdn.qpic.cn/MTMxMDI2NjIxNjUxODY1MTM_47056_Wm5G84DTGejLmsqY_1713443845)
又开始查资料:[破解网页右键被禁止js\_document.onselectstart = document.oncontextmenu= d-CSDN博客](https://blog.csdn.net/qq_37363320/article/details/117155859)
[网页上如何实现禁止复制粘贴以及如何破解Ln's Blog](https://weilining.github.io/231.html)
[网页上如何实现禁止复制粘贴以及如何破解 - 孤舟残月浅笑嫣然 - 博客园](https://www.cnblogs.com/qingsong/articles/12235629.html)
[如何优雅的破解页面的禁止复制、选中! - 技术交流 - Spring Boot中文社区](https://springboot.io/t/topic/4830)
上面这些网页的资料感觉是有点用,但我觉得有点复杂,就想着还有没有更加方便的办法去破解,于是就试着去问问chatgpt,果然,有一下挺方便的办法,经过测试并且简单有效的,如下:1. 取消函数的引用
如果你希望从某个对象中删除一个方法,或者将一个变量引用的函数置为 null 或 undefined,可以使用以下方式:
```
var myFunction = function() {
console.log("Hello, world!");
};
// 调用函数
myFunction();
// 取消引用
myFunction = null;
// 此时调用 myFunction 将会出错,因为它已经不再是一个函数
// myFunction(); // TypeError: myFunction is not a function
```
所以,可以在控制台输入:
```
document.oncontextmenu = null
```
** **![](https://wdcdn.qpic.cn/MTMxMDI2NjIxNjUxODY1MTM_792625_N7cfYj8jZAMi3RXq_1713444740)
但是此方法一刷新,就失效了
2. 将函数替换为空函数
有时,为了避免错误或其他原因,你可能只想简单地使一个函数“失效”,而不是完全删除引用:
```
function doSomething() {
console.log("Doing something...");
}
// 替换为不执行任何操作的空函数
doSomething = function() {};
// 此时调用 doSomething 将不会有任何输出
doSomething();
```
```
document.oncontextmenu = function() {};
```
** **![](https://wdcdn.qpic.cn/MTMxMDI2NjIxNjUxODY1MTM_70364_wM00tE22qMLEA6Ob_1713444855)
此方法也是一刷新,就失效了
所以有什么好办法呢?
再问一下chatgpt,说是使用 localStorage 控制函数触发,但我觉得这样子有点复杂了,万一一不小心清除缓存,还不是得再来一遍,倒不如就直接油猴吧!
来都来了,看着源代码下面的禁止复制,也搞一下好咯
// ==UserScript==
// @name mooc接触禁止右键、复制
// @namespace www.icourse163.org
// @version 0.1
// @description 允许mooc右键、复制
// @author hualy
// @match *://www.icourse163.org/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// 设置 document.oncontextmenu 为 null 来启用右键菜单、复制
document.addEventListener('DOMContentLoaded', function() {
document.oncontextmenu = null;
document.onkeydown = null;
});
})();
复盘:仔细想了一下,有值得改进的地方:1、可以直接搜索弹出的字符串** **![](https://wdcdn.qpic.cn/MTMxMDI2NjIxNjUxODY1MTM_670530_QlhyC6OiTmf8zkr5_1713446216)
2、刚开始我想着让油猴脚本代码更具有拓展性,使得在各个网站都可以解除限制,但后来想了一下,好像没多大必要,倒不如直接专精一点,减少代码量,用得到再处理,那样子代码写起来简单一点,又容易理解
3、求好评
-----------------------------------------------------------------------------------------------------------------------------------------
受三滑稽甲苯的启发,优化了一下核心代码:
(function() {
'use strict';
a = ["oncontextmenu", "onkeydown"] //在此添加监听类型
a.forEach((type) => {
document.addEventListener(type, (e) => {
e.stopImmediatePropagation();
}, {capture: true});
});
})();
通杀禁止右键:
```js
document.addEventListener("contextmenu", (e) => {
e.stopImmediatePropagation();
}, {capture: true})
``` 本帖最后由 libw 于 2024-4-19 10:35 编辑
再来个通杀几乎所有限制:
(function () {
/**
* 还原所有修改
*/
window.onload = function () {
function fixChanges() {
// 修复选中限制
const styleTag = document.createElement('style');
styleTag.innerHTML = '*, #app {margin: 0;padding: 0;user-select: auto !important;}';
document.head.appendChild(styleTag);
// 修复按键限制
['onkeyup', 'onkeydown', 'onkeypress', 'onmousedown', 'onselectstart', 'oncontextmenu'].forEach(event => {
window = null;
document = null;
});
// 清空计时器
window.clearInterval(fixChangesInterval);
}
const fixChangesInterval = window.setInterval(fixChanges, window.Math.ceil(Math.random() * 128));
};
})(); 本帖最后由 zxc112 于 2024-4-18 21:32 编辑
这个厉害了
多谢分享
怎么识别要用到那个函数呢
网页上代码那么多,有什么思路分享参考下学习学习 安装一个浏览器插件 哇,你真是神了,最近一直在慕课上看课,想复制这个,你就发教程了,我要去试一试 zxc112 发表于 2024-4-18 21:30
这个厉害了
多谢分享
怎么识别要用到那个函数呢
document.oncontextmenu= function(){
alert("禁止使用右键");
window.event.returnValue=false;
};
这个是禁止右键的代码,因为右键的时候,明显弹出了一个弹框,并且显示着禁止使用右键,在看一下下面的代码,event.returnValue,其作用就是:当捕捉到事件(event)时,判断为false,则阻止当前事件继续运行,搜索一下就知道了,所以判定是这个函数 学习到了哇,太酷啦
太棒了!我学到了很多新知识,感谢作者的精心撰写。 谢谢分享,我一直都用的插件,还能这样 三滑稽甲苯 发表于 2024-4-18 22:19
通杀禁止右键:
```js
document.addEventListener("contextmenu", (e) => {
这个厉害的