🔥【百度网盘加速】33Down 网盘解析 🔥

破除网盘限速,成就你的体验,无视任何黑号,加速你的下载!灵感来源于KDown,经作者同意,发布本脚本给各位网友体验!

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         🔥【百度网盘加速】33Down 网盘解析 🔥
// @namespace    https://www.33down.top
// @description  破除网盘限速,成就你的体验,无视任何黑号,加速你的下载!灵感来源于KDown,经作者同意,发布本脚本给各位网友体验!
// @version 1.0.0
// @author
// @license      MIT
// @icon https://cdn-static.33down.top/assets/logo.png
// @resource https://cdn.staticfile.org/limonte-sweetalert2/11.7.1/sweetalert2.min.css
// @require https://cdn.staticfile.org/limonte-sweetalert2/11.7.1/sweetalert2.all.min.js
// @require https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_setClipboard
// @grant        GM_getValue
// @grant        GM_setValue
// @match        *://pan.baidu.com/*
// @match        *://yun.baidu.com/*
// @match        *://pan.baidu.com/disk/home*
// @match        *://yun.baidu.com/disk/home*
// @match        *://pan.baidu.com/disk/main*
// @match        *://yun.baidu.com/disk/main*
// @match        *://pan.baidu.com/s/*
// @match        *://yun.baidu.com/s/*
// @match        *://pan.baidu.com/share/*
// @match        *://yun.baidu.com/share/*
// @connect      33down.top
// @connect      staticfile.org
// @connect      baidu.com
// @connect      127.0.0.1
// @connect      localhost
// ==/UserScript==

