无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 40476|回复: 338
打印 上一主题 下一主题

123盘下载完美解决方案----给那些天天还被123盘困扰的bro--2025年10月21日更新

    [复制链接]
跳转到指定楼层
1#
发表于 2024-10-16 16:23:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 5257 于 2025-10-22 08:18 编辑

这几天貌似123反制某浏览器会无限刷新,,自己用的谷歌chrom貌似没影响,
提供的:浏览器(去123址限制大小下载)_2.exe这个也正常使用
网络上有2种方案这里给出【充钱的就不要往下看了】
①:插件下载大法
一:写给小白的话:用chrom浏览器

安装Tampermonkey猴子Tampermonkey 猴子(油猴插件下载)--不会安装猴子的看2楼视频
https://chrome.zzzmh.cn/info/dhdgffkkebhmkfjojejmpbldmpobfkfo-----


再打开https://soujiaoben.org/#/s?id=519353&host=greasyfork (备用 https://gf.qytechs.cn/zh-CN/scripts/519353-123%E4%BA%91%E7%9B%98%E8%A7%A3%E9%94%81)安装即可突破1g限制
即可。还有就是要登陆123盘账户。否则还是会提示购买
目前2025年7月1日09:07:29还可以用
实在不会玩的。。。。。劝你放弃,不要为难自己

ps:感谢脚本开发者
顺便提一嘴,豆包云都不限容量和文件了。。。是不是可以弃暗投明了,好歹是字节旗下,有安全保障,至于秘密文件也别存网盘了

