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; }, {}); }