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.8
  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. const lightDomElements = document.querySelectorAll(selector);
  20. lightDomElements.forEach(el => foundElements.add(el));
  21. const allElements = document.querySelectorAll('*');
  22. for (const el of allElements) {
  23. if (el.shadowRoot) {
  24. const shadowElements = el.shadowRoot.querySelectorAll(selector);
  25. shadowElements.forEach(el => foundElements.add(el));
  26. }
  27. }
  28. return Array.from(foundElements);
  29. }
  30.  
  31. const SELECTORS = {
  32. nsfwModal: `${'shreddit-async-loader'}[${'bundlename'}*="nsfw_blocking_modal"]`,
  33. promptContainer: `${'xpromo-nsfw-blocking-container'} > *`,
  34. prompt: '.prompt',
  35. blurredContainer: 'shreddit-blurred-container',
  36. thumbnailBlur: '.thumbnail-blur',
  37. communityHighlightCard: 'community-highlight-card',
  38. thumbnailImage: 'img.mb-0.h-full.w-full.object-cover',
  39. thumbnailShadow: '.thumbnail-shadow',
  40. mediaBackground: '.bg-media-background',
  41. blurredSpan: 'span.inner.blurred',
  42. scrim: '.absolute.top-0.left-0.w-full.h-full.bg-scrim',
  43. imageFilter: 'img.mb-0.h-full.w-full.object-cover',
  44. video: 'shreddit-player, video',
  45. mediaTelemetryObserver: 'media-telemetry-observer',
  46. mediaPlayerLoader: 'shreddit-async-loader[bundlename="media_player_loader"]',
  47. shredditPlayer: 'shreddit-player',
  48. outerContainer: 'div.outer.h-full',
  49. };
  50.  
  51. const BLURRED_TAG = SELECTORS.blurredContainer;
  52. const MEDIA_TELEMETRY_OBSERVER_SELECTOR = SELECTORS.mediaTelemetryObserver;
  53.  
  54. function removeNSFWBlock() {
  55. const nsfwModal = document.querySelector(SELECTORS.nsfwModal);
  56. if (nsfwModal) {
  57. nsfwModal.remove();
  58. }
  59.  
  60. const promptContainer = document.querySelector(SELECTORS.promptContainer);
  61. let prompt = null;
  62. if (promptContainer && promptContainer.shadowRoot) {
  63. prompt = promptContainer.shadowRoot.querySelector(SELECTORS.prompt);
  64. }
  65. if (prompt) {
  66. prompt.remove();
  67. }
  68.  
  69. const blurredContainers = document.querySelectorAll(BLURRED_TAG);
  70. blurredContainers.forEach(container => {
  71. if (container.shadowRoot?.innerHTML && container.firstElementChild) {
  72. container.firstElementChild.click();
  73.  
  74. container.firstElementChild.addEventListener('click', function(e) {
  75. e.preventDefault();
  76.  
  77. if (e.target.closest(MEDIA_TELEMETRY_OBSERVER_SELECTOR)) {
  78. e.stopPropagation();
  79. }
  80. }, { once: true });
  81. }
  82. });
  83.  
  84. document.querySelectorAll(SELECTORS.thumbnailBlur).forEach(el => el.classList.remove('thumbnail-blur'));
  85. document.querySelectorAll(SELECTORS.communityHighlightCard).forEach(card => card.removeAttribute('blurred'));
  86.  
  87. document.querySelectorAll(SELECTORS.imageFilter).forEach(img => img.style.removeProperty('filter'));
  88. document.querySelectorAll(SELECTORS.video).forEach(video => {
  89. video.style.filter = '';
  90. video.classList.remove('blur');
  91. });
  92.  
  93. const thumbnailShadow = document.querySelector(SELECTORS.thumbnailShadow);
  94. if (thumbnailShadow) {
  95. thumbnailShadow.remove();
  96. }
  97.  
  98. const mediaBackground = document.querySelector(SELECTORS.mediaBackground);
  99. if (mediaBackground) {
  100. mediaBackground.style.backgroundColor = 'transparent';
  101. }
  102.  
  103. queryElementsDeep(SELECTORS.blurredSpan).forEach(span => {
  104. span.style.filter = '';
  105. });
  106. queryElementsDeep(SELECTORS.scrim).forEach(scrim => {
  107. scrim.remove();
  108. });
  109. }
  110.  
  111. const observer = new MutationObserver(removeNSFWBlock);
  112. const contentContainer = document.documentElement;
  113. observer.observe(contentContainer, {
  114. childList: true,
  115. subtree: true,
  116. attributes: false
  117. });
  118.  
  119. const shredditCheckInterval = setInterval(() => {
  120. if (!document.querySelector('shreddit-app')) {
  121. observer.disconnect();
  122. clearInterval(shredditCheckInterval);
  123. }
  124. }, 5000);
  125. })();