Remove Restrictions and Restore Default Behavior

Allows you select, cut, copy, paste, save and open the DevTools on any website.

当前为 2024-05-02 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Remove Restrictions and Restore Default Behavior
  3. // @name:zh-CN 解除网页限制,恢复默认行为
  4. // @namespace http://hl-bo.github.io/namespaces/user-script/remove-limits
  5. // @version 1.0
  6. // @license AGPLv3
  7. // @description Allows you select, cut, copy, paste, save and open the DevTools on any website.
  8. // @description:zh-CN 恢复选择、剪切、复制、粘贴、保存、右键菜单和打开开发者工具的默认行为。
  9. // @author HL-Bo
  10. // @match *://*/*
  11. // @exclude *://vscode.dev/*
  12. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAspJREFUWEfVl89PE1EQx7/TdpcabKFAoEKQH22ktEYSqRevXiRijEr8cSDe/DNM9D/xhPFn4oF4MeBZuJi0SiiQikTjD2gLCLS7jNmFLt2mu/uWYtB36G73zWQ+b2bevDeEijE5Od/Q3ut5CNA9gMOVc3bvG7+3MLeYRU9nhxqP9r2WURoPh8ObIvpUKTSbzkww6I6IYqWMAdAVxmCkF8z8zk/KFREIA2BmbilGu7tpZpigRGCqATQdAk3LKI46QRjGZtOZ6wx6KWKwWqYWgCbDzNN+UmwhDID3HxduEuP5UQKIQPx1gDJEnpTRoRqJaQnw/dcqVvPrANf2iST50N/dCSKCVQjMmjyVg3K1GsISILvyFT/X8pYRkXw+nD3TD4/HIwigp+ZUDkUThG0I9MVbeIAq9srW9g7SmSW0t4ZwPjHglEZvf3xZGkkmk6W93bI/qpNQUVVs7xRtPOBFgyzr88yM1PwidoolRE53oS3UbAuhMo8Mx/re2ALMZ5dRWLcuZlrsh2JReL1e3ZiWB5nsMlR118kDII/39v2xy09tAQobm8jrALVjIEsSOtpaTMZKioLVXAHaU/OK1fAAt65duvjMFsBxGXUIMGHswmDkhS2AtpK1wnodZg5UQ8EAWpqDxgchgIXPK8gdEUBzMKAnZ3kIAWgxLCmq9T4U9g1B8nn1gvV/ARx7CI49CYVDfAhBoSR0KkTidglNgUYETza6S0KtrO5VwvqHBhDt6XYH4HQYucHyN8jw7Z8Z+uElUgl1QePHjbkqWao4cvenhACcLiRukNpCTejpOuUuBE5XMmEAAlqaAmhvPTg5hTwgbOAQgv8mQD2NiVsnEPjGcDz6ynQfmPkwFyPJd6jWzA0AEZhLSjx5buCTCUD7M5temGDAdXPqCgB4MhyP3C3rmBrRVColb5H/kdv2XAyAvgH8+ARvP0gkEsZ1+w+ixcUwoQ+80AAAAABJRU5ErkJggg==
  13. // @grant none
  14. // @run-at document-start
  15. // ==/UserScript==
  16.  
  17. (function () {
  18. 'use strict';
  19. // 尝试禁用 debugger
  20. // 仅在 eval("debugger") 或 setInterval("debugger", sec) 构造前执行才能阻止
  21. Function.prototype.__constructor_back = Function.prototype.constructor;
  22. Function.prototype.constructor = function() {
  23. if(arguments && typeof arguments[0]==='string'){
  24. if("debugger" === arguments[0]){
  25. console.debug("Disabled an function which may execute debugger");
  26. return ;
  27. }
  28. }
  29. return Function.prototype.__constructor_back.apply(this, arguments);
  30. }
  31. })();
  32.  
  33. // let removeAllListeners = function (old_element) {
  34. // let new_element = old_element.cloneNode(true);
  35. // old_element.parentNode.replaceChild(new_element, old_element);
  36. // };
  37.  
  38. setInterval(
  39. // 对抗延迟运行(即在此脚本执行后运行)的禁用程序和循环执行的禁用程序,
  40. // 每 0.3 秒执行一次。
  41. // 参见 https://developer.mozilla.org/zh-CN/docs/Web/API/setInterval
  42. (function() {
  43. 'use strict';
  44. if (document) {
  45. let setEventAllowed = function (event, event_name) {
  46. event.returnValue = true;
  47. if (event_name !== null) {
  48. console.debug(`Allowed ${event_name}`);
  49. }
  50. };
  51. let allowEvent = function (event_name) {
  52. document.addEventListener(event_name, function(event){ setEventAllowed(event, event_name); });
  53. };
  54. let onKeyEvents = function (event) {
  55. let keyCode = event.keyCode || event.which || event.charCode;
  56. let ctrlKey = event.ctrlKey || event.metaKey;
  57. let shiftKey = event.shiftKey;
  58. if (ctrlKey && (keyCode == 65 || keyCode == 88 || keyCode == 67 || keyCode == 86 || keyCode == 83 || keyCode == 85)) {
  59. // Ctrl+A (select-all), Ctrl+X (cut), Ctrl+C (copy), Ctrl+V (paste), Ctrl+S (save), Ctrl+U (view-source)
  60. setEventAllowed(event, "hotkey");
  61. } else if (ctrlKey && shiftKey && (keyCode == 73 || keyCode == 74 || keyCode == 67)) {
  62. // Ctrl+Shift+I (devtools), Ctrl+Shift+J (console), Ctrl+Shift+C (elements)
  63. setEventAllowed(event, "hotkey (DevTools)");
  64. } else if (keyCode && keyCode == 123) { // F12
  65. setEventAllowed(event, "hotkey (F12)");
  66. }
  67. };
  68. let allowKeyEvents = function (event_name) {
  69. document.addEventListener(event_name, onKeyEvents);
  70. };
  71. // 取消通过 JavaScript 实现的禁止复制
  72. try { document.oncopy = null; document.body.oncopy = null; } catch (error) { allowEvent("copy"); }
  73. // 取消通过 JavaScript 实现的禁止文字选择
  74. try { document.onselectstart = null; document.body.onselectstart = null; } catch (error) { allowEvent("selectstart"); }
  75. // 取消通过 JavaScript 实现的禁止右键菜单
  76. try { document.oncontextmenu = null; document.body.oncontextmenu = null; } catch (error) { allowEvent("contextmenu"); }
  77. // 取消通过 JavaScript 实现的禁止剪切实现的禁止复制
  78. try { document.oncut = null; document.body.oncut = null; } catch (error) { allowEvent("cut"); }
  79. // 取消通过 JavaScript 实现的禁止粘贴
  80. try { document.onpaste = null; document.body.onpaste = null; } catch (error) { allowEvent("paste"); }
  81. // 取消通过 CSS 实现的禁止选中
  82. try { document.style.webkitUserSelect = "auto"; document.body.style.webkitUserSelect = "auto"; } catch (error) {} // Firefox
  83. try { document.style.userSelect = "auto"; document.body.style.userSelect = "auto"; } catch (error) {} // Chrome
  84. // 取消通过 JavaScript 实现的禁用快捷键
  85. try { document.onkeypress = null; document.body.onkeypress = null; } catch (error) { allowKeyEvents("keypress"); }
  86. try { document.onkeydown = null; document.body.onkeydown = null; } catch (error) { allowKeyEvents("keydown"); }
  87. try { document.onkeyup = null; document.body.onkeyup = null; } catch (error) { allowKeyEvents("keyup"); }
  88. // 取消通过 JavaScript 实现的页面离开检测
  89. try { document.onvisibilitychange = null; document.body.onvisibilitychange = null; } catch (error) { allowEvent("visibilitychange"); }
  90. }
  91. }), 300
  92. );
  93.  
  94. setInterval(
  95. // 对抗延迟运行(即在此脚本执行后运行)的混淆程序和循环执行的混淆程序,
  96. // 每 2.1 秒执行一次。
  97. function() {
  98. 'use strict';
  99. if (document) {
  100. let removeHiddenElements = function (element, recursion) {
  101. if (element.style.display == "none" || element.style.visibility == "hidden") {
  102. element.remove();
  103. } else if (recursion) {
  104. for (let i = 0; i < element.children.length; i++) {
  105. removeHiddenElements(element.children.item(i), recursion);
  106. }
  107. }
  108. };
  109. // 移除正文中的不可见元素
  110. try {
  111. // 获取正文节点
  112. let content_element = document.getElementById("content");
  113. if (content_element === null) { // 不存在 id="content" 的元素
  114. content_element = document.getElementById("contents");
  115. }
  116. if (content_element === null) { // 不存在 id="contents" 的元素
  117. let content_elements = document.getElementsByClassName("content");
  118. if (content_elements.length > 0) {
  119. content_element = content_elements[0];
  120. }
  121. }
  122. if (content_element === null) { // 不存在 class="content" 的元素
  123. let content_elements = document.getElementsByClassName("contents");
  124. if (content_elements.length > 0) {
  125. content_element = content_elements[0];
  126. }
  127. }
  128. // 移除不可见元素
  129. if (content_element !== null) {
  130. removeHiddenElements(content_element, true);
  131. }
  132. } catch (error) {}
  133. }
  134. }, 2100
  135. );