Universal Bypass

Bypass common web restrictions: right-click, copy-paste, text selection, drag/drop, scrolling, video controls, console, debugger, and more.

À partir de 2024-10-04. Voir la dernière version.

  1. // ==UserScript==
  2. // @name Universal Bypass
  3. // @namespace https://github.com/x3ric
  4. // @version 1.1
  5. // @description Bypass common web restrictions: right-click, copy-paste, text selection, drag/drop, scrolling, video controls, console, debugger, and more.
  6. // @author x3ric
  7. // @license MIT
  8. // @match *://*/*
  9. // @run-at document-start
  10. // @grant unsafeWindow
  11. // @grant GM_registerMenuCommand
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. 'use strict';
  16. const settings = {
  17. rightClick: true, copyPaste: true, textSelection: true, dragDrop: false, keyboardShortcuts: false,
  18. pointerEvents: false, scrolling: true, unlockInputs: false, stopAutoPlay: false, enableVideoControls: false,
  19. removeOverlays: false, removeNoCopy: true, allowPasteInPassword: false, consoleBypass: false, debuggerBypass: false
  20. };
  21.  
  22. const saveSettings = () => localStorage.setItem('universalBypassSettings', JSON.stringify(settings));
  23. const loadSettings = () => { const storedSettings = localStorage.getItem('universalBypassSettings'); if (storedSettings) Object.assign(settings, JSON.parse(storedSettings)); };
  24.  
  25. const applyBypasses = () => {
  26. const unblockEvents = () => {
  27. const eventsToUnblock = [];
  28. if (settings.rightClick) eventsToUnblock.push('contextmenu');
  29. if (settings.copyPaste) eventsToUnblock.push('copy', 'paste', 'cut');
  30. if (settings.textSelection) eventsToUnblock.push('selectstart');
  31. if (settings.dragDrop) eventsToUnblock.push('dragstart', 'drop');
  32. if (settings.keyboardShortcuts) eventsToUnblock.push('keydown', 'keypress', 'keyup');
  33. if (settings.pointerEvents) eventsToUnblock.push('pointerdown', 'pointerup', 'mousedown', 'mouseup', 'click');
  34. if (settings.scrolling) eventsToUnblock.push('wheel', 'touchmove', 'scroll');
  35. eventsToUnblock.forEach(eventType => document.addEventListener(eventType, e => e.stopPropagation(), true));
  36. };
  37.  
  38. const removeBlockingAttributes = () => {
  39. const attrsToRemove = ['oncontextmenu', 'oncopy', 'onpaste', 'oncut', 'onselectstart', 'ondragstart', 'ondrop', 'onkeydown', 'onkeypress', 'onkeyup', 'onpointerdown', 'onpointerup', 'onclick', 'onscroll'];
  40. attrsToRemove.forEach(attr => document.querySelectorAll(`[${attr}]`).forEach(el => el.removeAttribute(attr)));
  41. if (settings.removeNoCopy) document.querySelectorAll('[class*="no-copy"], [class*="unselectable"]').forEach(el => el.classList.remove('no-copy', 'unselectable'));
  42. if (settings.allowPasteInPassword) document.querySelectorAll('input[type="password"]').forEach(input => input.onpaste = null);
  43. };
  44.  
  45. if (settings.removeOverlays) document.querySelectorAll('.overlay, .modal, .popup, .lightbox, [role="dialog"]').forEach(el => el.style.display = 'none');
  46. if (settings.unlockInputs) document.querySelectorAll('input[disabled], textarea[disabled], select[disabled], input[readonly], textarea[readonly]').forEach(input => { input.disabled = false; input.readOnly = false; });
  47. if (settings.stopAutoPlay) document.querySelectorAll('video, audio').forEach(media => { media.autoplay = false; media.pause(); });
  48. if (settings.enableVideoControls) document.querySelectorAll('video').forEach(video => video.controls = true);
  49. if (settings.consoleBypass) console.clear = () => console.log("Console clear has been blocked.");
  50. if (settings.debuggerBypass) {
  51. const injectDebugger = `debugger;`;
  52. unsafeWindow.eval = new Proxy(unsafeWindow.eval, { apply: (target, thisArg, args) => { if (typeof args[0] === 'string') args[0] = `${injectDebugger} ${args[0]}`; return Reflect.apply(target, thisArg, args); } });
  53. unsafeWindow.Function = new Proxy(unsafeWindow.Function, { construct: (target, args) => { if (typeof args[args.length - 1] === 'string') args[args.length - 1] = `${injectDebugger} ${args[args.length - 1]}`; return Reflect.construct(target, args); } });
  54. }
  55. unblockEvents();
  56. removeBlockingAttributes();
  57. };
  58.  
  59. const observeDOMChanges = () => { const observer = new MutationObserver(() => applyBypasses()); observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); };
  60.  
  61. const toggleSetting = (settingKey, settingName, menuCommandId) => {
  62. settings[settingKey] = !settings[settingKey];
  63. applyBypasses();
  64. saveSettings();
  65. GM_unregisterMenuCommand(menuCommandId);
  66. createMenu(settingKey, settingName);
  67. };
  68.  
  69. const createMenu = (settingKey, settingName) => {
  70. const status = settings[settingKey] ? 'ON' : 'OFF';
  71. const menuCommandId = GM_registerMenuCommand(`${settingName} (${status})`, () => toggleSetting(settingKey, settingName, menuCommandId));
  72. };
  73.  
  74. const init = () => {
  75. loadSettings();
  76. applyBypasses();
  77. observeDOMChanges();
  78. createMenu('rightClick', 'Right-Click');
  79. createMenu('copyPaste', 'Copy-Paste');
  80. createMenu('textSelection', 'Text Selection');
  81. createMenu('dragDrop', 'Drag-and-Drop');
  82. createMenu('keyboardShortcuts', 'Keyboard Shortcuts');
  83. createMenu('pointerEvents', 'Pointer Events');
  84. createMenu('scrolling', 'Scrolling');
  85. createMenu('unlockInputs', 'Unlock Inputs');
  86. createMenu('stopAutoPlay', 'Stop Auto-Play');
  87. createMenu('enableVideoControls', 'Enable Video Controls');
  88. createMenu('removeOverlays', 'Remove Overlays');
  89. createMenu('removeNoCopy', 'Remove No-Copy Classes');
  90. createMenu('allowPasteInPassword', 'Allow Paste in Password Fields');
  91. createMenu('consoleBypass', 'Console Bypass');
  92. createMenu('debuggerBypass', 'Debugger Bypass');
  93. };
  94.  
  95. init();
  96. })();