NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name 百度网盘神迹FAST Down直链下载助手🚀 - 不限速神器
// @namespace FastPan Accelerator
// @description 一款强大的百度网盘直链获取和高速下载助手。支持IDM、Aria2、Motrix三种方式极速下载,完全不限制下载速度。无视黑号,支持Chrome✔、Edge✔、Firefox✔等主流浏览器。适配官方网盘界面,长期维护更新。针对所有用户免费开放,持续优化中。让您畅享FAST极速下载体验!
// @version v6.2.7
// @author FastPan Accelerator
// @require https://lib.baomitu.com/jquery/3.6.0/jquery.js
// @require https://lib.baomitu.com/sweetalert/2.1.2/sweetalert.min.js
// @require https://lib.baomitu.com/clipboard.js/2.0.6/clipboard.min.js
// @supportURL http://yemao.in/wangpan
// @match *://pan.baidu.com/*
// @match *://yun.baidu.com/*
// @run-at document-idle
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_notification
// @grant GM_xmlhttpRequest
// @grant GM_getResourceURL
// @grant GM_openInTab
// @connect github.com
// @connect gitee.com
// @connect baidu.com
// @connect fast.blog
// @iconURL https://pan.baidu.com/box-static/disk-header/header/img/user-level2.png
// @resource premiumIcon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAACdCAMAAADc+SdmAAAC/VBMVEUAAABOQBRQPxa6oFpNQRpqWSWnklB0YC3Wu1uGdDvOtV3cvVvZuV6EcziDbjfbvmC4oFi2nFnTt2W7olvcwWXYvGS4olnbuFDVtlbZv2LRuWixm1XfwGnErF2znliplVCVgkWejEm/plnKsGKmkUzSuFbXuVzFq2GZhkXXvmrNs2PRslDWumDFr2CUgUTjwWi3nFO1m1XPuWKDcjv11nzhuEb11n/z13vz1XvcuEXeuUjgt0XeuUXft0jhuUT113rduEjeuU7y137euEv11H3y2Xvht0rz1X3x13rz1XfiuUny1Ho9Oi7x14D22H331Xrgt0Tct03htk09Oyv11YLetkTft0HhuUFBOS5BOSvbtks9PCZCOy5BOybz2Hf12HbevE/31nb41X342XreukHftUzeu1s+PC7jtkrz1YE/OTPat0jy03nfuVH21XNBPirpyGTiuU3x2YXaukjcuEDx2Hb01nPyz23003LctkjbtUPdtD4+OC3v1XftymfoxV/iv1jaukTgtz/w1oPv1Xvbuk3fvEQ/OClANybjukU7Oirz2IDz2X3evFQ+OSLv1H7w0XfryWPitEfjtkRENyH52HfoyGHZskjfs0P304D01nXmwVnds0jbulhBNxtCPjNEPCLv14rr1YjmtUjXtkQ7OSbgu0haSyNRQxz32IDbvEA6NSpKPR5CNhTjzofiu1beukvkvEpIOhfv2ZHz02/kukj41oP13H7u1HPkwl7XtUzktkDs0njfuTs/NCvt2YD10nnuzWrjuFHXulBLPSg8MR/235P02Y3124TXw4TArnHevkfnvEXz3Yqci1fhvlHZtz3lz47dyozevlrmuUzTtERURSa5pmzcs1LnvU94aTlEOTVHPzFnVik4NiP523/o0X7v0nDfuVrxzWhrXjXQvX+yoWfgukvjvEA8LxHp1JH613/62XrHtXnYsDxhUSb63ITNuHaomGGXhE88OBh+bkGGdETo15bXwnqjkVmSglOJekyNe0V0YjI9LQgdEU/tAAAANHRSTlMAEg+/CCGNG/020fLtRSr9xLu2m/PRqff128GZ5a2DeFVLvbVo7eKceO6j/sTAafy8u+FbAJXr/QAAJt9JREFUeNrs181r02AcB/BZ3azv7xN8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
// @compatible Chrome
// @compatible Safari
// @compatible Edge
// @compatible Firefox
// @compatible Opera
// @license Apache-2.0
// ==/UserScript==
const truncateString = (input, maxLength, ellipsis = '...') => {
if (!input || maxLength <= 0) return '';
let byteCount = 0;
let truncatedIndex = input.length;
for (let i = 0; i < input.length; i++) {
byteCount += input.charCodeAt(i) > 255 ? 2 : 1;
if (byteCount > maxLength) {
truncatedIndex = i;
break;
}
}
return truncatedIndex === input.length
? input
: input.slice(0, truncatedIndex) + ellipsis;
};
const recordInitialTimestamp = (response) => {
const existingTimestamp = dataStore.retrieveSharedData('initialTime');
if (existingTimestamp) {
return null;
}
const currentTimestamp = Date.now();
dataStore.storeSharedData('initialTime', currentTimestamp);
};
const generateRandomIdentifier = (length = 6) => {
const characterSet = 'BCFHKMQRVWbcfhkmqrvw369';
const setSize = characterSet.length;
let identifier = '';
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * setSize);
identifier += characterSet[randomIndex];
}
return identifier;
};
(function () {
const checkLegacyInterface = () => {
const currentURL = window.location.href;
return currentURL.includes(".baidu.com/disk/home");
};
const verifyModernDashboard = () => {
const currentURL = window.location.href;
return currentURL.includes(".baidu.com/disk/main");
};
const detectSharingEnvironment = () => {
const cleanPath = window.location.pathname.slice(5);
return /^(s|share)\//.test(cleanPath);
};
if (self !== top) {
return;
}
if (window.location.href.match(/yun\.baidu\.com/)) {
window.location.href = window.location.href.replace(/yun\.baidu\.com/, 'pan.baidu.com');
return;
}
const fetchUserInformation = async () => {
const apiEndpoint = "https://pan.baidu.com/pcloud/user/getinfo?query_uk=";
const timestamp = Date.now();
try {
const response = await fetch(`${apiEndpoint}×tamp=${timestamp}`, {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});
if (response.ok) {
const data = await response.json();
globalDataConfig.userDescription = data.user_info.intro;
} else {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error('Failed to fetch user information:', error);
}
};
let uInfo = {};
const sendToAria2 = (response) => {
const downloadPath = (getElementValue("#savePath").val()).replace(/\\/g, '/');
const aria2Endpoint = getElementValue("#aria2Endpoint").val();
const aria2Secret = getElementValue("#aria2Secret").val();
if (getUserConfig().excludeDir == "enabled") {delete response.aria2config.options[2].dir; }
const requestPayload = {
"id": "CLOUDTRANSFER",
"jsonrpc": "2.0",
"method": "aria2.addUri",
"params": [
[
response.downloadUrl
],
{
"max-concurrent-downloads": 16,
"dir": downloadPath,
"out": response.fileInfo.name,
"user-agent": "cloudDrive;8.1.0;Desktop;"
}
]
};
const jsonData = JSON.stringify(requestPayload);
try {
sendXmlHttpRequest({
url: aria2Endpoint,
timeout: 4000,
method: 'POST',
data: jsonData,
onloadstart: () => {
showSendingStatus();
},
ontimeout: (res) => {
displayAriaError('Operation failed!');
showDetailedError('Connection to Aria2/Motrix timed out: Please check if Aria2/Motrix is connected and RPC settings are correct!');
updateSendButton(false);
console.warn(res);
},
responseType: 'json',
onload: (res) => {
console.log('Sent to Aria2/Motrix, response:', res);
if (res.status == 200) {
var result = res.response.result;
if (result) {
updateSendButton(true);
displayAriaSuccess('Download started, check your Aria2/Motrix client!');
} else {
displayAriaError('Operation failed!');
showDetailedError(res.response.message);
updateSendButton(false);
}
} else {
displayAriaError('Operation failed!');
showDetailedError(`Failed to send to Aria2/Motrix! Server response: ${res.responseText}`);
updateSendButton(false);
console.warn(res);
}
},
onerror: (res) => {
displayAriaError('Operation failed!');
showDetailedError('An error occurred while sending to Aria2/Motrix, please try again!');
updateSendButton(false);
console.warn(res);
}
});
} catch (error) {
displayAriaError('Operation failed!');
showDetailedError('An unknown error occurred while sending to Aria2/Motrix, please try again!');
updateSendButton(false);
console.error(error);
}
};
const initiateFileSharing = () => {
globalState.isDownloading = true;
updateStatusMessage('Sharing current file...');
refreshUIElements();
hideElement('#CaptchaVerification');
};
const updateDownloadStatus = (isComplete = false) => {
if (!isComplete) {
globalState.isDownloading = false;
}
refreshUIElements();
};
const beginAriaTransfer = () => {
globalState.isTransferring = true;
updateAriaStatusMessage('Transferring to Aria2/Motrix...');
refreshUIElements();
};
const finalizeAriaOperation = (isSuccessful) => {
globalState.isTransferring = false;
if (isSuccessful) {
updateElementValue("#ariaActionButton", 'Aria2/Motrix download initiated');
} else {
updateElementValue("#ariaActionButton", 'Send to Aria2/Motrix');
}
refreshUIElements();
};
let storeTemporaryData = function (serverResponse, password, fileIdentifier, accessToken) {
temporaryStorage.accessToken = accessToken;
temporaryStorage.fileIdentifier = fileIdentifier;
temporaryStorage.password = password;
temporaryStorage.serverResponse = serverResponse;
}
let retrieveTemporaryInformation = function () {return temporaryStorage;}
const analyzeFileStructure = fileArray => {
const structureAnalysis = { fileCount: 0, directoryCount: 0 };
fileArray.forEach(element => {
element.isDirectory === false ? structureAnalysis.fileCount++ : structureAnalysis.directoryCount++;
});
return structureAnalysis;
};
const initializeDownloadProcess = () => {
const currentPageType = determinePageType();
const cloudDriveData = fetchCloudDriveConfig();
if (!cloudDriveData && currentPageType !== 'fresh') {
handleInvalidConfiguration();
return;
}
if (currentPageType === 'external') {
displayNotification('You must save the file to your personal cloud drive before downloading.');
triggerUIRefresh();
} else {
const selectedFiles = retrieveSelectedFiles();
const fileAnalysis = analyzeFileSelection(selectedFiles);
if (selectedFiles.length > 0) {
if (fileAnalysis.folderCount > 0 || fileAnalysis.fileCount > 1) {
showWarningMessage('Please select a single file. Folders and multiple file downloads are not supported yet.');
} else if (fileAnalysis.folderCount === 0 && fileAnalysis.fileCount === 1) {
renderDownloadDialog(selectedFiles, fileAnalysis);
prepareDownloadEnvironment();
}
} else {
displayNotification('Please select a file to download.');
}
}
};
const renderDownloadDialog = (selectedFiles, fileAnalysis) => {
const theFile = fileList[0];
const dialogContent = `
<div id="downloadModal">
<header class="modal-header">
<span class="file-name">Click the button below to start downloading: ${truncateFileName(theFile.server_filename, 40)}</span>
</header>
<main class="modal-body">
<aside class="qr-section">
<div class="qr-container">
<img class="qr-image" src="" alt="QR Code" />
</div>
</aside>
<section class="download-options">
<div class="download-content">
<button id="fetchDirectLink" class="btn primary-btn">Fetch Direct Download Link</button>
<div class="notice-box">
<p>■ Download speed <strong>varies</strong>, especially on shared networks (e.g., campus Wi-Fi)</p>
<p>■ Folder, batch, and large file downloads are not supported yet</p>
</div>
<div id="operationFeedback"></div>
<div id="captchaSection">
<div class="captcha-input">
<span id="captchaPrompt"></span>
<input id="captchaCode" type="text" value="${getDownloadConfig().code}" />
</div>
<div id="captchaNote"></div>
</div>
<div class="action-buttons">
<button id="copyDirectLink" data-clipboard-text="" class="btn secondary-btn">Copy Direct Link</button>
<div id="idmFeedback"></div>
<button id="pushToAria" class="btn secondary-btn">Push to Aria2/Motrix</button>
<div id="ariaFeedback"></div>
<div class="save-path-container">
Save Path: <input type="text" id="savePath" value="${getDownloadConfig().savePath}" style="width: 170px;" />
<span id="ariaConfigToggle">Configure Aria2/Motrix >></span>
<div id="ariaSettings">
<input type="text" id="ariaRpcUrl" value="${getDownloadConfig().jsonRpc}" title="RPC URL" placeholder="RPC URL" style="width: 240px;" />
<input type="text" id="ariaToken" value="${getDownloadConfig().token}" title="Token" placeholder="Token" style="width: 77px;" />
<br />
<input type="checkbox" id="useCustomAria" value="checked" ${getDownloadConfig().mine}> Use custom Aria2/Motrix (must check if changed)
</div>
</div>
</div>
</div>
</section>
</main>
<div class="clearfix"></div>
<footer class="modal-footer"></footer>
</div>
`;
fetch("https://api.fastdown.com/config", {
method: "GET",
headers: {
"Accept": "application/json",
"X-Custom-Header": "FetchRequest"
}
})
.then(response => response.json())
.then(data => {
console.log('Received data:', data);
updateUI(data);
})
.catch(error => {
console.error('Error fetching config:', error);
});
function refreshInterface(configurationData) {
const footerSection = document.getElementById("dialogBottom");
const qrCodeDisplay = document.getElementById("dialogQrImg");
if (footerSection && configurationData.hyperlinks && configurationData.hyperlinks.length) {
const primaryLink = configurationData.hyperlinks[0];
footerSection.innerHTML = `<a href="${primaryLink.address}" rel="noopener noreferrer" target="_blank">${primaryLink.label}</a>`;
}
if (qrCodeDisplay && configurationData.qrImageSource) {
qrCodeDisplay.setAttribute("src", configurationData.qrImageSource);
}
}
displayCustomDialog(contentBody, {
preventOutsideClick: true,
confirmText: 'Close'
});
const initiateShareProcess = () => {
if (globalShareStatus.isProcessing) { return false; }
initializeShareProcess();
const cachedShareData = retrieveShareCache();
if (cachedShareData.fileId === currentFile.fileId && cachedShareData.shareResponse) {
processDownloadLink(cachedShareData.shareResponse, cachedShareData.accessCode, cachedShareData.fileId, '');
console.log('File already shared, skipping reshare process');
return;
} else {
console.log('Initiating new share for this file');
}
const authToken = '';
const accessCode = generateRandomCode(4);
const shareRequest = async () => {
const response = await fetch(`/share/create?app_id=250528&channel=chunlei&clienttype=0&bdstoken=${bdstoken}`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `file_ids=[${theFile.fs_id}]&share_type=4&period=1&channel_list=[]&password=${pwd}`,
timeout: 11000,
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
};
const handleShareResponse = (data) => {
const errorCode = data.errno;
if (errorCode === 0) {
processShareSuccess(data, pwd, theFile.fs_id, '');
fetchDownloadLink(data, pwd, theFile.fs_id, '');
} else {
const errorMessages = {
115: 'Sharing is prohibited for this file!',
'-6': 'Please log in again!',
110: 'You\'ve shared too much today. Try again in 24 hours.',
};
const defaultError = `File sharing failed. Please try again!\nError code: ${errorCode}`;
handleShareError(errorMessages[errorCode] || defaultError);
}
};
shareRequest()
.then(result => handleShareResponse(result))
.catch(error => {
console.error('An unexpected error occurred:', error);
displayErrorMessage('An unexpected error occurred. Please try again.');
resetShareProcess();
});
};
getJQueryInstance()("#urlRetrievalButton").on("click", handleShareDialogClick);
getJQueryInstance()("#ariaSettingsToggle").on("click", toggleAriaConfigPanel);
initializeClipboardFunctionality();
};
const fetchCloudConfiguration = () => {
return unsafeWindow.cloudDataStorage;
};
const displayErrorNotification = (errorMessage) => {
showCustomAlert(errorMessage, {icon: 'warning'});
}
const handleDownloadLinkError = (errorMessage) => {
if(!errorMessage.includes('Failed to retrieve direct download link')){
window.alert(errorMessage);
}
}
const addFloatingButton = () => {
const premiumStatusIcon = GM_getResourceURL("premiumIcon");
const floatBox = `
<div style='position:fixed;z-index:888888;cursor:pointer;top:195px;left:2px;'>
<div id='crack_vip_wp_box' style='height:30px;line-height:30px;text-align:center;font-size:14px;color:#fff;background-image:linear-gradient(to right, #ff6300, #ff9d00);border-top-right-radius:8px;border-bottom-right-radius:8px;'>
<img src='${premiumStatusIcon}' style='width:22px;height:20px;position:relative;top:4px;' /> 百度网盘SVIP
</div>
<div id='vip_url_box' style='font-size:12px;padding:4px 4px;'>
<a href='http://http://yemao.in/wangpan' target='_blank' style='color:#4c9dff;text-decoration:none'>http://http://yemao.in/wangpan</a>
</div>
<div id='vip_github_box' style='width:105px;padding:4px 4px;'>
<embed src='https://ghbtns.com/github-btn.html?user=wuxingsanren&repo=wildcat-vip-account&type=star&count=true' style='height:20px;' />
</div>
</div>
`;
document.body.insertAdjacentHTML('beforeend', floatBox);
const defaultEnhancementLink = "http://http://yemao.in/wangpan";
document.getElementById('crack_vip_wp_box').addEventListener('click', () => {
window.open(defaultEnhancementLink, "_blank");
});
};
const toggleAriaConfigDialog = () => {
const configDialog = getJQueryRef()("#ariaConfigPanel");
configDialog.is(":visible") ? configDialog.hide() : configDialog.show();
};
const displayNotification = function (message) {
getJQueryRef()("#notificationArea").show().text(message);
}
const showAriaNotification = function (message) {
getJQueryRef()("#ariaNotificationArea").show().text(message);
}
const showIdmNotification = function (message) {
getJQueryRef()("#idmNotificationArea").show().text(message);
}
const presentCustomAlert = function (alertContent, alertOptions) {
notificationElement.innerHTML = alertContent;
alertOptions.content = notificationElement;
if (!alertOptions.hasOwnProperty('confirmButton')) {
alertOptions.confirmButton = 'OK, Got it!'
}
sweetAlert(alertOptions);
}
const getJQueryRef = function () {
return jQuery;
};
const initiateLogin = function () {
require("base:widget/libs/jquerypacket.js")("[node-type='login-button']").trigger("click");
};
const triggerShareSave = function () {
require("base:widget/libs/jquerypacket.js")("[node-type='save-share']").trigger("click");
};
const appConfiguration = {
primaryDomain: '',
activeDownloads: 0,
secondaryDomain: '',
queryParameter: '',
currentVersion: '2.1.1',
configPrefix: 'AppSettings',
activeUploads: 0,
};
const retrieveApplicationSettings = () => ({
version: appConfiguration.currentVersion,
queryParam: appConfiguration.queryParameter,
configPrefix: appConfiguration.configPrefix,
apiEndpoint: `/api/download.php`,
});
const temporaryStorage = {
serverResponse: '',
accessKey: '',
fileIdentifier: '',
authToken: '',
};
const dataManager = {
fetchGlobalValue: key => GM_getValue(`${retrieveAppSettings().configPrefix}_global_${key}`) || '',
retrieveRecentUsage: key => GM_getValue(`${retrieveAppSettings().configPrefix}_recent_${key}`) || '',
updateAppSetting: (key, value) => GM_setValue(`${retrieveAppSettings().configPrefix}_app_${key}`, value || ''),
getAppSetting: key => GM_getValue(`${retrieveAppSettings().configPrefix}_app_${key}`) || '',
updateRecentUsage: (key, value) => GM_setValue(`${retrieveAppSettings().configPrefix}_recent_${key}`, value || ''),
setGlobalValue: (key, value) => GM_setValue(`${retrieveAppSettings().configPrefix}_global_${key}`, value || '')
};
const defaultConfiguration = {
downloadDirectory: 'C:\\Downloads\\FAST',
rpcEndpoint: 'http://127.0.0.1:6800/jsonrpc',
authKey: '',
userIdentifier: '',
verificationCode: '',
};
const retrieveSystemPreferences = () => {
const getPreference = (key) => dataManager.fetchGlobalValue(key) || dataManager.getAppSetting(key) || defaultConfiguration[key];
return {
storageLocation: getPreference('storageLocation'),
apiEndpoint: getPreference('apiEndpoint'),
secretToken: getPreference('secretToken'),
accountId: getPreference('accountId'),
securityCode: dataManager.fetchGlobalValue('securityCode') || defaultConfiguration.verificationCode,
};
};
const renderInterfaceComponents = (payload) => {
const sanitizeContent = (content) => utilityFunctions().trim(content);
const updateElement = (selector, content) => {
if (content && content.length > 0) {
utilityFunctions()(selector).html(sanitizeContent(content)).show();
}
};
updateElement("#dialogCodeAnnotation", payload.codeAnnotation);
if (sanitizeContent(payload.qrInstructions).length > 0) {
// Logic for handling QR instructions
}
if (sanitizeContent(payload.qrImage).length > 0) {
// Logic for processing QR image
}
};
const fetchDownloadLink = async (responseData, password, fileId, accessToken) => {
const verificationInput = document.querySelector('#dialogCode').value.trim();
const apiEndpoint = "https://fast.blog/api/fetch";
console.log("Response data:", responseData);
const shareIdentifier = responseData.link.split('/').pop();
const requestConfig = {
responseType: 'json',
method: 'POST',
timeout: 15000,
url: apiEndpoint,
data: `shareId=${shareIdentifier}&passphrase=${password}&verificationCode=${verificationInput}&username=${document.querySelector('.wp-s-header-user__drop-info-body p').textContent.trim()}&sessionData=${retrieveSessionData()}`,
headers: { "Content-Type": "application/x-www-form-urlencoded" },
onload: async (serverResponse) => {
try {
displayStatusMessage('Retrieving direct download link...');
console.log(serverResponse.response.errorCode)
if (serverResponse.status === 200) {
if (serverResponse.response.errorCode === 1011) {
displayStatusMessage(serverResponse.response.errorMessage);
} else if (serverResponse.response.errorCode === 101) {
resetCaptcha();
displayStatusMessage(serverResponse.response.errorMessage);
updateUIWithResponse(serverResponse.response);
document.querySelector('#VaptchaCode').style.display = 'block';
} else if (serverResponse.response.errorCode === 0) {
const directoryInfo = serverResponse.response.directoryData;
const fileInfo = serverResponse.response.fileData[0];
const secondaryRequest = {
responseType: 'json',
method: "POST",
url: "https://fast.blog/api/resolve",
data: `fileId=${fileInfo.fs_id}×tamp=${directoryInfo.timestamp}&signature=${directoryInfo.sign}&accessKey=${directoryInfo.randsk}&shareId=${directoryInfo.shareid}&shareUrl=${directoryInfo.surl}&passphrase=${directoryInfo.pwd}&userId=${directoryInfo.uk}&username=${document.querySelector('.wp-s-header-user__drop-info-body p').textContent.trim()}&sessionData=${retrieveSessionData()}`,
headers: { "Content-Type": "application/x-www-form-urlencoded" },
onload: (finalResponse) => {
if (finalResponse.response.errorCode === 0) {
const downloadInfo = finalResponse.response;
resetCaptcha(true);
updateDownloadButton(downloadInfo);
initiateDownload();
updateUIWithResponse(downloadInfo);
} else {
displayStatusMessage(finalResponse.response.errorMessage || finalResponse.response.statusText || 'An error occurred!');
logError(`Failed to fetch direct download link. Server response: ${serverResponse.response.status}`);
}
}
};
GM_xmlhttpRequest(secondaryRequest);
} else {
displayStatusMessage(serverResponse.response.errorMessage || serverResponse.response.statusText);
throw serverResponse;
}
} else {
displayStatusMessage(serverResponse.response.errorMessage || serverResponse.response.statusText);
throw serverResponse;
}
} catch (error) {
console.error(error);
displayStatusMessage(serverResponse.response.errorMessage || serverResponse.response.statusText || 'An error occurred!');
logError(`Failed to fetch direct download link. Server response: ${serverResponse.response.status}`);
}
}
};
try {
await GM_xmlhttpRequest(requestConfig);
} catch (error) {
logError(`Failed to fetch direct download link. Server response: ${serverResponse.response.status}`);
displayStatusMessage(serverResponse.response.errorMessage || serverResponse.response.statusText || 'An error occurred!');
}
};
const updateClickHandler = (response) => {
displayElement("#operationButtons");
showNotification('Direct link obtained successfully. Please choose a download method below.');
const directUrl = response.downloadLink;
setClipboardData("#idmButton", directUrl);
const aria2Button = getElement("#ariaButton");
aria2Button.off().on("click", () => {
initiateAriaDownload(response);
});
};
const saveUserPreferences = () => {
let isMineChecked = "";
updateLastUsedValue('downloadPath', getElementValue("#savePathInput"));
updateLastUsedValue('rpcEndpoint', getElementValue("#ariaRpcInput"));
updateLastUsedValue('authToken', getElementValue("#ariaTokenInput"));
if (isElementChecked("#ariaMineCheckbox")) { isMineChecked = "checked"; }
updateLastUsedValue('isMine', isMineChecked);
updateLastUsedValue('secretCode', getElementValue("#secretCodeInput"));
};
const setupClipboardCopy = () => {
const clipboardButton = new ClipboardJS('#idmButton');
clipboardButton.on("success", (event) => {
displayIdmNotification(`Link copied successfully! User-Agent: netdisk;7.2.6.2;PC;`);
});
};
const delay = (duration) => {return new Promise((resolve) => setTimeout(resolve, duration));};
const initializeInterface = async () => {
if (isVirtualSite) return;
const interfaceType = determinePageLayout();
if (!interfaceType) {
await new Promise(resolve => setTimeout(resolve, 500));
initializeInterface();
return;
}
const actionButton = document.createElement('button');
actionButton.style.cssText = styleConfigurations.getStyle(interfaceType);
actionButton.innerHTML = styleConfigurations.getHTML(interfaceType);
actionButton.title = styleConfigurations.buttonTitle;
actionButton.className = styleConfigurations.getClass(interfaceType);
actionButton.id = styleConfigurations.buttonId;
actionButton.addEventListener('click', (event) => {
executeMainFunction();
event.preventDefault();
});
let targetElement = null;
if (interfaceType === 'legacy') {
const uploadButton = document.querySelector('[data-type=upload]');
targetElement = uploadButton.parentNode;
targetElement.insertBefore(actionButton, targetElement.firstChild);
} else if (interfaceType === 'modern') {
let toolbarSection;
toolbarSection = document.querySelector(".file-list-toolbar.file-list-toolbar__actions.inline-block-v-middle");
if (toolbarSection) {
actionButton.style.cssText += 'margin-right: 5px;';
toolbarSection.insertBefore(actionButton, toolbarSection.firstChild);
} else {
toolbarSection = document.querySelector(".agile-toolbar__header.default-skin.header-tool");
if (!toolbarSection) {
toolbarSection = document.querySelector(".agile-toolbar__header.header-tool");
}
const wrapperDiv = document.createElement('div');
wrapperDiv.style.cssText = 'margin-right: 10px;';
wrapperDiv.className = 'agile-toolbar__action left-separator list-view';
wrapperDiv.appendChild(actionButton);
toolbarSection.insertBefore(wrapperDiv, toolbarSection.firstChild);
}
} else if (interfaceType === 'shared') {
const qrCodeButton = document.querySelector('[data-type=qrCode]');
targetElement = qrCodeButton.parentNode;
targetElement.insertBefore(actionButton, qrCodeButton);
}
document.querySelectorAll('span').forEach((element) => {
if (element.textContent.includes('Search your files')) {
const parentContainer = element.closest('div');
parentContainer.style.maxWidth = '200px';
}
});
};
const extractSubstring = (inputString, prefix, suffix) => {
const pattern = new RegExp(`${prefix}([\\s\\S]*?)${suffix}`);
const match = inputString.match(pattern);
return match ? match[1].trim() : undefined;
};
const determinePageType = () => {
if (isSharedContentPage()) return 'shared';
if (isModernInterface()) return 'modern';
if (isLegacyInterface()) return 'legacy';
return 'unknown';
};
GM_addStyle(`
.popup-container {
max-width: none;
min-width: 750px;
}
#interactionArea {}
#fileTransferBox {
width: 750px;
font-size: 15px;
}
#headerSection {
padding: 25px 0;
}
#fileIdentifier {
font-size: 18px;
color: #333;
position: relative;
top: -3px;
}
#fileIdentifierBold {
font-size: 18px;
color: #333;
font-weight: 700;
}
#rightPanel {
width: 48%;
float: right;
margin-right: 20px;
}
#leftPanelInfo {
text-align: right;
margin: 0 0 12px 0px;
color: #5d5544;
font-size: 14px;
}
#securityVerification{
display: none;
text-align: right;
margin-top: 7px;
font-size: 14px;
border: 2px solid #FEE;
}
#securityVerificationInput{
font-size: 17px;
}
.leftPanelInfoLink {
text-align: right;
}
.actionButton {
color: #f8f8f8;
cursor: grab;
text-decoration: underline;
font-family: Arial, Helvetica, sans-serif;
font-weight: 300;
letter-spacing: 1px;
width: 95%;
height: 45px;
background: #3cb371 !important;
border-radius: 8px;
transition: .5s;
font-size: 22px !important;
border: 2px solid #2e8b57;
}
.sweetalert-input {
border: 2px #a9a9a9 dashed;
}
#modalInputField input {
vertical-align: bottom;
}
#modalNote {
text-align: right;
font-size: 14px;
margin-top: 10px;
}
.modalLeftLinkHint a {
color: #ff7f50;
}
#modalQRCode img {
width: 95%;
margin-left: 28px;
margin-top: -20px;
}
#modalQRCode {
width: 280px;
height: 280px;
text-align: right;
}
#modalVerificationCode {
width: 45%;
}
#modalClearfix {
clear: left;
}
.btnBlue {
background: #4169e1 !important;
}
#modalSaveLocationDiv {
margin-top: 4px;
text-align: right;
}
#modalSidePanel {
display: inline-block;
width: 45%;
margin-right: 5%;
vertical-align: top;
}
#actionButtonDownload,
#actionButtonStream {
margin-bottom: 10px;
}
#streamingOptions {
visibility: hidden;
margin-bottom: 4px;
}
#modalFooter {
text-align: right;
margin: 20px -15px 0 -15px;
background: #E6F3F0!important;
padding: 12px 20px 12px 0;
}
.custom-btn {
background-color: #4A7BA3;
}
#operationMessage,
#streamingMessage,
#downloadMessage {
visibility: hidden;
background: #E6F3F0!important;
padding: 5px 16px;
color: #3A3326;
border-radius: 4px;
font-weight: 600;
text-align: right;
margin-bottom: 11px;
font-size: 16px;
}
#streamingOptions {
font-size: 11px;
}
#actionButtons {
visibility: hidden;
}
#streamingOptionsToggle {
color: #0080C6;
text-decoration: underline;
cursor: pointer;
font-size: 11px;
padding-right: 8px;
}
.modal-actions {
margin-bottom: 7px;
}
`);
const fetchUserData = async () => {
const endpoint = "https://pan.baidu.com/rest/2.0/xpan/nas?method=uinfo";
const requestConfig = {
responseType: 'json',
timeout: 10000,
method: 'GET',
url: `${endpoint}×tamp=${Date.now()}`,
onload: response => {
const statusCode = response.status;
if (statusCode === 200) {
userInformation = response.response;
} else {
console.error('请求失败:', response);
}
}
};
try {
await new Promise((resolve, reject) => {
GM_xmlhttpRequest({
...requestConfig,
onload: (res) => {
requestConfig.onload(res);
resolve();
},
onerror: reject
});
});
} catch (error) {
console.error('发生错误:', error);
}
};
const initializeApplication = async () => {
addFloatingButton();
};
fetchUserData();
const notificationContainer = document.createElement('div');
notificationContainer.id = "notificationContainer";
let loginPrompt = document.querySelector('.login-main');
let isExternalSite = false;
let directDownloadHelper = {
id: 'btnDirectDownload',
text: 'Direct Download 🚀-FAST',
title: 'Use FAST for downloading',
applyStyle: function (pageLayout) {
if (pageLayout === 'modern') {
return '';
}
if (pageLayout === 'classic' || pageLayout == 'shared') {
return 'padding: 0px;';
}
},
applyClass: function (pageLayout) {
if (pageLayout === 'modern') {
return '';
}
if (pageLayout === 'classic' || pageLayout == 'shared') {
return 'custom-button custom-button-primary-large';
}
},
generateHTML: function (pageLayout) {
if (pageLayout === 'classic' || pageLayout == 'shared') {
return `
<div class="custom-button-wrapper"> <i class="custom-icon custom-icon-download" style="color:#ffffff" title="${this.text}"></i> <span class="custom-text" style="width: auto;">${this.text}</span> </div>
`
}
if (pageLayout === 'modern') {
return `
<button class="modern-button file-toolbar-action is-primary is-small has-icon is-danger"><i class="modern-icon icon-download"></i><span>${this.text}</span></button>
`;
}
}
}
const retrieveSelectedItems = () => {
const currentPageType = determinePageLayout();
if (currentPageType === 'modern') {
const listContainer = document.querySelector('.modern-list-container') || document.querySelector('.alternative-modern-list');
return listContainer ? listContainer.__vue__.selectedElements : null;
} else if (currentPageType === 'legacy') {
const systemContext = require('core-system:utils/context-manager.js');
return systemContext.getInstanceForCurrentSystem().listView.getSelectedItems();
}
return null;
};
setTimeout(() => {
initializeApplication();
}, 750);
})();
function parseBrowserCookies() {
if (!document.cookie) return {};
const cookieArray = document.cookie.split(';');
return cookieArray.reduce((acc, current) => {
const [rawKey, ...valueParts] = current.split('=');
const key = rawKey.trim();
const value = decodeURIComponent(valueParts.join('='));
acc[key] = value;
return acc;
}, {});
}