(() => {
    // 在页面加载时立即调用GetNotify函数
    GetNotify();

    if (window.location.pathname === "/disk/home") {
        window.location.replace("./main");
    }

    AddElement();

    function GetNotify() {
        GM_xmlhttpRequest({
            method: "GET",
            url: "https://api.33down.top/api/isok",
            onload: function(response) {
                try {
                    const jsondata = JSON.parse(response.responseText);
                    const { code, message, open, gg } = jsondata;

                    // 确保公告是打开状态
                    if (open === 1 && code === 200) {
                        Swal.fire({
                            icon: "info",
                            title: gg, // 使用公告标题
                            text: message, // 使用公告信息
                            confirmButtonText: "关闭",
                        });
                    }
                } catch (e) {
                    console.error("Error fetching announcement:", e);
                }
            },
        });
    }

    function AddElement() {
        if (document.getElementById("33Down") === null) {
            const toolbar = document.querySelector("div.wp-s-agile-tool-bar__header");
            if (toolbar) {
                const newButton = document.createElement("button");
                newButton.id = "33Down";
                newButton.className = "u-button nd-file-list-toolbar-action-item u-button--primary";
                newButton.style.marginRight = "8px";
                newButton.innerText = "33Down";
                toolbar.prepend(newButton);

                const statusButton = document.createElement("button");
                statusButton.id = "33DownStatus";
                statusButton.className = "u-button nd-file-list-toolbar-action-item u-button--primary";
                statusButton.style.marginRight = "8px";
                statusButton.innerText = "33Down Status";
                toolbar.prepend(statusButton);

                const settingsButton = document.createElement("button");
                settingsButton.id = "aria2SettingsButton";
                settingsButton.className = "u-button nd-file-list-toolbar-action-item u-button--primary";
                settingsButton.style.marginRight = "8px";
                settingsButton.innerText = "Aria2 设置";
                settingsButton.onclick = openAria2Settings;
                toolbar.prepend(settingsButton);

                newButton.addEventListener("click", handleDownClick);
                statusButton.addEventListener("click", handleDownStatusClick);
            } else {
                setTimeout(AddElement, 100);
            }
        } else {
            console.log("33Down button already added.");
        }
    }

    async function handleDownClick() {
        let selectedElements = document.querySelectorAll(".wp-s-pan-table__body-row.mouse-choose-item.selected, .wp-s-file-grid-list__item.text-center.cursor-p.mouse-choose-item.is-checked, .wp-s-file-contain-list__item.text-center.cursor-p.mouse-choose-item.is-checked");
        let selectedIds = Array.from(selectedElements).map(item => item.getAttribute("data-id"));

        if (selectedIds.length === 0) {
            Swal.fire({
                showConfirmButton: true,
                title: '系统提示',
                text: '请选择需要下载的文件',
                icon: 'error'
            });
            return;
        }

        if (selectedIds.length > 1) {
            Swal.fire({
                showConfirmButton: true,
                title: '系统提示',
                text: '暂时只能下载一个文件',
                icon: 'error'
            });
            return;
        }

        const { value: password } = await Swal.fire({
            title: '输入密码',
            input: 'password',
            inputLabel: '新版体验,免任何密码,输入:33Down即可',
            inputPlaceholder: '新版体验!免密码!输入:33Down即可',
            inputAttributes: {
                maxlength: 30,
                autocapitalize: 'off',
                autocorrect: 'off'
            }
        });

        if (!password) {
            Swal.fire("提示", "需要密码来继续", "info");
            return;
        }

        Swal.fire({
            title: "正在获取下载链接...",
            onBeforeOpen: () => {
                Swal.showLoading();
            }
        });

        const bdstoken = await getBdsToken();
        if (!bdstoken) {
            Swal.fire("错误", "无法获取bdstoken", "error");
            return;
        }

        const bdpassword = "zzzz";
        const shareResponse = await shareFiles(bdstoken, selectedIds, bdpassword);
        const apiResponse = await getDownloadLinkFromApi(shareResponse.link, password);

        if (apiResponse && apiResponse.error && Object.keys(apiResponse).length === 1) {
            Swal.update({
                icon: 'error',
                title: '错误',
                text: apiResponse.error
            });
        } else if (apiResponse && apiResponse.dlink && apiResponse.server_filename) {
            const dlink = apiResponse.dlink;

            Swal.fire({
                icon: 'success',
                title: '下载链接获取成功',
                html: `
                    文件名: ${apiResponse.server_filename}<br>
                    链接: <input type="text" id="downloadLink" value="${dlink}" style="width: 100%;" readonly><br>
                    用户代理(UA): <textarea id="userAgent" readonly style="width: 100%; height: 60px; resize: none;">33Down;Links;33down.top</textarea>
                    <button id="copyButton" class="swal2-confirm swal2-styled">复制链接</button>
                    <button id="sendToAria2Button" class="swal2-confirm swal2-styled" style="margin-top: 10px;">发送到 Aria2</button>
                `,
                didOpen: () => {
                    const copyButton = document.getElementById("copyButton");
                    copyButton.addEventListener("click", async () => {
                        const downloadLinkInput = document.getElementById("downloadLink");
                        try {
                            await navigator.clipboard.writeText(downloadLinkInput.value);
                            Swal.fire("已复制", "下载链接已复制到剪贴板", "success");
                        } catch (err) {
                            console.error("Failed to copy: ", err);
                            Swal.fire("复制失败", "无法将链接复制到剪贴板", "error");
                        }
                    });

                    const sendToAria2Button = document.getElementById("sendToAria2Button");
                    sendToAria2Button.addEventListener("click", () => {
                        const downloadLink = document.getElementById("downloadLink").value;
                        sendToAria2(downloadLink, apiResponse.server_filename);
                    });
                },
                preConfirm: () => {
                    return { dlink: apiResponse.dlink };
                }
            });
        }
    }

    function handleDownStatusClick() {
        Swal.fire("检查中...", "正在检查服务器状态,请稍候...", "info");

        GM_xmlhttpRequest({
            method: "GET",
            url: "https://api.33down.top/api/status",
            onload: function(response) {
                try {
                    const data = JSON.parse(response.responseText);
                    const { code, message } = data;
                    if (code === 200) {
                        Swal.fire({
                            icon: "success",
                            title: "服务器状态",
                            text: message,
                        });
                    } else if (code === 201) {
                        Swal.fire({
                            icon: "error",
                            title: "服务器状态",
                            text: message,
                        });
                    } else {
                        Swal.fire({
                            icon: "warning",
                            title: "服务器状态",
                            text: "未知状态",
                        });
                    }
                } catch (error) {
                    Swal.fire("错误", "无法获取服务器状态", "error");
                }
            },
            onerror: function() {
                Swal.fire("错误", "无法连接到服务器", "error");
            },
        });
    }

    function openAria2Settings() {
        const aria2RpcUrl = GM_getValue('aria2RpcUrl', 'http://localhost:6800/jsonrpc');
        const aria2Token = GM_getValue('aria2Token', '');

        Swal.fire({
            title: '配置 Aria2 设置',
            html: `
                <input type="text" id="aria2RpcUrl" value="${aria2RpcUrl}" class="swal2-input" placeholder="输入 Aria2 RPC URL">
                <input type="text" id="aria2Token" value="${aria2Token}" class="swal2-input" placeholder="输入 Aria2 Token">
            `,
            focusConfirm: false,
            showCancelButton: true,
            confirmButtonText: '保存',
            cancelButtonText: '取消',
            preConfirm: () => {
                const rpcUrl = document.getElementById('aria2RpcUrl').value;
                const token = document.getElementById('aria2Token').value;
                GM_setValue('aria2RpcUrl', rpcUrl);
                GM_setValue('aria2Token', token);
            }
        }).then((result) => {
            if (result.isConfirmed) {
                Swal.fire('设置已保存', '', 'success');
            }
        });
    }

    function sendToAria2(downloadLink, filename) {
        const aria2RpcUrl = GM_getValue('aria2RpcUrl', 'http://localhost:6800/jsonrpc');
        const aria2Token = GM_getValue('aria2Token', '');

        const requestPayload = {
            jsonrpc: '2.0',
            method: 'aria2.addUri',
            id: new Date().getTime(),
            params: [
                [`${downloadLink}`],
                {
                    'out': filename,
                    'header': ['User-Agent: 33Down;Links;33down.top'],
                }
            ]
        };

        if (aria2Token) {
            requestPayload.params.unshift(`token:${aria2Token}`);
        }

        GM_xmlhttpRequest({
            method: "POST",
            url: aria2RpcUrl,
            data: JSON.stringify(requestPayload),
            headers: {
                'Content-Type': 'application/json',
            },
            onload: function(response) {
                const data = JSON.parse(response.responseText);
                if (data && data.result) {
                    Swal.fire('已发送', '下载链接已成功发送到 Aria2', 'success');
                } else {
                    Swal.fire('发送失败', '无法将下载链接发送到 Aria2', 'error');
                }
            },
            onerror: function() {
                Swal.fire('发送失败', '无法连接到 Aria2 服务器', 'error');
            }
        });
    }

    async function getBdsToken() {
        var htmlString = $("html").html();
        var regex = /"bdstoken":"(\w+)"/;
        var match = regex.exec(htmlString);
        return match ? match[1] : null;
    }

    async function shareFiles(bdstoken, selectedIds, bdpassword) {
        return $.post("https://pan.baidu.com/share/set?channel=chunlei&bdstoken=" + bdstoken, {
            period: 1,
            pwd: bdpassword,
            eflag_disable: true,
            channel_list: "[]",
            schannel: 4,
            fid_list: JSON.stringify(selectedIds)
        }).then(response => response);
    }

function getDownloadLinkFromApi(link, password) {
    // 清理密码以移除非字母数字字符
    const cleanedPassword = password.replace(/[^a-zA-Z0-9_]/g, '');

    // 创建请求数据
    const requestData = {
        url: link,
        dir: '/',
        password: cleanedPassword
    };

    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: "POST",
            url: "https://api.33down.top/api/download_post",
            data: JSON.stringify(requestData),
            headers: {
                'Content-Type': 'application/json'
            },
            onload: function(response) {
                if (response.status >= 200 && response.status < 300) {
                    const data = JSON.parse(response.responseText);
                    resolve(data);
                } else {
                    reject({
                        status: response.status,
                        statusText: response.statusText
                    });
                }
            },
            onerror: function(response) {
                reject({
                    status: response.status,
                    statusText: "Network error"
                });
            }
        });
    });
}



})();