Greasy Fork

Greasy Fork is available in English.

迅雷云盘获取直链

获取迅雷云盘的直接下载链接,生成txt文件,可利用其他工具下载(如idman)

目前为 2021-08-24 提交的版本,查看 最新版本

// ==UserScript==
// @name         迅雷云盘获取直链
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  获取迅雷云盘的直接下载链接,生成txt文件,可利用其他工具下载(如idman)
// @author       bleu
// @icon         https://img-vip-ssl.a.88cdn.com/img/xunleiadmin/5fb4b23888a05.png
// @supportURL   http://greasyfork.icu/zh-CN/scripts/431256/feedback
// @match        https://pan.xunlei.com/*
// @grant        none
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js
// ==/UserScript==
(function () {
    'use strict';
    const originFetch = fetch;
    var reqHeaders, filesURL;
    Object.defineProperty(window, "fetch", {
        configurable: true,
        enumerable: true,
        // writable: true,
        get() {
            return (url, options) => {
                if (url.indexOf('https://api-pan.xunlei.com/drive/v1/files?limit') === 0) {
                    filesURL = url;
                    reqHeaders = options.headers;
                    //console.log(reqHeaders)
                }
                return originFetch(url, options)
            }
        }
    })
    var arryIndex;
    var fileArry;
    var filetxt;
    var running = {
        'runStatus': false,
        'successNum': 0,
        'failNum': 0,
        'exit': false
    }
    var main = {
        addButton() {
            let $BleuButton = $('<div id="bleu_btn" class="pan-list-menu-item pan-list-menu-item__active"><span>获取直链</span></div>');
            $('div.pan-list-menu').prepend($BleuButton);
            $BleuButton.on('click', async function () {
                if (running.runStatus) {
                    alert('正在生成文件中,稍后再试');
                    return
                }
                arryIndex = 0;
                fileArry = [];
                filetxt = [];
                running.runStatus = true;
                running.successNum = 0;
                running.failNum = 0;
                await main.getFileSign();
                if (running.exit) {
                    alert('请刷新页面重新尝试!');
                    return false;
                }
                $('li.pan-list-item').each((index, item) => {
                    if (item.getAttribute('class') === 'pan-list-item') {
                        delete(fileArry[0][index]);
                    }
                });
                await main.getAllFiles(fileArry[0]);
                if (running.successNum + running.failNum != 0) {
                    alert(`获取链接:成功${running.successNum}条;失败${running.failNum}条`)
                    main.downloadFile();
                }
                running.runStatus = false;
            })
        },

        async getAllFiles(loopArry) {
            for (let index = 0; index < loopArry.length; index++) {
                if (loopArry[index]) {
                    if (loopArry[index].kind === 'drive#file') {
                        await main.getDirectLink(loopArry[index].id);
                    }
                    if (loopArry[index].kind === 'drive#folder') {
                        await main.getFileSign(loopArry[index]);
                        await main.getAllFiles(fileArry[arryIndex - 1]);
                    }
                }

            }
        },

        getFileSign(folder) {
            return new Promise((resolve, reject) => {
                let runURL;
                if (folder) {
                    runURL = `https://api-pan.xunlei.com/drive/v1/files?limit=100&parent_id=${folder.id}&filters={"phase":{"eq":"${folder.phase}"},"trashed":{"eq":${folder.trashed}}}&with_audit=true`;
                    runURL = encodeURI(runURL);
                } else {
                    runURL = filesURL;
                }
                fileArry[arryIndex] = [];
                $.ajax({
                    type: "get",
                    timeout: 10000, // 超时时间 10 秒
                    headers: reqHeaders,
                    url: runURL,
                    dataType: "json",
                    success: function (data, textStatus) {
                        data.files.forEach((item) => {
                            let temp = {
                                'kind': item.kind,
                                'id': item.id,
                                'phase': item.phase,
                                'trashed': item.trashed
                            };
                            fileArry[arryIndex].push(temp);
                        });
                        arryIndex++;
                        resolve(textStatus);
                    },
                    error: function (err) {
                        runURL === filesURL ? running.exit = true : running.exit = false;
                        reject(err);
                    }
                });
            });
        },

        getDirectLink(sign) {
            return new Promise((resolve, reject) => {
                $.ajax({
                    type: "get",
                    timeout: 10000, // 超时时间 10 秒
                    headers: reqHeaders,
                    url: `https://api-pan.xunlei.com/drive/v1/files/${sign}`,
                    dataType: "json",
                    success: function (data, textStatus) {
                        running.successNum++;
                        let temp = {
                            'name': data.name,
                            'link': data.web_content_link
                        };
                        filetxt.push(temp);
                        resolve(textStatus);
                    },
                    error: function (err) {
                        running.failNum++;
                        reject(err);
                    }
                });
            });

        },

        _downFlie(fnmae, data) {
            var elementA = document.createElement('a');
            elementA.download = fnmae;
            elementA.style.display = 'none';
            var blob = new Blob([data]);
            elementA.href = URL.createObjectURL(blob);
            document.body.appendChild(elementA);
            elementA.click();
            document.body.removeChild(elementA);
        },

        downloadFile() {
            let idmDown = '';
            let nameLink = '';
            let path = 'D:\test';
            filetxt.forEach((item) => {
                idmDown += `idman /d "${item.link}" /f ${item.name.replace(' ','_')} /a&`;
                nameLink += `${item.name}\n${item.link}\n`;
            });
            this._downFlie(`idm下载${(new Date()).valueOf()}.txt`, idmDown);
            this._downFlie(`迅雷直链${(new Date()).valueOf()}.txt`, nameLink);
        },
        initUI() {
            let counter = 20;
            let listener = setInterval(function () {
                counter--;
                if (document.querySelector('.pan-list-item')) {
                    clearInterval(listener);
                    main.addButton();
                }
                counter === 0 && clearInterval(listener);
            }, 200);
        },
    }
    main.initUI();
})();