// ==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();
})();