123Pan去广告

去广告、修改会员[会员无实际效果,仅供娱乐]

// ==UserScript==
// @name        123Pan去广告
// @namespace   http://tampermonkey.net/
// @match       https://www.123pan.com/*
// @match       https://www.123pan.cn/*
// @match       https://www.123684.com/*
// @match       https://www.123865.com/*
// @grant       unsafeWindow
// @grant       GM_addStyle
// @run-at      document-start
// @version     1.9
// @license     MIT
// @author      Berger
// @description 去广告、修改会员[会员无实际效果,仅供娱乐]


// @note         1.9 [适配]域名
// @note         1.8 [修复]一些已知的BUG
// @note         1.7 [新增]适配网页下载
// @note         1.6 [适配]123Pan cn域名
// @note         1.5 [修复]无法上传文件的BUG
// @note         1.4 [修复]一些已知的BUG
// @note         1.3 [新增]文件列表默认修改为更新时间降序排序
// @note         1.2 [修复]一些已知的BUG
// @note         1.1 [新增]手机端去广告
// @note         1.0 [新增]PC去广告 [新增]会员修改
// ==/UserScript==


(function () {
        'use strict';

        const store = {
            modifiedUserInfo: null, path: null,
        };

        const utils = {
            removeElement(element) {
                if (element) {
                    element.remove()
                }
            }
        }

        store.path = new URLSearchParams(new URL(location.href).search).get('path');

        function modifyUserInfoResponse(originalResponse) {
            try {
                const modifiedUserInfoResponse = originalResponse
                modifiedUserInfoResponse.data.SpacePermanent = 5 * 1024 * 1024 * 1024 * 1024 //总容量
                modifiedUserInfoResponse.data.SpaceTempExpr = "2099-01-01T00:00:00+00:00" //容量过期时间
                modifiedUserInfoResponse.data.Vip = true // 是否为VIP
                modifiedUserInfoResponse.data.VipLevel = 2 // VIP等级
                modifiedUserInfoResponse.data.VipExpire = "2099-01-01 08:00:00" // VIP过期时间
                modifiedUserInfoResponse.data.SpaceBuy = true // 是否购买容量
                modifiedUserInfoResponse.data.GrowSpaceAddCount = 128 // 容量等级
                modifiedUserInfoResponse.data.IsAuthentication = true
                modifiedUserInfoResponse.data.SignType = 1

                store.modifiedUserInfo = modifiedUserInfoResponse.data.user
                return modifiedUserInfoResponse
            } catch (error) {
                console.log(error)
                return originalResponse // 返回原始响应内容
            }
        }

        function applyInterceptors() {
            const originOpen = XMLHttpRequest.prototype.open;
            const originalSend = XMLHttpRequest.prototype.send;
            const originalRequestHeader = XMLHttpRequest.prototype.setRequestHeader;

            XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
                this._url = url;
                this._method = method;

                // 检查并修改 /b/api/share/get 请求的 orderBy 和 orderDirection 参数
                if (url.includes('/b/api/share/get')) {
                    if (!url.includes('orderBy=create_at') && !url.includes('orderDirection=desc')) {
                        this._url = url.replace('orderBy=file_name', 'orderBy=create_at')
                            .replace('orderDirection=asc', 'orderDirection=desc');
                    }
                }

                // 监听 /info 请求的响应
                if (url.indexOf('/info') !== -1) {
                    this.addEventListener('readystatechange', function () {
                        if (this.readyState === 4) {
                            const res = JSON.parse(this.responseText);
                            const modifiedUserInfoResponse = modifyUserInfoResponse(res);
                            Object.defineProperty(this, "responseText", {
                                writable: true,
                            });
                            this.responseText = modifiedUserInfoResponse;
                        }
                    });
                }

                originOpen.call(this, method, this._url, async, user, password);
            };

            XMLHttpRequest.prototype.setRequestHeader = function (header, value) {
                if (this._url.includes('/b/api/share/download/info')) {
                    let headers = {
                        "user-agent": "123pan/v2.4.0(Android_7.1.2;Xiaomi)",
                        "platform": "android",
                        "app-version": "61",
                        "x-app-version": "2.4.0"
                    }
                    if (header.toLowerCase() in headers) {
                        value = headers[header.toLowerCase()];
                    }
                }
                return originalRequestHeader.apply(this, [header, value]);
            };

            XMLHttpRequest.prototype.send = function (body) {
                originalSend.call(this, body);
            };
        }

        function editShareDownloadButton() {
            const mobileDownloadButton = `<svg class="icon undefined" aria-hidden="true"><use xlink:href="#icon-share_folders_downloads"></use></svg>下载文件(插件)`
            const webDownloadButton = `<svg class="icon undefined" aria-hidden="true" style="color:#ffffff;margin-right:5px"><use xlink:href="#top_btn_download2"></use></svg>浏览器下载(插件)`

            if (location.href.indexOf('123pan.com/s') || location.href.indexOf('123pan.cn/s')) {
                const mobileDownloadButtonList = document.querySelectorAll('.appBottomBtnNew ')
                if (mobileDownloadButtonList.length > 0) {
                    mobileDownloadButtonList[0].innerHTML = mobileDownloadButton
                }

                const webDownloadButtonList = document.querySelectorAll('.register ')
                if (webDownloadButtonList.length > 0) {
                    webDownloadButtonList[0].innerHTML = webDownloadButton
                    webDownloadButtonList[0].style.width = '150px'
                }
            }
        }

        applyInterceptors()


        // 移除电脑端广告
        function removeAdForPC() {
            // 顶部广告
            const topAD = document.querySelector('div.mfy-main-layout__head')
            utils.removeElement(topAD)

            // 右下角广告
            const rightBottomAD = document.querySelector('div.activity-box')
            utils.removeElement(rightBottomAD)

            //产品商城
            const asideAD = document.querySelector('div.sider-member-btn')
            utils.removeElement(asideAD)

            // 其他网盘转入
            const specialAD = document.querySelector('div.special-menu-item-container')
            utils.removeElement(specialAD)

        }

        function removeUploadAD() {
            const targetNode = document.querySelector('div[class="layout-dom"]');
            if (!targetNode) {
                return; // 如果未找到目标节点,则提前退出
            }
            const config = {childList: true, subtree: true}; // 添加 subtree 选项,以监听子节点的变动

            const observer = new MutationObserver((mutationsList, observer) => {
                for (const mutation of mutationsList) {
                    for (const node of mutation.addedNodes) {
                        if (node.nodeType === 1 && node.classList.contains('upbody')) {
                            const uploadAD = node.querySelector('div.uppy-Dashboard-slowSpeed-banner')
                            if (uploadAD) {
                                uploadAD.remove()
                            }
                            observer.disconnect(); // 找到目标节点后断开观察器
                            return; // 退出循环以避免多次触发
                        }
                    }
                }
            });

            observer.observe(targetNode, config);
        }


        // 移除手机端广告
        function removeAdForMobile() {
            GM_addStyle('.banner-container-h5{display:none !important}');//右侧登录提示栏
        }


        let main = {
            init() {
                removeAdForMobile()
                removeAdForPC()
                removeUploadAD()
                editShareDownloadButton()
            },
        }

        window.addEventListener('DOMContentLoaded', main.init);
    }
)()