您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Bypasses various adblock detectors and paywalls.
// ==UserScript== // @name Adblock Detector Bypasser // @name:vi Bỏ Qua Phát Hiện Adblock // @namespace http://tampermonkey.net/ // @version 1.2 // @description Bypasses various adblock detectors and paywalls. // @description:vi Bỏ qua phát hiện adblock và paywalls khác nhau. // @author Yuusei // @match *://*/* // @license GPL-3.0-only // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant window.onurlchange // @run-at document-start // ==/UserScript== (function() { 'use strict'; // --- UserScript Configuration --- const SCRIPT_NAME = "Adblock Detector Bypasser"; const ENABLED_STORAGE_KEY = "adblockerBypassEnabled"; // --- Original Code --- // Debug mode toggle const DEBUG_MODE = false; function log(message, ...args) { if (DEBUG_MODE) { console.log(`[${SCRIPT_NAME}] ${message}`, ...args); } } // Function to block adblockDetectors function blockAdblockDetectors() { const excludedElements = ['BODY', 'HTML']; const excludedPrefixes = ['ShortsLockupView', "ytSearchbox"]; const blockElements = [ "#vndjywodduqjrmenpowdbkcevrszhtxzzowjcnuvaqmzgwdmtyzsdmrc", ".adblock_title", ".adblock_subtitle", ".popSc", ".popBc", ".ab-detector-wrap", "#abDetectorModal", "#adDetectorElm", ".ad", ".dialog-overlay", ".dialog-overlay-blur", ".dialog.dialog-open.dialog-variant-default", ".link.link--external", ".link.link--internal", ".bb089aa6", "#arlinablock", ".modal.fade.in", ".modal-backdrop.fade.in", ".modal-backdrop", ".fc-ab-root", "body > div.fc-ab-root", ".fbs-auth__container.fbs-auth__adblock", ".overlay-34_Kj", ".wrapper-3AzfF", "#qa-modal-body", ".fixed.left-0.right-0.bottom-0.paywall-overlay.checkout-paywall-overlay", "#paywall-ui-responsive-modal", '[data-qa="wall-background"]', "#wall-bottom-drawer", ".fEy1Z2XT", ".zephr-article-modal-backdrop.zephr-backdrop", ".zephr-modal-content", ".zephr-editorial-newsletter-backdrop.zephr-backdrop", ".nytc---modal-window---windowContainer.nytc---modal-window---isShown.nytc---shared---blackBG", ".tp-modal", ".tp-backdrop.tp-active", "modality-custom-element", "[name='metering-modal']", ".c-nudge__container.c-gate__container", ".c-nudge__container.c-regGate__container", ".css-n7r8pg", ".css-1bd8bfl", ".overlay__59af11e2", ".tp_modal", ".tp-backdrop.tp-active", "div[class^='sp_message_container']", "div[class^='sp_veil']", ".css-1mv333l", ".css-19q4c8e", ".css-gx5sib", ".myAccountAuth", ".css-1aa2f1p", "#lire-ui-886237", "#fortress-container-root", "#yzwall", "#variant_top_bar", "#tie-popup-adblock", ".tie-popup", "#modal-whitelist", "#modal-overlay", "#nindo-popup-portal", "#nindo-drawer-portal", ".bt-sw-container", ".bt-sw-modal", ".lbzrkre", "#adblock_tooltip", ".adblock-killme-overlay", ".bfddebf37-wrapper", ".bfddebf37-blackout", ".protection", ".q-sticky-footer.q-footer-body.q-red-bild-design", ".inactivity", ".angery-message", ".items-stretch.md\\:items-center.fill-mode-both.fixed.bottom-0.left-0.right-0.top-0.bg-backdrop\\/70.backdrop-blur-sm.animate-in.fade-in.ease-outExpo.duration-200", ".py-md.px-md.grow.flex.flex-col.justify-center.md\\:pt-lg.md\\:pb-lg", ".shadow-md.overflow-y-auto.scrollbar-thin.scrollbar-thumb-idle", ".bx-slab", 'div[id^="bx-shroud-"]', 'div[id^="bx-close-outside-"]', ".mx-4.flex.h-fit.flex-col.items-center.justify-center.self-center.rounded-lg.bg-foreground.p-4.sm\\:inset-x-12.sm\\:bottom-12.sm\\:top-auto.sm\\:flex-row.sm\\:self-end.sm\\:p-10.md\\:absolute.md\\:inset-x-4.md\\:mx-auto.pointer-events-auto", ".fixed.inset-x-0.bottom-0.z-20.flex.h-full.bg-white\\/80", "#mj-adblock-widget-2", "#template-container", ".o-message__container", "#tp-yt-iron-overlay-backdrop", ".tp-yt-iron-overlay-backdrop", "#bdn-paywall-view", ".wa-limit-modal", ".bck-adblock.is--active", ".adblock__container", ".adblock", ".Overlay__container___2TqtL Overlay__containerActive___2te0I", "#portal-root", ".unblocker-container", ".unblocker-wrapper", ".unblocker", "#cpidQokFQn", ".swal2-container.swal2-center.swal2-backdrop-show", ".eejqlhsrwxhwgizceicunpzytknyhvlkrdguafbrbvlkamnytyrtsdmrc", ]; let elementsBlocked = false; blockElements.forEach(selector => { try { document.querySelectorAll(selector).forEach(el => { if (!excludedElements.includes(el.tagName.toUpperCase())) { el.style.setProperty("display", "none", "important"); log(`Blocked element with selector: ${selector}`); elementsBlocked = true; const suffix = el.id ? el.id.slice(-5) : ""; if (suffix) { const sameIdElements = document.querySelectorAll(`[id$="${suffix}"]`); sameIdElements.forEach(sameIdEl => { if (sameIdEl.id.length > 30 && sameIdEl.id.endsWith(suffix) && sameIdEl !== el) { log(`Hiding additional ID with suffix: ${suffix} from ID: ${sameIdEl.id}`); sameIdEl.style.setProperty("display", "none", "important"); elementsBlocked = true; } }); } } }); } catch (error) { log(`Error hiding element with selector: ${selector}`, error); } }); const randomPattern = /^[a-zA-Z0-9]{30,}$/; document.querySelectorAll('*').forEach(el => { try { if (excludedElements.includes(el.tagName.toUpperCase())) return; const matchesPrefix = excludedPrefixes.some(prefix => el.tagName.startsWith(prefix) || (el.id && el.id.startsWith(prefix)) || Array.from(el.classList).some(className => className.startsWith(prefix)) ); if (matchesPrefix) return; if (el.id && randomPattern.test(el.id) && el.id.length > 30) { const suffix = el.id.slice(-5); el.style.setProperty("display", "none", "important"); log(`Blocked element with random ID: ${el.id}`); elementsBlocked = true; const sameIdElements = document.querySelectorAll(`[id$="${suffix}"]`); sameIdElements.forEach(sameIdEl => { if (sameIdEl.id.length > 30 && sameIdEl.id.endsWith(suffix) && sameIdEl !== el) { log(`Hiding additional ID with suffix: ${suffix} from ID: ${sameIdEl.id}`); sameIdEl.style.setProperty("display", "none", "important"); elementsBlocked = true; } }); } Array.from(el.classList).forEach(cls => { if (randomPattern.test(cls) && cls.length > 30) { el.style.setProperty("display", "none", "important"); log(`Blocked element with random class: ${cls}`); elementsBlocked = true; } }); if (el.src && el.src.includes("chp-ads-block-detector")) { el.style.setProperty("display", "none", "important"); log(`Blocked element with src: ${el.src}`); elementsBlocked = true; } if (el.href && el.href.includes("chp-ads-block-detector")) { el.style.setProperty("display", "none", "important"); log(`Blocked element with href: ${el.href}`); elementsBlocked = true; } } catch (error) { log("Error blocking dynamic element", error); } }); log("Adblock detector element scan complete."); return elementsBlocked; } const forceEnableScrolling = () => { const allElements = document.querySelectorAll('body *'); allElements.forEach(element => { const computedStyle = window.getComputedStyle(element); if (computedStyle.overflow === 'hidden' || computedStyle.overflowY === 'hidden') { element.style.setProperty('overflow', 'auto', 'important'); element.style.setProperty('overflowY', 'auto', 'important'); } }); document.documentElement.style.setProperty('overflow', 'auto', 'important'); document.documentElement.style.setProperty('overflowY', 'auto', 'important'); document.body.style.setProperty('overflow', 'auto', 'important'); document.body.style.setProperty('overflowY', 'auto', 'important'); log("Forced scrolling on all elements."); }; let scrollObserver = null; function enableScrollingOnPage() { const scrollClasses = [ "mol-fe-ab-dialog", "body--no-scroll", "nytc---modal-window---noScroll", "tp-modal-open", "with-gate", "overflow-hidden", "css-mcm29f", "scroll-lock", "modal-open", "is-modal-open", "fixed-modal", "zephr-modal-open", "bt-sw-overflow", "bx-client-overlay", "bx-client-overlay-ios", "swal2-shown" ]; const otherScrollPopupFilters = [ { value: "span[data-reactroot]", type: "popup" }, { value: "body[data-paywall-overlay-status='show']", type: "scroll" }, { value: ".overlay", type: "popup" } ]; const MAX_TRIES = 5; let tries = 0; const attemptEnableScroll = () => { let canScroll = false; const htmlElement = document.documentElement; const bodyElement = document.body; [htmlElement, bodyElement].forEach(element => { if (element) { if (element.style.overflow === "hidden") { element.style.setProperty("overflow", "auto", "important"); canScroll = true; } if (element.style.overflowY === "hidden") { element.style.setProperty("overflowY", "auto", "important"); canScroll = true; } element.style.removeProperty('overflow'); element.style.removeProperty('overflow-y'); } }); scrollClasses.forEach(filter => { const elements = document.getElementsByClassName(filter); while (elements.length > 0 && elements[0]) { elements[0].classList.remove(filter); canScroll = true; } }); otherScrollPopupFilters.forEach(filter => { const element = document.querySelector(filter.value); if (element) { if (filter.type === "scroll") { element.style.setProperty("overflow", "auto", "important"); } else if (filter.type === "popup") { element.style.setProperty("display", "none", "important"); } canScroll = true; } }); if (canScroll) { log("Scrolling has been re-enabled."); } else if (tries < MAX_TRIES) { tries++; setTimeout(attemptEnableScroll, 500); } }; if (document.body) { if (scrollObserver) scrollObserver.disconnect(); // Disconnect previous if any scrollObserver = new MutationObserver(attemptEnableScroll); scrollObserver.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); attemptEnableScroll(); } else { window.addEventListener('DOMContentLoaded', () => { if (document.body) { if (scrollObserver) scrollObserver.disconnect(); scrollObserver = new MutationObserver(attemptEnableScroll); scrollObserver.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); } attemptEnableScroll(); }); } } function classOfStubbornSiteAdblockDetectors() { const tieBody = document.getElementById("tie-body"); if (tieBody?.classList.contains("tie-popup-is-opend")) { tieBody.classList.remove("tie-popup-is-opend"); log("Class 'tie-popup-is-opend' removed from #tie-body"); } if (document.body?.classList.contains("bfddebf37-blur")) { document.body.classList.remove("bfddebf37-blur"); log("Class 'bfddebf37-blur' removed from <body>"); } } function hideYtElements() { let changed = false; const dismissButton = document.querySelector('.ytd-enforcement-message-view-model #dismiss-button, .ytp-ad-skip-button-modern, button[aria-label*="Skip Ad"]'); if (dismissButton && typeof dismissButton.click === 'function') { dismissButton.click(); log("YouTube dismiss/skip button clicked."); changed = true; } const elementsToHide = ['tp-yt-paper-dialog', 'ytd-enforcement-message-view-model', 'tp-yt-iron-overlay-backdrop']; elementsToHide.forEach(tagNameOrClass => { const selector = tagNameOrClass.startsWith('.') || tagNameOrClass.startsWith('#') ? tagNameOrClass : tagNameOrClass; document.querySelectorAll(selector).forEach(element => { if (element.style.display !== 'none') { element.style.setProperty('display', 'none', 'important'); log(`<${tagNameOrClass}> has been hidden on YouTube.`); changed = true; } }); }); const player = document.getElementById('movie_player'); if (player?.classList.contains('ytp-pause-overlay')) { player.classList.remove('ytp-pause-overlay'); const video = player.querySelector('video'); if (video?.paused) { video.play().catch(e => log("Error trying to play video:", e)); log("Removed ytp-pause-overlay and attempted to play video."); changed = true; } } return changed; } let runOnceExecutedForCurrentPage = false; function runOnce() { if (runOnceExecutedForCurrentPage) return; log("Running one-time setup logic for current page."); if (window.location.hostname.includes("dailymotion.com") && window.location.pathname.startsWith('/video/')) { log('Dailymotion video page detected.'); var videoId = window.location.pathname.split('/')[2]; if (!videoId) { log('Could not extract Dailymotion video ID.'); return; } log('Extracted Dailymotion video ID:', videoId); let modal; function createModal() { if (document.getElementById('adb-cpe-dailymotion-modal')) return; modal = document.createElement('div'); modal.id = 'adb-cpe-dailymotion-modal'; modal.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.8); display: flex; justify-content: center; align-items: center; z-index: 2147483647;`; var closeButton = document.createElement('button'); closeButton.innerText = 'Close AdB by CPE Player'; closeButton.style.cssText = ` position: absolute; top: 20px; right: 20px; padding: 10px; background-color: #4CAF50; border: none; cursor: pointer; z-index: 2147483647; color: white;`; closeButton.onclick = function() { if (modal && modal.parentNode) modal.parentNode.removeChild(modal); createOpenPlayerButton(); }; var iframe = document.createElement('iframe'); iframe.src = `https://www.dailymotion.com/embed/video/${videoId}?autoplay=1`; iframe.width = '80%'; iframe.height = '80%'; iframe.frameBorder = '0'; iframe.allowFullscreen = true; iframe.allow = "autoplay; fullscreen"; modal.appendChild(iframe); modal.appendChild(closeButton); document.body.appendChild(modal); log('Dailymotion modal created.'); } function createOpenPlayerButton() { if (document.getElementById('adb-cpe-dailymotion-open-btn')) return; var openPlayerButton = document.createElement('button'); openPlayerButton.id = 'adb-cpe-dailymotion-open-btn'; openPlayerButton.innerText = 'Open AdB by CPE Player'; openPlayerButton.style.cssText = ` position: fixed; bottom: 15px; right: 20px; padding: 10px; background-color: #4CAF50; border: none; cursor: pointer; z-index: 2147483646; color: white;`; openPlayerButton.onclick = function() { if (openPlayerButton.parentNode) openPlayerButton.parentNode.removeChild(openPlayerButton); const nameDiv = document.getElementById('adb-cpe-dailymotion-name'); if (nameDiv && nameDiv.parentNode) nameDiv.parentNode.removeChild(nameDiv); createModal(); }; var extensionName = document.createElement('div'); extensionName.id = 'adb-cpe-dailymotion-name'; extensionName.innerText = `Powered by ${SCRIPT_NAME}`; extensionName.style.cssText = ` position: fixed; bottom: 50px; right: 20px; color: #4CAF50; font-size: 12px; z-index: 2147483646;`; document.body.appendChild(openPlayerButton); document.body.appendChild(extensionName); log('Dailymotion open player button created.'); } var playerWrapper = document.getElementById('player-wrapper'); if (playerWrapper) { playerWrapper.remove(); log('Removed Dailymotion player-wrapper.'); } createModal(); } runOnceExecutedForCurrentPage = true; } function updateStylesInStyleTag() { const styleTag = document.querySelector('style[data-id="std"]'); if (styleTag && styleTag.sheet) { try { const styleSheet = styleTag.sheet; for (let i = 0; i < styleSheet.cssRules.length; i++) { const rule = styleSheet.cssRules[i]; if (rule.style) { if (rule.style.filter && rule.style.filter !== 'none') { rule.style.setProperty('filter', 'none', 'important'); log(`Updated filter for rule:`, rule.cssText); } if ( rule.selectorText?.includes('body') && rule.style.overflow === 'hidden' && rule.style.position === 'fixed' && rule.style.height === '100%' && rule.style.width === '100%' && rule.style.maxHeight === '100vh' ) { rule.style.setProperty('overflow', 'auto', 'important'); log(`Updated overflow for body rule:`, rule.cssText); } } } } catch (e) { log("Error accessing stylesheet rules (likely cross-origin):", e.message); } } } // --- Main Execution Logic --- let mainObserver = null; let intervalId = null; function runChecks() { log("Running checks..."); const isYouTube = window.location.hostname.includes("www.youtube.com"); let blockedSomething; if (isYouTube) { blockedSomething = hideYtElements(); } else { blockedSomething = blockAdblockDetectors(); classOfStubbornSiteAdblockDetectors(); enableScrollingOnPage(); } if (blockedSomething) { log("Blocked/modified something in this check cycle."); } } async function checkAdblockerStatusAndRun() { const isEnabled = await GM_getValue(ENABLED_STORAGE_KEY, true); if (!isEnabled) { log("Bypasser is disabled via menu command."); if (mainObserver) { mainObserver.disconnect(); mainObserver = null; } if (scrollObserver) { scrollObserver.disconnect(); scrollObserver = null; } if (intervalId) { clearInterval(intervalId); intervalId = null; } return; } log("Bypasser is enabled. Running checks."); runChecks(); // Initial run if (!mainObserver && document.body) { mainObserver = new MutationObserver(() => { log("DOM changed (body observer), re-running checks."); runChecks(); }); mainObserver.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class', 'hidden'] }); // Watch attributes relevant to hiding log("Main observer attached to document.body."); } else if (!document.body && !mainObserver) { // Fallback if body not ready window.addEventListener('DOMContentLoaded', () => { if (document.body && !mainObserver) { mainObserver = new MutationObserver(() => { log("DOM changed (body observer post-DOMContentLoaded), re-running checks."); runChecks(); }); mainObserver.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class', 'hidden'] }); log("Main observer attached to document.body (post-DOMContentLoaded)."); } }); } if (intervalId) clearInterval(intervalId); let intervalTime = 3000; intervalId = setInterval(() => { log("Interval check running."); runChecks(); }, intervalTime); setTimeout(async () => { const stillEnabled = await GM_getValue(ENABLED_STORAGE_KEY, true); if (stillEnabled && intervalId) { // Check if intervalId is still ours clearInterval(intervalId); intervalTime = 7000; intervalId = setInterval(() => { log("Slower interval check running."); runChecks(); }, intervalTime); log("Switched to slower interval."); } }, 60000); } async function initPageSpecific() { runOnceExecutedForCurrentPage = false; const isEnabled = await GM_getValue(ENABLED_STORAGE_KEY, true); if (isEnabled) { runOnce(); } } async function toggleAdblockerStatus() { const currentValue = await GM_getValue(ENABLED_STORAGE_KEY, true); const newValue = !currentValue; await GM_setValue(ENABLED_STORAGE_KEY, newValue); alert(`${SCRIPT_NAME} is now ${newValue ? 'ENABLED' : 'DISABLED'}. Reload page or navigate for changes to fully apply if issues persist.`); log(`Toggled to: ${newValue}`); if (newValue) { initPageSpecific(); // Re-run one-time stuff if needed checkAdblockerStatusAndRun(); // Start observers and checks } else { if (mainObserver) { mainObserver.disconnect(); mainObserver = null; } if (scrollObserver) { scrollObserver.disconnect(); scrollObserver = null; } if (intervalId) { clearInterval(intervalId); intervalId = null; } log("Disabled: Observers disconnected and intervals cleared."); // Note: Elements already hidden by the script might remain hidden until page reload. // Adding logic to revert all changes is complex and often not necessary for this type of script. } } GM_registerMenuCommand(`Toggle ${SCRIPT_NAME}`, toggleAdblockerStatus); // Initializations initPageSpecific(); checkAdblockerStatusAndRun(); // Handle SPA navigation let lastUrl = location.href; if (typeof window.onurlchange !== 'undefined') { window.addEventListener('urlchange', (info) => { const newUrl = info.url || location.href; log(`urlchange event detected. New URL: ${newUrl}`); if (newUrl !== lastUrl) { lastUrl = newUrl; initPageSpecific(); checkAdblockerStatusAndRun(); // Re-run checks and re-setup observers if needed } }); } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址