阻止阻止复制

干烂剪切板接口,这样就不能阻止我复制了

  1. // ==UserScript==
  2. // @name 阻止阻止复制
  3. // @namespace https://lab.wsl.moe/
  4. // @version 0.4
  5. // @description 干烂剪切板接口,这样就不能阻止我复制了
  6. // @author MisakaMikoto
  7. // @match http://*/*
  8. // @match https://*/*
  9. // @license MIT
  10. // @run-at document-start
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. (function() {
  15.  
  16. const realExecCommand = document.execCommand;
  17. const realAddEventListener = Element.prototype.addEventListener;
  18.  
  19. let userSelected = localStorage.____userAllowClipboard____ != null && localStorage.____userAllowClipboard____ !== '';
  20. let userAllowed = localStorage.____userAllowClipboard____ === 'true';
  21.  
  22. const setAllNodesSelectable = (node) => {
  23. if (!node || !node.style) return;
  24. const nodeStyleGetPropertyValue = node.style.getPropertyValue;
  25. node.style.getPropertyValue = (prop) => {
  26. if (prop === 'user-select') {
  27. return '';
  28. }
  29. node.style.___ = nodeStyleGetPropertyValue;
  30. const value = node.style.___(prop);
  31. node.style.___ = undefined;
  32. return value;
  33. };
  34. // node.style.setProperty('user-select', 'auto', 'important'); // This line will break baidu.com
  35. node.style.setProperty('user-select', '', 'important');
  36. if (node.childNodes) {
  37. for (let i of node.childNodes) {
  38. setAllNodesSelectable(i);
  39. }
  40. }
  41. };
  42.  
  43. const setExecuteCommand = () => {
  44. setAllNodesSelectable(document.body);
  45. window.Clipboard = undefined;
  46. try {
  47. navigator.clipboard.writeText = undefined;
  48. } catch (e) {}
  49. if (document && document.oncopy) {
  50. if (!userSelected) {
  51. userSelected = true;
  52. userAllowed = confirm('该网站希望在全局页面上添加复制监听器,是否允许?');
  53. }
  54. if (!userAllowed) {
  55. console.warn('Permission denied to control clipboard.');
  56. document.oncopy = null;
  57. localStorage.____userAllowClipboard____ = 'false';
  58. return;
  59. } else {
  60. localStorage.____userAllowClipboard____ = 'true';
  61. }
  62. }
  63. if (document && document.body && document.body.oncopy) {
  64. if (!userSelected) {
  65. userSelected = true;
  66. userAllowed = confirm('该网站希望在全局页面上添加复制监听器,是否允许?');
  67. }
  68. if (!userAllowed) {
  69. console.warn('Permission denied to control clipboard.');
  70. document.body.oncopy = undefined;
  71. localStorage.____userAllowClipboard____ = 'false';
  72. return;
  73. } else {
  74. localStorage.____userAllowClipboard____ = 'true';
  75. }
  76. }
  77. if (document && document.onselectstart) {
  78. if (!userSelected) {
  79. userSelected = true;
  80. userAllowed = confirm('该网站希望在全局页面上添加复制监听器,是否允许?');
  81. }
  82. if (!userAllowed) {
  83. console.warn('Permission denied to control clipboard.');
  84. document.onselectstart = null;
  85. localStorage.____userAllowClipboard____ = 'false';
  86. return;
  87. } else {
  88. localStorage.____userAllowClipboard____ = 'true';
  89. }
  90. }
  91. if (document && document.body && document.body.onselectstart) {
  92. if (!userSelected) {
  93. userSelected = true;
  94. userAllowed = confirm('该网站希望在全局页面上添加选择文本监听器,是否允许?');
  95. }
  96. if (!userAllowed) {
  97. console.warn('Permission denied to control clipboard.');
  98. document.body.onselectstart = undefined;
  99. localStorage.____userAllowClipboard____ = 'false';
  100. return;
  101. } else {
  102. localStorage.____userAllowClipboard____ = 'true';
  103. }
  104. }
  105. const changeListener = (parent, keyTree) => {
  106. if (!parent || !keyTree || keyTree === '') { return; }
  107. keyTree = keyTree.split('.');
  108. const originalCallbackFunction = (() => {
  109. let objParent = null;
  110. let obj = parent;
  111. let lastKey = '';
  112. for (let i of keyTree) {
  113. objParent = obj;
  114. obj = obj[i];
  115. lastKey = i;
  116. }
  117. return {
  118. objParent,
  119. obj,
  120. lastKey
  121. };
  122. })();
  123. if (originalCallbackFunction == null || originalCallbackFunction.objParent == null || originalCallbackFunction.obj == null) {
  124. return;
  125. }
  126. originalCallbackFunction.objParent[originalCallbackFunction.lastKey] = (event) => {
  127. var handledFunctionFingerprint=1;handledFunctionFingerprint=0;
  128. if(event && event.code === 'F12') {
  129. return;
  130. }
  131. originalCallbackFunction.obj(event);
  132. };
  133. }
  134. changeListener(document, 'onkeypress');
  135. changeListener(document, 'onkeydown');
  136. changeListener(document, 'onkeyup');
  137. changeListener(document.body, 'onkeypress');
  138. changeListener(document.body, 'onkeydown');
  139. changeListener(document.body, 'onkeyup');
  140. changeListener(window, 'onkeypress');
  141. changeListener(window, 'onkeydown');
  142. changeListener(window, 'onkeyup');
  143. Document.prototype.execCommand = (cmd) => {
  144. switch (cmd) {
  145. case "copy":
  146. case "cut":
  147. case "paste":
  148. if (!userSelected) {
  149. userSelected = true;
  150. userAllowed = confirm('该网站希望请求一次修改剪贴板的权限,是否允许?');
  151. }
  152. if (!userAllowed) {
  153. console.warn('Permission denied to control clipboard.');
  154. localStorage.____userAllowClipboard____ = 'false';
  155. return;
  156. } else {
  157. localStorage.____userAllowClipboard____ = 'true';
  158. }
  159. break;
  160. }
  161. realExecCommand(cmd);
  162. };
  163. //Element.prototype.realAddEventListener = realAddEventListener;
  164. Element.prototype.addEventListener = function(...args) {
  165. //const functionCode = p.toString();
  166. const event = args[0];
  167. switch (event) {
  168. case "copy":
  169. case "cut":
  170. case "paste":
  171. if (!userSelected) {
  172. userSelected = true;
  173. userAllowed = confirm('该网站希望在某个元素上添加复制事件监听器,是否允许?');
  174. }
  175. if (!userAllowed) {
  176. console.warn('Permission denied to control clipboard.');
  177. localStorage.____userAllowClipboard____ = 'false';
  178. return;
  179. } else {
  180. localStorage.____userAllowClipboard____ = 'true';
  181. }
  182. break;
  183. }
  184. return realAddEventListener.apply(this, args);
  185. }
  186. };
  187. setExecuteCommand();
  188. const intervalId = setInterval(setExecuteCommand, 1000);
  189. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址