Greasy Fork

Greasy Fork is available in English.

不太灵VIP

删除不太灵的VIP查看限制和模糊效果

// ==UserScript==
// @name         不太灵VIP
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  删除不太灵的VIP查看限制和模糊效果
// @author       kkzh
// @match        https://www.0bt0.com/*
// @match        https://www.1bt0.com/*
// @match        https://www.2bt0.com/*
// @match        https://www.3bt0.com/*
// @match        https://www.4bt0.com/*
// @match        https://www.5bt0.com/*
// @match        https://www.6bt0.com/*
// @match        https://www.7bt0.com/*
// @match        https://www.8bt0.com/*
// @match        https://www.9bt0.com/*
// @grant        none
// @run-at       document-end
// @license MIT

// ==/UserScript==
(function() {
    'use strict';

    // 删除模糊效果的函数
    function removeBlurEffect() {
        let removedCount = 0;

        // 方法1: 查找包含模糊效果的元素(通过style属性)
        const blurredElements = document.querySelectorAll('div[style*="filter: blur"], div[style*="filter:blur"]');
        blurredElements.forEach(element => {
            element.style.filter = '';
            element.style.opacity = '';
            element.style.pointerEvents = '';
            element.style.userSelect = '';
            removedCount++;
        });

        // 方法2: 查找包含pointer-events: none的元素
        const disabledElements = document.querySelectorAll('div[style*="pointer-events: none"], div[style*="pointer-events:none"]');
        disabledElements.forEach(element => {
            // 检查是否同时包含模糊效果
            if (element.style.filter && element.style.filter.includes('blur')) {
                element.style.filter = '';
                element.style.opacity = '';
                element.style.pointerEvents = '';
                element.style.userSelect = '';
                removedCount++;
            }
        });

        // 方法3: 通过计算样式查找模糊元素
        const allDivs = document.querySelectorAll('div');
        allDivs.forEach(element => {
            const computedStyle = window.getComputedStyle(element);
            if (computedStyle.filter && computedStyle.filter.includes('blur')) {
                element.style.filter = 'none';
                element.style.pointerEvents = 'auto';
                element.style.userSelect = 'auto';
                removedCount++;
            }
        });

        if (removedCount > 0) {
            console.log(`已移除 ${removedCount} 个模糊效果元素`);
        }
    }

    // 删除VIP覆盖层的函数
    function removeVipOverlay() {
        let removedCount = 0;

        // 方法1: 通过类名查找VIP覆盖层
        const vipOverlays = document.querySelectorAll('.vip-gate-overlay, .vip-overlay, .vip-gate, .vip-notice');
        vipOverlays.forEach(element => {
            element.remove();
            removedCount++;
        });

        // 方法2: 查找包含VIP相关类名的元素
        const vipElements = document.querySelectorAll('[class*="vip-gate"], [class*="vip-overlay"], [class*="vip-notice"]');
        vipElements.forEach(element => {
            element.remove();
            removedCount++;
        });

        // 方法3: 查找包含VIP按钮的容器
        const vipButtons = document.querySelectorAll('.vip-gate-button, .vip-button, button[class*="vip"]');
        vipButtons.forEach(button => {
            // 查找包含该按钮的最外层容器
            let container = button;
            let attempts = 0;
            while (container.parentElement && attempts < 10) {
                const parent = container.parentElement;
                const style = window.getComputedStyle(parent);

                // 查找具有覆盖层特征的容器
                if (style.position === 'absolute' || style.position === 'fixed' ||
                    parseInt(style.zIndex) > 50 ||
                    parent.classList.toString().includes('overlay') ||
                    parent.classList.toString().includes('gate')) {
                    container = parent;
                } else {
                    break;
                }
                attempts++;
            }

            if (container && container !== document.body && container !== button) {
                container.remove();
                removedCount++;
            }
        });

        // 方法4: 查找具有高z-index的绝对定位元素(可能是覆盖层)
        const overlayElements = document.querySelectorAll('div');
        overlayElements.forEach(element => {
            const style = window.getComputedStyle(element);
            if ((style.position === 'absolute' || style.position === 'fixed') &&
                parseInt(style.zIndex) > 100) {

                // 检查是否包含VIP相关内容
                const text = element.textContent.toLowerCase();
                if (text.includes('vip') || text.includes('专属') || text.includes('开通') ||
                    text.includes('会员') || text.includes('升级')) {
                    element.remove();
                    removedCount++;
                }
            }
        });

        if (removedCount > 0) {
            console.log(`已移除 ${removedCount} 个VIP覆盖层元素`);
        }
    }

    // 移除所有可能的限制样式
    function removeAllRestrictions() {
        // 移除可能的CSS限制
        const style = document.createElement('style');
        style.textContent = `
            .vip-gate-overlay,
            .vip-overlay,
            .vip-gate,
            .vip-notice,
            [class*="vip-gate"],
            [class*="vip-overlay"] {
                display: none !important;
                visibility: hidden !important;
            }

            div[style*="filter: blur"],
            div[style*="filter:blur"] {
                filter: none !important;
                pointer-events: auto !important;
                user-select: auto !important;
                opacity: 1 !important;
            }
        `;
        document.head.appendChild(style);
    }

    // 主执行函数
    function removeRestrictions() {
        removeBlurEffect();
        removeVipOverlay();
        removeAllRestrictions();
    }

    // 强化的DOM监听器
    function setupObserver() {
        const observer = new MutationObserver((mutations) => {
            let shouldCheck = false;

            mutations.forEach((mutation) => {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(node => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            // 检查新添加的元素是否包含VIP相关内容
                            if (node.classList && (
                                node.classList.toString().includes('vip') ||
                                node.classList.toString().includes('gate') ||
                                node.classList.toString().includes('overlay')
                            )) {
                                shouldCheck = true;
                            }

                            // 检查是否有模糊效果
                            if (node.style && node.style.filter && node.style.filter.includes('blur')) {
                                shouldCheck = true;
                            }
                        }
                    });
                }

                if (mutation.type === 'attributes' &&
                    (mutation.attributeName === 'style' || mutation.attributeName === 'class')) {
                    shouldCheck = true;
                }
            });

            if (shouldCheck) {
                setTimeout(removeRestrictions, 100);
            }
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true,
            attributes: true,
            attributeFilter: ['style', 'class']
        });

        return observer;
    }

    // 初始化脚本
    function init() {
        // 立即执行一次
        removeRestrictions();

        // 设置观察器
        setupObserver();

        // 定期检查(备用方案)
        setInterval(removeRestrictions, 3000);

        console.log('影视管理系统VIP限制移除脚本 v2.0 已加载');
    }

    // 页面加载完成后执行
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

    // 页面完全加载后再执行一次
    window.addEventListener('load', () => {
        setTimeout(removeRestrictions, 1000);
    });

})();