123盘去广告

去除123盘背景广告、广告跳转、及广告横幅,屏蔽客户端下载和手机扫描,添加了150%的缩放,窗口宽度自适应

// ==UserScript==
// @name         123盘去广告
// @namespace    https://github.com/CreeperDisco/pan123-remove-ad
// @version      1.3.0
// @description  去除123盘背景广告、广告跳转、及广告横幅,屏蔽客户端下载和手机扫描,添加了150%的缩放,窗口宽度自适应
// @author       CreeperDisco
// @license      GPL-3.0-only
// @copyright    2024, CreeperDisco
// @match        https://www.123pan.com/s/*
// @match        https://www.123pan.cn/s/*
// @icon         https://statics.123957.com/static-by-custom/favicon.ico
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 定义一个函数来检查是否有指定的div
    function checkForContentBorder() {

        // 获取当前文档对象
        var doc = window.document;

        // 设置缩放级别 150%
        if (typeof doc.body.style.zoom !== 'undefined') {
            // 对于支持zoom属性的浏览器
            doc.body.style.zoom = '150%';
        } else if (typeof doc.body.style.webkitTransform !== 'undefined') {
            // 对于支持CSS3 transform属性的浏览器
            doc.body.style.webkitTransform = 'scale(1.5)';
            doc.body.style.transform = 'scale(1.5)';
        } else {
            // 如果以上都不支持,控制台给出提示
            console.log('您的浏览器不支持缩放.');
        }


        var contentBorderDiv = document.querySelector('.contentBorder');
        if (contentBorderDiv) {
            // 如果找到了带有contentBorder类的div,执行后续代码
            console.log('找到了contentBorder!');
            pcWeb();
        } else {
            // 如果没有找到,等待一段时间后再次检查
            setTimeout(checkForContentBorder, 100); // 每0.1秒检查一次
        }
    }

    function shareExpired() {
        // 移动div的函数
        function moveDivs() {
            // 查找具有类名"webbody svip-body"的源div
            var sourceDiv = document.querySelector('.webbody.svip-body');

            if (sourceDiv) {
                // 查找源div的所有一级子div
                var childDivs = sourceDiv.querySelectorAll(':scope > div');

                // 查找具有类名"appdiv web-wrap"的目标div
                var targetDiv = document.querySelector('.appdiv.web-wrap');

                if (targetDiv) {
                    // 遍历每个一级子div并将其移动到目标div
                    for (var i = 0; i < childDivs.length; i++) {
                        // 将一级子div附加到目标div
                        targetDiv.appendChild(childDivs[i]);
                    }
                }
            }
            removeAd();
        }

        function removeAd() {

            // 获取所有需要移除的webbody svip-body(移除 背景广告)
            let elements = document.querySelectorAll('div.webbody.svip-body');
            // 移除它
            elements.forEach(element => {
                element.parentNode.removeChild(element);
            });
        }

        // 创建一个MutationObserver实例
        var observer = new MutationObserver(moveDivs);

        // 配置MutationObserver,观察整个DOM树的变化
        var config = {
            childList: true,
            subtree: true
        };

        // 开始观察document.body的变化
        observer.observe(document.body, config);

        // 在DOMContentLoaded事件中尝试移动div
        document.addEventListener('DOMContentLoaded', moveDivs);

    }

    // 定义 leftCard 函数(beta)
    function leftCard() {
        // 创建样式元素
        var style = document.createElement('style');
        style.type = 'text/css';

        // 定义样式元素
        var cssRules = `
        .leftCard {
            width: 406px;
            background: hsla(0, 0%, 100%, .8);
            display: flex;
            align-items: center;
            justify-content: center;
            -webkit-backdrop-filter: blur(25px);
            backdrop-filter: blur(25px);
        }

        .leftCard .ca-top {
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            grid-gap: 8px;
            gap: 8px;
        }

        .leftCard .ca-top .infoText {
            font-size: 14px;
            color: #3a4056;
            line-height: 16px;
            font-weight: 600;
        }

        .leftCard .ca-top .rematimeText {
            font-size: 12px;
            color: #7b808f;
            line-height: 14px;
            font-style: normal;
            font-weight: 400;
        }

        .leftCard .ca-fot {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            margin-top: 40px;
            grid-gap: 24px;
            gap: 24px;
        }

        .leftCard .ca-fot .sharePwd {
            width: 254px;
            height: 44px;
            text-align: center;
            border-radius: 8px;
            border: 1px solid #eaeaea;
        }

        .leftCard .ca-fot .sharePwd:focus {
            border: 1px solid #597dfc;
        }

        .leftCard .ca-fot .submitCode {
            width: 254px;
            height: 44px;
            background: #597dfc;
            color: #fff;
            font-size: 14px;
            border-radius: 8px;
        }
    `;

        // 将 CSS 规则附加到 style 元素
        if (style.styleSheet) {
            style.styleSheet.cssText = cssRules;
        } else {
            style.appendChild(document.createTextNode(cssRules));
        }

        // 将样式元素写到文档的头部
        document.head.appendChild(style);
    }

    // 定义 pcWeb 函数
    function pcWeb() {

        // 获取所有类名为contentBorder和sharheader的div元素
        //var elementsToMove = document.querySelectorAll('.contentBorder, .sharheader, .leftCard');
        var elementsToMove = document.querySelectorAll('.contentBorder, .sharheader');


        // 获取类名为appdiv web-wrap的div元素
        var appDivWebWrap = document.querySelector('.appdiv.web-wrap');

        // 遍历所有需要移动的div元素
        for (var i = 0; i < elementsToMove.length; i++) {
            // 将每个元素移动到appDivWebWrap div元素内
            appDivWebWrap.appendChild(elementsToMove[i]);
        }

        // 获取所有需要移除的div元素,包括类名为webbody svip-body、pointer和qrcode_btn的元素(移除 背景广告 横幅广告 二维码按钮)
        var elementsToRemove = document.querySelectorAll('.webbody.svip-body, .pointer, .qrcode_btn');

        // 遍历所有需要移除的div元素
        for (var j = 0; j < elementsToRemove.length; j++) {
            // 从DOM中移除每个元素
            elementsToRemove[j].parentNode.removeChild(elementsToRemove[j]);
        }


        // 获取contentBorder元素(文件列表宽度自适应)
        var contentBorder = document.querySelector('.contentBorder');

        // 设置contentBorder元素的宽度为浏览器窗口宽度
        contentBorder.style.width = window.innerWidth + 'px';

        // 当窗口大小改变时,更新contentBorder元素的宽度
        window.addEventListener('resize', function() {
            contentBorder.style.width = window.innerWidth + 'px';
        });


        // 移除第二个类名为 'register' 的 div(移除 下载客户端)
        // 获取所有类名为 'register' 的 div 元素
        var registerDivs = document.getElementsByClassName('register');

        // 检查是否有至少两个这样的 div 元素
        if (registerDivs.length >= 2) {
            // 移除第二个元素
            registerDivs[1].parentNode.removeChild(registerDivs[1]);
            console.log('移除了下载客户端');
        }
    }

    // 新建 phoneWeb 函数
    function phoneWeb() {
        isPhone(); //目前没做代码,先这样吧
    }

    function isPhone() {
        var userChoice = confirm("您的网页是手机端,目前不适配,请先卸载,等待以后版本\n如果您的设备被误判为手机端,请按“确认”键并【反馈】\n如果没误判,按“取消”");
        if (userChoice) {
            window.location.href = 'https://greasyfork.org/zh-CN/scripts/503621-123%E7%9B%98%E5%8E%BB%E5%B9%BF%E5%91%8A/feedback';
        } else {
            // 不做任何操作,仅关闭弹出框
        }
    }

    window.onload = function() {
        // 定义一个函数来检查当前页面是否在移动设备上查看
        function isMobileDevice() {
            var userAgent = navigator.userAgent || navigator.vendor || window.opera;

            // 检查常见的移动设备用户代理字符串
            if (/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)) {
                return true; // 是移动设备
            }

            return false; // 不是移动设备
        }

        // 检查页面中是否存在“分享已过期”字样,并调用 shareExpired 函数
        var expiredText = document.body.innerHTML.indexOf('分享已过期') !== -1;

        // 检测设备类型并执行相应函数
        if (isMobileDevice()) {
            phoneWeb(); // 如果是移动设备,执行phoneWeb函数
        } else {
            console.log('您的网页是PC端');

            if (expiredText) {
                console.log('分享已过期');

                // 如果存在“分享已过期”,调用 shareExpired 函数
                shareExpired();
            } else {
                // 开始检查是否有contentBorder
                checkForContentBorder();
            }
        }
    };

})();