Reddit Bypass Enhancer

Bypass the "open in app prompt", unblur NSFW content and thumbnails, remove the blur from community highlight cards.

目前为 2025-01-22 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Reddit Bypass Enhancer
  3. // @version 1.9
  4. // @description Bypass the "open in app prompt", unblur NSFW content and thumbnails, remove the blur from community highlight cards.
  5. // @author UniverseDev
  6. // @license GPL-3.0-or-later
  7. // @match https://www.reddit.com/*
  8. // @match https://sh.reddit.com/*
  9. // @grant none
  10. // @run-at document-start
  11. // @noframes
  12. // @namespace https://greasyfork.org/en/users/1030895-universedev
  13. // ==/UserScript==
  14. 'use strict';
  15.  
  16. (function () {
  17. function queryElementsDeep(selector) {
  18. const foundElements = new Set();
  19. try {
  20. const lightDomElements = document.querySelectorAll(selector);
  21. lightDomElements.forEach(el => foundElements.add(el));
  22. const allElements = document.querySelectorAll('*');
  23. for (const el of allElements) {
  24. if (el.shadowRoot) {
  25. const shadowElements = el.shadowRoot.querySelectorAll(selector);
  26. shadowElements.forEach(el => foundElements.add(el));
  27. }
  28. }
  29. } catch (error) {
  30. console.error("Error in queryElementsDeep:", error);
  31. }
  32. return Array.from(foundElements);
  33. }
  34.  
  35. const SELECTORS = {
  36. nsfwModal: `${'shreddit-async-loader'}[${'bundlename'}*="nsfw_blocking_modal"]`,
  37. promptContainer: `${'xpromo-nsfw-blocking-container'} > *`,
  38. prompt: '.prompt',
  39. blurredContainer: 'shreddit-blurred-container',
  40. thumbnailBlur: '.thumbnail-blur',
  41. communityHighlightCard: 'community-highlight-card',
  42. thumbnailImage: 'img.mb-0.h-full.w-full.object-cover',
  43. thumbnailShadow: '.thumbnail-shadow',
  44. mediaBackground: '.bg-media-background',
  45. blurredSpan: 'span.inner.blurred',
  46. scrim: '.absolute.top-0.left-0.w-full.h-full.bg-scrim',
  47. imageFilter: 'img.mb-0.h-full.w-full.object-cover',
  48. video: 'shreddit-player, video',
  49. mediaTelemetryObserver: 'media-telemetry-observer',
  50. mediaPlayerLoader: 'shreddit-async-loader[bundlename="media_player_loader"]',
  51. shredditPlayer: 'shreddit-player',
  52. outerContainer: 'div.outer.h-full',
  53. };
  54.  
  55. const BLURRED_TAG = SELECTORS.blurredContainer;
  56. const MEDIA_TELEMETRY_OBSERVER_SELECTOR = SELECTORS.mediaTelemetryObserver;
  57.  
  58. function removeNSFWBlock() {
  59. try {
  60. const nsfwModal = document.querySelector(SELECTORS.nsfwModal);
  61. if (nsfwModal) {
  62. nsfwModal.remove();
  63. }
  64.  
  65. const promptContainer = document.querySelector(SELECTORS.promptContainer);
  66. let prompt = null;
  67. if (promptContainer && promptContainer.shadowRoot) {
  68. prompt = promptContainer.shadowRoot.querySelector(SELECTORS.prompt);
  69. }
  70. if (prompt) {
  71. prompt.remove();
  72. }
  73.  
  74. const blurredContainers = document.querySelectorAll(BLURRED_TAG);
  75. blurredContainers.forEach(container => {
  76. try {
  77. if (container.shadowRoot?.innerHTML && container.firstElementChild) {
  78. container.firstElementChild.addEventListener('click', function(e) {
  79. e.preventDefault();
  80. if (e.target.closest(MEDIA_TELEMETRY_OBSERVER_SELECTOR)) {
  81. e.stopPropagation();
  82. }
  83. e.target.click();
  84. }, { once: true });
  85. container.firstElementChild.click();
  86. }
  87. } catch (error) {
  88. console.error("Error processing blurred container:", error, container);
  89. }
  90. });
  91.  
  92. document.querySelectorAll(SELECTORS.thumbnailBlur).forEach(el => el.classList.remove('thumbnail-blur'));
  93. document.querySelectorAll(SELECTORS.communityHighlightCard).forEach(card => card.removeAttribute('blurred'));
  94.  
  95. document.querySelectorAll(SELECTORS.imageFilter).forEach(img => img.style.removeProperty('filter'));
  96. document.querySelectorAll(SELECTORS.video).forEach(video => {
  97. video.style.filter = '';
  98. video.classList.remove('blur');
  99. });
  100.  
  101. const thumbnailShadow = document.querySelector(SELECTORS.thumbnailShadow);
  102. if (thumbnailShadow) {
  103. thumbnailShadow.remove();
  104. }
  105.  
  106. const mediaBackground = document.querySelector(SELECTORS.mediaBackground);
  107. if (mediaBackground) {
  108. mediaBackground.style.backgroundColor = 'transparent';
  109. }
  110.  
  111. queryElementsDeep(SELECTORS.blurredSpan).forEach(span => {
  112. span.style.filter = '';
  113. });
  114. queryElementsDeep(SELECTORS.scrim).forEach(scrim => {
  115. scrim.remove();
  116. });
  117. }
  118. catch (error) {
  119. console.error("Error in removeNSFWBlock:", error);
  120. }
  121. }
  122.  
  123. const observer = new MutationObserver(removeNSFWBlock);
  124. const contentContainer = document.documentElement;
  125. observer.observe(contentContainer, {
  126. childList: true,
  127. subtree: true,
  128. attributes: false
  129. });
  130.  
  131. const shredditCheckInterval = setInterval(() => {
  132. if (!document.querySelector('shreddit-app')) {
  133. observer.disconnect();
  134. clearInterval(shredditCheckInterval);
  135. }
  136. }, 5000);
  137. })();