二:
看到还有人不会,好吧,懒人版!!
给你个浏览器集成了123脚本成品ˊazhong123456那边拿来),直接用即可
https://upan.lanzoub.com/b009nqvaf密码(双击密码看下载密码) 5257
文件名浏览器(去123址限制大小下载)_2.exe
②专用软件大法(转自隔壁
123网盘不限速专用下载工具:123pan-android.exe
下载地址  密码:d06n

使用专用工具下载123网盘文件,不限速,请先保存在自己网盘中,即可下载。





三:
下面的是给稍微会玩的人,操作:打开猴子→添加/新建脚本→新建页面的自带的内容删除掉(搞成空白)→黏贴下面的脚本保存即可2025年10月21日08:14:37更新

复制代码


// ==UserScript==
// @name         123云盘解锁
// @author       QingJ
// @namespace    https://github.com/QingJ01/123pan_unlock
// @version      1.1.1
// @description  专业的123云盘增强脚本 - 完美解锁会员功能、突破下载限制、去广告、支持自定义用户信息。支持个人网盘与分享页面,可在线配置,界面精美,功能强大,让你的123云盘体验更美好!
// @icon         https://gitee.com/selling-surpri ... E7%9B%98/123pan.ico
// @license      Apache Licence 2.0
// @match        *://*.123pan.com/*
// @match        *://*.123pan.cn/*
// @match        *://*.123684.com/*
// @match        *://*.123865.com/*
// @match        *://*.123952.com/*
// @match        *://*.123912.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        unsafeWindow
// @grant        GM_registerMenuCommand
// @grant        GM_setClipboard
// @run-at       document-start
// @downloadURL https://update.greasyfork.dpdns. ... A3%E9%94%81.user.js
// @updateURL https://update.greasyfork.dpdns. ... A3%E9%94%81.meta.js
// ==/UserScript==

(function() {
    'use strict';

    // 从存储中读取用户配置,若无则使用默认值
    const user = {
        vip: GM_getValue('vip', 1),
        svip: GM_getValue('svip', 1),
        pvip: GM_getValue('pvip', 0),
        ad: GM_getValue('ad', 1),
        name: GM_getValue('name', "QingJ"),
        photo: GM_getValue('photo', "http://q.qlogo.cn/headimg_dl?dst_uin=2903609300&spec=640&img_type=jpg"),
        mail: GM_getValue('mail', ""),
        phone: GM_getValue('phone', ""),
        id: GM_getValue('id', ""),
        level: GM_getValue('level', 128),
        endtime: GM_getValue('endtime', 253402185600),
        debug: GM_getValue('debug', 0),
    };

    // 保存原始的XMLHttpRequest和fetch方法
    const originalXHR = unsafeWindow.XMLHttpRequest;
    const originalFetch = unsafeWindow.fetch;
    const originalOpen = XMLHttpRequest.prototype.open;
    const originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;

    // 创建存储URL的符号
    const requestURL = Symbol('requestURL');

    //构建模板匹配功能
    const models = [
        {
            // 用户信息
            runat: "end",
            match: (url) => url.pathname.includes('api/user/info'),
            condition: () => user.vip === 1,
            action: (res) => {
                if (!res.data) return res;

                res.data.Vip = true;
                res.data.VipLevel = user.pvip ? 3 : (user.svip ? 2 : 1);

                if (user.ad === 1) res.data.IsShowAdvertisement = false;

                if (!res.data.UserVipDetail) {
                    res.data.UserVipDetail = {};
                }
                res.data.UserVipDetail.VipCode = res.data.VipLevel;

                if (user.pvip === 1) {
                    res.data.VipExpire = "永久有效";
                    res.data.UserVipDetail.UserPermanentVIPDetailInfos = [{
                        VipDesc: "长期VIP会员",
                        TimeDesc: " 永久有效",
                        IsUse: true
                    }];
                    res.data.UserVipDetailInfos = [];
                } else if (user.svip === 1) {
                    let time = new Date(user.endtime * 1000);
                    res.data.VipExpire = time.toLocaleString();
                    res.data.UserVipDetailInfos = [{
                        VipDesc: "SVIP 会员",
                        TimeDesc: time.toLocaleDateString() + " 到期",
                        IsUse: time >= new Date()
                    }];
                } else {
                    let time = new Date(user.endtime * 1000);
                    res.data.VipExpire = time.toLocaleString();
                    res.data.UserVipDetailInfos = [{
                        VipDesc: "VIP 会员",
                        TimeDesc: time.toLocaleDateString() + " 到期",
                        IsUse: time >= new Date()
                    }];
                }

                if (user.name) res.data.Nickname = user.name;
                if (user.photo) res.data.HeadImage = user.photo;
                if (user.mail) res.data.Mail = user.mail;
                if (user.phone) res.data.Passport = Number(user.phone);
                if (user.id) res.data.UID = Number(user.id);
                if (user.level) res.data.GrowSpaceAddCount = Number(user.level);

                return res;
            }
        },
        {
            // 用户报告信息
            runat: "end",
            match: (url) => url.pathname.includes('user/report/info'),
            condition: () => user.vip === 1,
            action: (res) => {
                if (res && res.data) {
                    res.data.vipType = user.pvip ? 3 : (user.svip ? 2 : 1);
                    res.data.vipSub = user.pvip ? 3 : (user.svip ? 2 : 1);
                    res.data.developSub = user.pvip ? 3 : (user.svip ? 2 : 1);
                }
                return res;
            }
        },
        {
            // 下载信息(请求头修改)
            runat: "header",
            match: (url) => [
                'file/download_info',
                'file/batch_download_info',
                'share/download/info',
                'file/batch_download_share_info'
            ].some(path => url.pathname.includes(path)),
            condition: () => true,
            action: (headers) => {
                headers.platform = 'android';
                return headers;
            }
        },
        {
            // 下载信息(响应体修改)
            runat: "end",
            match: (url) => [
                'file/download_info',
                'file/batch_download_info',
                'share/download/info',
                'file/batch_download_share_info'
            ].some(path => url.pathname.includes(path)),
            condition: () => true,
            action: (res, url) => {
                if (res.data && (res.data.DownloadUrl || res.data.DownloadURL)) {
                    res.data.DownloadUrl = rewriteDownloadUrl(res.data.DownloadUrl || res.data.DownloadURL);
                    res.data.DownloadURL = res.data.DownloadUrl;
                }
                return res;
            }
        },
        {
            // 下载限制错误拦截
            runat: "end",
            match: (url) => [
                'file/download_info',
                'file/batch_download_info',
                'share/download/info',
                'file/batch_download_share_info'
            ].some(path => url.pathname.includes(path)),
            condition: () => true,
            action: (res, url) => {
                if (res?.code === 5113 || res?.code === 5114 || res?.message?.includes("下载流量已超出")) {
                    return {
                        code: 400,
                        message: "【123云盘解锁】本次下载出现问题,本脚本不支持多文件下载哦!",
                        data: null
                    };
                }
                return res;
            }
        },
        {
            // 屏蔽数据收集请求
            runat: "start",
            match: (url) => url.pathname.includes('web_logs') || url.pathname.includes('metrics'),
            condition: () => true,
            action: () => {
                throw new Error('【123云盘解锁】已屏蔽此数据收集器');
            }
        }
    ];

    /**
     * 优化下载链接的重写逻辑,使其支持直接下载。
     * @param {string} urlString 原始下载URL。
     * @returns {string} 优化后的下载URL。
     */
    function rewriteDownloadUrl(urlString) {
        try {
            const originalURL = new URL(urlString);
            const isWebPro = originalURL.origin.includes("web-pro");

            // 统一设置 auto_redirect 参数
            originalURL.searchParams.set('auto_redirect', 0);

            if (isWebPro) {
                // 处理 web-pro 域名的情况
                let params = ((url) => {
                    try { return decodeURIComponent(atob(url)); }
                    catch { return atob(url); }
                })(originalURL.searchParams.get('params'));

                const directURL = new URL(params, originalURL.origin);
                directURL.searchParams.set('auto_redirect', 0);
                originalURL.searchParams.set('params', btoa(directURL.href));
                return decodeURIComponent(originalURL.href);
            } else {
                // 处理其他域名的情况
                const newURL = new URL('https://web-pro2.123952.com/download-v2/', originalURL.origin);
                newURL.searchParams.set('params', btoa(encodeURI(originalURL.href)));
                newURL.searchParams.set('is_s3', 0);
                return decodeURIComponent(newURL.href);
            }
        } catch (e) {
            if (user.debug) console.error('Download URL modification error:', e);
            return urlString;
        }
    }

    /**
     * 自定义XMLHttpRequest类,用于拦截和修改请求及响应。
     */
    function CustomXHR() {
        const xhr = new originalXHR();
        xhr[requestURL] = null;

        xhr.open = function(method, url, ...args) {
            try {
                const fullURL = new URL(url, location.origin);
                this[requestURL] = fullURL;
                return originalOpen.call(this, method, fullURL.href, ...args);
            } catch (e) {
                if (user.debug) console.error('XHR open error:', e);
                return originalOpen.call(this, method, url, ...args);
            }
        };

        xhr.setRequestHeader = function(name, value) {
            return originalSetRequestHeader.call(this, name, value);
        };

        xhr.addEventListener('readystatechange', function() {
            if (this.readyState === 4 && this[requestURL]) {
                try {
                    const matchedRules = models.filter(r =>
                        r.match(this[requestURL]) &&
                        r.condition() &&
                        r.runat === "end"
                    );

                    if (matchedRules.length > 0) {
                        let responseText;
                        try {
                            responseText = JSON.parse(this.responseText);
                        } catch {
                            responseText = this.responseText;
                        }

                        let modifiedResponse = responseText;
                        matchedRules.forEach(rule => {
                            modifiedResponse = rule.action(modifiedResponse, this[requestURL]);
                        });

                        if (modifiedResponse !== undefined) {
                            Object.defineProperty(this, 'responseText', {
                                value: typeof modifiedResponse === 'string'
                                    ? modifiedResponse
                                    : JSON.stringify(modifiedResponse),
                                writable: false
                            });

                            Object.defineProperty(this, 'response', {
                                value: typeof modifiedResponse === 'string'
                                    ? modifiedResponse
                                    : JSON.stringify(modifiedResponse),
                                writable: false
                            });
                        }
                    }
                } catch (e) {
                    if (user.debug) console.error('XHR response handler error:', e);
                }
            }
        });

        return xhr;
    }

    // 替换原始的XMLHttpRequest
    unsafeWindow.XMLHttpRequest = CustomXHR;

    /**
     * 重写fetch方法,用于拦截和修改请求及响应。
     */
    unsafeWindow.fetch = async function(input, init = {}) {
        const request = new Request(input, init);
        const url = new URL(request.url);

        // 应用请求发起前的规则(如屏蔽)
        const startRules = models.filter(r =>
            r.match(url) &&
            r.condition() &&
            r.runat === "start"
        );
        startRules.forEach(rule => {
            rule.action();
        });

        // 应用请求头修改规则
        const headerRules = models.filter(r =>
            r.match(url) &&
            r.condition() &&
            r.runat === "header"
        );
        headerRules.forEach(rule => {
            if (init.headers) {
                init.headers = rule.action({...init.headers}, url);
            }
        });

        const response = await originalFetch.call(this, request, init);

        // 应用响应修改规则
        const responseRules = models.filter(r =>
            r.match(url) &&
            r.condition() &&
            r.runat === "end"
        );

        if (responseRules.length > 0) {
            const clonedResponse = response.clone();
            let responseData;

            try {
                responseData = await clonedResponse.json();
            } catch {
                responseData = await clonedResponse.text();
            }

            let modifiedData = responseData;
            responseRules.forEach(rule => {
                modifiedData = rule.action(modifiedData, url);
            });

            return new Response(
                typeof modifiedData === 'string' ? modifiedData : JSON.stringify(modifiedData),
                {
                    status: response.status,
                    statusText: response.statusText,
                    headers: response.headers
                }
            );
        }

        return response;
    };

    /**
     * 格式化设置项并创建DOM元素。
     * @param {string} key 设置项的名称。
     * @param {*} value 设置项的当前值。
     * @param {string} comment 设置项的说明。
     * @returns {HTMLElement} 创建的DOM元素。
     */
    const formatSetting = (key, value, comment) => {
        const item = document.createElement('div');
        item.className = 'setting-item';

        const content = document.createElement('div');
        content.className = 'setting-content';

        const keyElement = document.createElement('div');
        keyElement.className = 'setting-key';
        keyElement.textContent = key;
        content.appendChild(keyElement);

        const isSwitch = typeof value === 'number' && (value === 0 || value === 1);
        const isEditable = ['用户名', '头像', '等级'].includes(key);

        if (isSwitch) {
            const switchContainer = document.createElement('label');
            switchContainer.className = 'switch';

            const input = document.createElement('input');
            input.type = 'checkbox';
            input.checked = value === 1;

            const slider = document.createElement('span');
            slider.className = 'slider round';

            switchContainer.appendChild(input);
            switchContainer.appendChild(slider);

            input.addEventListener('change', () => {
                let newValue = input.checked ? 1 : 0;
                switch (key) {
                    case 'VIP状态':
                        user.vip = newValue;
                        GM_setValue('vip', newValue);
                        break;
                    case 'SVIP显示':
                        user.svip = newValue;
                        GM_setValue('svip', newValue);
                        if (newValue === 0 && user.pvip === 1) {
                            user.pvip = 0;
                            GM_setValue('pvip', 0);
                        }
                        break;
                    case '长期会员显示':
                        user.pvip = newValue;
                        GM_setValue('pvip', newValue);
                        if (newValue === 1 && user.svip === 0) {
                            user.svip = 1;
                            GM_setValue('svip', 1);
                        }
                        break;
                    case '广告控制':
                        user.ad = newValue;
                        GM_setValue('ad', newValue);
                        break;
                    case '调试模式':
                        user.debug = newValue;
                        GM_setValue('debug', newValue);
                        break;
                }
                setTimeout(() => location.reload(), 300);
            });
            content.appendChild(switchContainer);
        } else if (isEditable) {
            const inputContainer = document.createElement('div');
            inputContainer.className = 'input-container';

            const inputElement = document.createElement('input');
            inputElement.type = key === '等级' ? 'number' : 'text';
            inputElement.value = value;
            inputElement.className = 'setting-input';

            if (key === '等级') {
                inputElement.min = 0;
                inputElement.max = 128;
            }

            const saveButton = document.createElement('button');
            saveButton.textContent = '保存';
            saveButton.className = 'save-btn';

            saveButton.addEventListener('click', () => {
                let newValue = inputElement.value;
                if (key === '等级') {
                    newValue = parseInt(newValue);
                    if (isNaN(newValue) || newValue < 0 || newValue > 128) {
                        alert('等级必须在 0-128 之间');
                        return;
                    }
                }

                switch (key) {
                    case '用户名':
                        user.name = newValue;
                        GM_setValue('name', newValue);
                        break;
                    case '头像':
                        user.photo = newValue;
                        GM_setValue('photo', newValue);
                        break;
                    case '等级':
                        user.level = newValue;
                        GM_setValue('level', newValue);
                        break;
                }

                saveButton.textContent = '已保存';
                saveButton.classList.add('saved');
                setTimeout(() => {
                    saveButton.textContent = '保存';
                    saveButton.classList.remove('saved');
                    location.reload();
                }, 1500);
            });

            inputContainer.appendChild(inputElement);
            inputContainer.appendChild(saveButton);
            content.appendChild(inputContainer);
        } else {
            const valueElement = document.createElement('div');
            valueElement.className = 'setting-value';
            valueElement.textContent = key === '过期时间' ? new Date(value * 1000).toLocaleString() : value;
            content.appendChild(valueElement);
        }

        item.appendChild(content);

        if (comment) {
            const commentElement = document.createElement('div');
            commentElement.className = 'setting-comment';
            commentElement.textContent = comment;
            item.appendChild(commentElement);
        }

        return item;
    };

    /**
     * 创建并显示设置面板。
     */
    function createSettingsPanel() {
        if (document.getElementById('vip-settings-panel')) {
            return;
        }

        const panel = document.createElement('div');
        panel.id = 'vip-settings-panel';
        panel.className = 'settings-panel';

        const header = document.createElement('div');
        header.className = 'panel-header';

        const title = document.createElement('h3');
        title.textContent = '123云盘脚本设置';
        header.appendChild(title);

        const closeButton = document.createElement('button');
        closeButton.className = 'close-btn';
        closeButton.innerHTML = '×';
        closeButton.addEventListener('click', () => panel.remove());
        header.appendChild(closeButton);

        panel.appendChild(header);

        const settingsList = document.createElement('div');
        settingsList.className = 'settings-list';

        const settings = [
            { key: 'VIP状态', value: user.vip, comment: '会员修改总开关' },
            { key: 'SVIP显示', value: user.svip, comment: '显示为超级会员 (关闭将自动关闭长期会员)' },
            { key: '长期会员显示', value: user.pvip, comment: '显示为长期会员 (开启将自动开启 SVIP 显示)' },
            { key: '广告控制', value: user.ad, comment: '关闭广告' },
            { key: '用户名', value: user.name, comment: '自定义用户名' },
            { key: '头像', value: user.photo, comment: '自定义头像URL' },
            { key: '等级', value: user.level, comment: '成长容量等级(最高128)' },
            { key: '过期时间', value: user.endtime, comment: '会员过期时间' },
            { key: '调试模式', value: user.debug, comment: '调试信息显示级别' }
        ];

        settings.forEach(setting => {
            settingsList.appendChild(formatSetting(setting.key, setting.value, setting.comment));
        });

        panel.appendChild(settingsList);

        const groupButton = document.createElement('a');
        groupButton.href = 'http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GGU3-kUsPnz1bq-jwN7e8D41yxZ-DyI2&authKey=ujGsFKDnF5zD3j1z9krJR5xHlWWAKHOJV2oarfAgNmqZAl0xmTb45QwsqgYPPF7e&noverify=0&group_code=1035747022';
        groupButton.target = '_blank';
        groupButton.className = 'group-btn';
        groupButton.innerHTML = `
            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path>
            </svg>
            <span>加入交流群</span>
        `;
        panel.appendChild(groupButton);

        addStyles();
        document.body.appendChild(panel);
    }

    /**
     * 创建设置面板的触发按钮。
     */
    function addTriggerButton() {
        const trigger = document.createElement('button');
        trigger.id = 'settings-trigger';
        trigger.innerHTML = `
            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                <circle cx="12" cy="12" r="3"></circle>
                <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
            </svg>
        `;
        trigger.addEventListener('click', createSettingsPanel);
        document.body.appendChild(trigger);
    }

    /**
     * 为设置面板和触发按钮添加CSS样式。
     */
    function addStyles() {
        const style = document.createElement('style');
        style.textContent = `
            .settings-panel {
                position: fixed;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
                background: #fff;
                border-radius: 12px;
                box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
                z-index: 10000;
                width: 90%;
                max-width: 500px;
                max-height: 80vh;
                overflow-y: auto;
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
                color: #333;
                animation: panelFadeIn 0.3s ease;
            }

            @keyframes panelFadeIn {
                from { opacity: 0; transform: translate(-50%, -48%); }
                to { opacity: 1; transform: translate(-50%, -50%); }
            }

            .panel-header {
                display: flex;
                justify-content: space-between;
                align-items: center;
                padding: 16px 20px;
                border-bottom: 1px solid #eee;
                background: #f8f9fa;
                border-radius: 12px 12px 0 0;
            }

            .panel-header h3 {
                margin: 0;
                font-size: 18px;
                font-weight: 600;
                color: #1a73e8;
            }

            .close-btn {
                background: none;
                border: none;
                font-size: 24px;
                cursor: pointer;
                color: #70757a;
                padding: 0;
                width: 30px;
                height: 30px;
                display: flex;
                align-items: center;
                justify-content: center;
                border-radius: 50%;
                transition: background 0.2s;
            }

            .close-btn:hover {
                background: #f1f3f4;
                color: #d93025;
            }

            .settings-list {
                padding: 16px 20px;
            }

            .setting-item {
                margin-bottom: 16px;
                padding: 12px;
                background: #f8f9fa;
                border-radius: 8px;
                border: 1px solid #e8eaed;
            }

            .setting-content {
                display: flex;
                justify-content: space-between;
                align-items: center;
                margin-bottom: 8px;
            }

            .setting-key {
                font-weight: 500;
                flex: 1;
            }

            .setting-value {
                color: #1a73e8;
                font-weight: 500;
                text-align: right;
            }

            .setting-comment {
                font-size: 12px;
                color: #70757a;
                line-height: 1.4;
            }

            .switch {
                position: relative;
                display: inline-block;
                width: 40px;
                height: 20px;
            }

            .switch input {
                opacity: 0;
                width: 0;
                height: 0;
            }

            .slider {
                position: absolute;
                cursor: pointer;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background-color: #ccc;
                transition: .3s;
            }

            .slider:before {
                position: absolute;
                content: "";
                height: 16px;
                width: 16px;
                left: 2px;
                bottom: 2px;
                background-color: white;
                transition: .3s;
            }

            input:checked + .slider {
                background-color: #1a73e8;
            }

            input:checked + .slider:before {
                transform: translateX(20px);
            }

            .slider.round {
                border-radius: 34px;
            }

            .slider.round:before {
                border-radius: 50%;
            }

            .input-container {
                display: flex;
                gap: 8px;
            }

            .setting-input {
                padding: 6px 10px;
                border: 1px solid #dadce0;
                border-radius: 4px;
                font-size: 14px;
                flex: 1;
                min-width: 0;
            }

            .setting-input:focus {
                outline: none;
                border-color: #1a73e8;
            }

            .save-btn {
                padding: 6px 12px;
                background: #1a73e8;
                color: white;
                border: none;
                border-radius: 4px;
                cursor: pointer;
                font-size: 12px;
                transition: background 0.2s;
                white-space: nowrap;
            }

            .save-btn:hover {
                background: #1557b0;
            }

            .save-btn.saved {
                background: #188038;
            }

            .group-btn {
                display: flex;
                align-items: center;
                justify-content: center;
                gap: 8px;
                margin: 16px 20px;
                padding: 10px 16px;
                background: linear-gradient(135deg, #1a73e8, #1557b0);
                color: white;
                border: none;
                border-radius: 8px;
                cursor: pointer;
                text-decoration: none;
                font-weight: 500;
                transition: all 0.3s;
            }

            .group-btn:hover {
                transform: translateY(-2px);
                box-shadow: 0 4px 8px rgba(26, 115, 232, 0.3);
            }

            #settings-trigger {
                position: fixed;
                bottom: 20px;
                right: 20px;
                width: 50px;
                height: 50px;
                background: #1a73e8;
                color: white;
                border: none;
                border-radius: 50%;
                cursor: pointer;
                z-index: 9999;
                box-shadow: 0 4px 12px rgba(26, 115, 232, 0.3);
                display: flex;
                align-items: center;
                justify-content: center;
                transition: all 0.3s;
            }

            #settings-trigger:hover {
                background: #1557b0;
                transform: scale(1.05);
            }

            @media (max-width: 600px) {
                .settings-panel {
                    width: 95%;
                    max-height: 85vh;
                }

                .panel-header {
                    padding: 14px 16px;
                }

                .settings-list {
                    padding: 12px 16px;
                }

                .setting-content {
                    flex-direction: column;
                    align-items: flex-start;
                    gap: 8px;
                }

                .input-container {
                    width: 100%;
                }

                #settings-trigger {
                    bottom: 16px;
                    right: 16px;
                    width: 44px;
                    height: 44px;
                }
            }
        `;
        document.head.appendChild(style);
    }

    // 注册菜单命令,方便用户从脚本管理器中打开设置面板
    GM_registerMenuCommand('⚙️ 打开设置面板', createSettingsPanel);

    // 确保在页面加载完成后添加触发按钮和样式
    function waitForBody() {
        if (document.body) {
            addTriggerButton();
            addStyles();
        } else {
            setTimeout(waitForBody, 100);
        }
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', waitForBody);
    } else {
        waitForBody();
    }
})()




点评

用心了  发表于 2024-10-17 17:26
谢谢五哥 专业知识  发表于 2024-10-17 09:25

评分

参与人数 6无忧币 +30 收起 理由
445112826 + 5 赞一个!
奈绪 + 5 赞一个!
jxpxwgh + 5 很给力!
Monkeydance + 5 很给力!
hs_32 + 5 很给力!
9zhmke + 5 很给力!

查看全部评分

2#
 楼主| 发表于 2024-10-16 16:26:37 | 只看该作者
本帖最后由 5257 于 2025-1-2 08:18 编辑


【保姆级教程】油猴脚本的安装使用_https://www.douyin.com/video/7184982116738944312

点评

谢谢。  详情 回复 发表于 2025-3-26 09:50
回复

使用道具 举报

3#
发表于 2024-10-16 16:38:52 | 只看该作者
谢谢分享
回复

使用道具 举报

4#
发表于 2024-10-16 16:40:17 | 只看该作者
谢谢分享,辛苦了
回复

使用道具 举报

5#
发表于 2024-10-16 16:42:54 | 只看该作者
谢谢分享
回复

使用道具 举报

6#
发表于 2024-10-16 16:42:57 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

7#
发表于 2024-10-16 16:45:45 | 只看该作者

谢谢楼主分
回复

使用道具 举报

8#
发表于 2024-10-16 16:52:50 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
发表于 2024-10-16 16:54:33 | 只看该作者
本人直接注销123

点评

还在用,小文件还可以  发表于 2024-10-17 09:26
回复

使用道具 举报

10#
发表于 2024-10-16 16:55:44 | 只看该作者
1G破解了吗
回复

使用道具 举报

11#
发表于 2024-10-16 17:05:25 | 只看该作者

谢谢分享
回复

使用道具 举报

12#
发表于 2024-10-16 17:11:36 | 只看该作者

谢谢分享!
回复

使用道具 举报

13#
发表于 2024-10-16 17:14:18 | 只看该作者
辛苦
回复

使用道具 举报

14#
发表于 2024-10-16 17:15:27 | 只看该作者
估计用不久
回复

使用道具 举报

15#
发表于 2024-10-16 17:19:14 | 只看该作者
支持了
回复

使用道具 举报

16#
发表于 2024-10-16 17:19:54 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

17#
发表于 2024-10-16 17:21:57 | 只看该作者
谢谢分享
回复

使用道具 举报

18#
发表于 2024-10-16 17:39:10 | 只看该作者
谢谢分享
回复

使用道具 举报

19#
发表于 2024-10-16 17:42:55 | 只看该作者
谢谢分享
回复

使用道具 举报

20#
发表于 2024-10-16 18:30:21 | 只看该作者
謝謝大大分享~感恩 ^^ 有您真好~!辛苦了!
回复

使用道具 举报

21#
发表于 2024-10-16 18:33:27 | 只看该作者
关键度盘插件有么
回复

使用道具 举报

22#
发表于 2024-10-16 19:32:54 | 只看该作者
感谢楼主热心分享,辛苦了
回复

使用道具 举报

23#
发表于 2024-10-16 19:40:25 | 只看该作者
123盘已经起诉多个破解软件发布者,索取不同的赔偿
回复

使用道具 举报

24#
发表于 2024-10-16 19:41:25 | 只看该作者
谢谢分享!
回复

使用道具 举报

25#
发表于 2024-10-16 19:50:33 | 只看该作者
谢谢分享
回复

使用道具 举报

26#
发表于 2024-10-16 20:02:30 | 只看该作者
还是提示已超出1G上限,没用

点评

直接下载文件夹无效,试试直接下载文件,我刚刚还是可以用的  详情 回复 发表于 2024-10-17 09:06
登陆123盘账户  详情 回复 发表于 2024-10-16 20:50
回复

使用道具 举报

27#
发表于 2024-10-16 20:14:18 来自手机 | 只看该作者
没意思 忽悠人的

点评

键盘侠不会玩。就别为难自己了  详情 回复 发表于 2024-10-16 20:49
回复

使用道具 举报

28#
 楼主| 发表于 2024-10-16 20:49:02 | 只看该作者
#在这里快速回复#。还有就是要登陆123盘账户。否则还是会提示购买 不知的他啥时修复,目前2024年10月16日20:45:57还可以用
回复

使用道具 举报

29#
 楼主| 发表于 2024-10-16 20:49:44 | 只看该作者

键盘侠不会玩。就别为难自己了

点评

我在登陆新动态使用的,我是用过了不能用才说的,你啥意思。还有色狼,现在很少见你发表妹了,感觉有点冷清不习惯啊,快回来秀表妹,无忧须要你  详情 回复 发表于 2024-10-17 19:44
回复

使用道具 举报

30#
 楼主| 发表于 2024-10-16 20:50:15 | 只看该作者
cly6 发表于 2024-10-16 20:02
还是提示已超出1G上限,没用

登陆123盘账户

点评

感谢提醒,确定是已经登录了,谷歌浏览器,还是不行。算了,不整了  详情 回复 发表于 2024-10-16 21:02
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-10-23 04:00

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表