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. badgeContainer: '.flex.items-center.gap-2xs.text-white'
  54.  
  55. };
  56.  
  57. const BLURRED_TAG = SELECTORS.blurredContainer;
  58. const MEDIA_TELEMETRY_OBSERVER_SELECTOR = SELECTORS.mediaTelemetryObserver;
  59. const BADGE_CONTAINER = SELECTORS.badgeContainer;
  60.  
  61. function removeNSFWBlock() {
  62. try {
  63. const nsfwModal = document.querySelector(SELECTORS.nsfwModal);
  64. if (nsfwModal) {
  65. nsfwModal.remove();
  66. }
  67.  
  68. const promptContainer = document.querySelector(SELECTORS.promptContainer);
  69. let prompt = null;
  70. if (promptContainer && promptContainer.shadowRoot) {
  71. prompt = promptContainer.shadowRoot.querySelector(SELECTORS.prompt);
  72. }
  73. if (prompt) {
  74. prompt.remove();
  75. }
  76.  
  77. const blurredContainers = document.querySelectorAll(BLURRED_TAG);
  78. blurredContainers.forEach(container => {
  79. try {
  80. if (container.shadowRoot?.innerHTML && container.firstElementChild) {
  81. container.firstElementChild.addEventListener('click', function(e) {
  82. e.preventDefault();
  83. if (e.target.closest(MEDIA_TELEMETRY_OBSERVER_SELECTOR)) {
  84. e.stopPropagation();
  85. }
  86. e.target.click();
  87. }, { once: true });
  88. container.firstElementChild.click();
  89. }
  90. } catch (error) {
  91. console.error("Error processing blurred container:", error, container);
  92. }
  93. });
  94.  
  95. document.querySelectorAll(SELECTORS.thumbnailBlur).forEach(el => el.classList.remove('thumbnail-blur'));
  96. document.querySelectorAll(SELECTORS.communityHighlightCard).forEach(card => card.removeAttribute('blurred'));
  97.  
  98. document.querySelectorAll(SELECTORS.imageFilter).forEach(img => img.style.removeProperty('filter'));
  99. document.querySelectorAll(SELECTORS.video).forEach(video => {
  100. video.style.filter = '';
  101. video.classList.remove('blur');
  102. });
  103.  
  104. const thumbnailShadow = document.querySelector(SELECTORS.thumbnailShadow);
  105. if (thumbnailShadow) {
  106. thumbnailShadow.remove();
  107. }
  108.  
  109. const mediaBackground = document.querySelector(SELECTORS.mediaBackground);
  110. if (mediaBackground) {
  111. mediaBackground.style.backgroundColor = 'transparent';
  112. }
  113.  
  114. queryElementsDeep(SELECTORS.blurredSpan).forEach(span => {
  115. span.style.filter = '';
  116. });
  117. queryElementsDeep(SELECTORS.scrim).forEach(scrim => {
  118. scrim.remove();
  119. });
  120. queryElementsDeep(BADGE_CONTAINER).forEach(badge => {
  121. badge.remove();
  122. });
  123. }
  124. catch (error) {
  125. console.error("Error in removeNSFWBlock:", error);
  126. }
  127. }
  128.  
  129. const observer = new MutationObserver(removeNSFWBlock);
  130. const contentContainer = document.documentElement;
  131. observer.observe(contentContainer, {
  132. childList: true,
  133. subtree: true,
  134. attributes: false
  135. });
  136.  
  137. const shredditCheckInterval = setInterval(() => {
  138. if (!document.querySelector('shreddit-app')) {
  139. observer.disconnect();
  140. clearInterval(shredditCheckInterval);
  141. }
  142. }, 5000);
  143. })();