BaiduPan for generating links and saving files. 百度網盤轉存(偽)
// ==UserScript== // @name (New Format)BaiduNetDisk Fake Quick Save (新型格式)百度网盘秒传(偽)链接提取 转存 // @name BaiduPan for generating links and saving files. 百度网盘转存(偽) // @name:zh BaiduPan for generating links and saving files. 百度网盘转存(偽) // @name:zh-TW BaiduPan for generating links and saving files. 百度網盤轉存(偽) // @name:en BaiduNetDisk for generating links and saving files. // @namespace http://tampermonkey.net/ // @version 0.1 // @description BaiduPan for generating links and saving files. 百度網盤轉存(偽) // @description:zh-tw 百度網盤轉存(偽) // @description:en BaiduPan for generating links and saving files. // @author kamisato // @match *://pan.baidu.com/* // @grant GM_xmlhttpRequest // @noframes // @license MIT // ==/UserScript== (function() { 'use strict'; var uk; window.addEventListener('load', function() { function extractUk() { const scripts = document.getElementsByTagName('script'); const ukRegex = /"uk":"(\d+)"/; for (let script of scripts) { if (script.textContent.includes('window.locals')) { const matches = ukRegex.exec(script.textContent); if (matches && matches.length > 1) { return matches[1]; } } } return null; } uk = extractUk(); if (uk) { console.log('Extracted UK:', uk); } else { console.log('UK not found'); } const toolbar = document.querySelector('.wp-s-agile-tool-bar__header'); if (toolbar) { const generateLinkButton = createButton('Generate Link', 'generate-link'); generateLinkButton.addEventListener('click', generateLink); const saveButton = createButton('Save By Link', 'save'); saveButton.addEventListener('click', showSaveDialog); toolbar.appendChild(generateLinkButton); toolbar.appendChild(saveButton); } }); function createButton(text, className) { const button = document.createElement('button'); button.textContent = text; button.className = `btn ${className}`; return button; } function generateLink() { const links = []; let fidLists = []; let fidListAdded = false; fidLists = getSelectedFidList(); if (fidLists.length === 0) { return; } showLoadingDialog(); function makeRequest(index) { if (index >= 3) { const jsonStr = JSON.stringify({ links, fidLists }); const jsonStr1 = JSON.stringify({ links, fidLists: fidLists }); const base64Encoded = btoa(jsonStr1); updateDialogWithResponse(base64Encoded); return; } const pwd = generateRandomPassword(); fidLists = getSelectedFidList(); const data = `period=0&pwd=${pwd}&eflag_disable=true&channel_list=[]&schannel=4&fid_list=[${fidLists}]`; GM_xmlhttpRequest({ method: "POST", url: `https://pan.baidu.com/share/set?channel=chunlei&clienttype=0&app_id=250528&web=1`, headers: { "Content-Type": "application/x-www-form-urlencoded" }, data: data, onload: function(response) { const respJson = JSON.parse(response.responseText); const surl = extractSurl(respJson.link); const link = `${surl}&pwd=${pwd}&shareid=${respJson.shareid}&realNameVerify=${uk}`; links.push(link); //fidLists.push(fidList.join(',')); makeRequest(index + 1); }, onerror: function(error) { console.error('Request failed', error); makeRequest(index + 1); } }); } makeRequest(0); } function extractSurl(fullLink) { const parts = fullLink.split('/'); const lastPart = parts[parts.length - 1]; return lastPart.substring(1); } function generateRandomPassword() { const characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < 4; i++) { result += characters.charAt(Math.floor(Math.random() * characters.length)); } return result; } function getSelectedFidList() { const selectedRows = document.querySelectorAll('.wp-s-table-skin-hoc__tr.wp-s-pan-table__body-row.mouse-choose-item.selected'); return Array.from(selectedRows, row => row.getAttribute('data-id')); } function showLoadingDialog() { const modal = document.createElement('div'); modal.className = 'modal loading-modal'; modal.innerHTML = ` <div class="modal-dialog loading-dialog"> <div class="modal-content"> <div class="modal-body" style="text-align: center;"> <p style="font-size: 20px;">Generating...</p> </div> </div> </div> `; document.body.appendChild(modal); } function updateDialogWithResponse(responseText) { const modalBody = document.querySelector('.modal .modal-body'); if (modalBody) { modalBody.innerHTML = ` <textarea id="generatedResponse" class="form-control response-textarea" readonly>${responseText}</textarea> <div class="modal-footer"> <button class="btn btn-success" id="copyButton">Copy</button> <button class="btn btn-secondary" onclick="this.closest('.modal').remove()">Close</button> </div> `; document.getElementById('copyButton').addEventListener('click', copyToClipboard); } else { console.error('Modal body not found'); } } function copyToClipboard() { const responseField = document.getElementById('generatedResponse'); if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(responseField.value) .then(() => { document.getElementById('copyButton').textContent = 'Copied'; }) .catch(err => { console.error('error: ', err); }); } else { responseField.select(); document.execCommand('copy'); document.getElementById('copyButton').textContent = 'Copied'; } } function updateDialogWithLink(link) { const modalBody = document.querySelector('.modal .modal-body'); modalBody.innerHTML = ` <div class="link-display"> <label for="generatedLink">Generated Link:</label> <input type="text" id="generatedLink" value="${link}" class="form-control" readonly> </div> <div class="modal-footer"> <button class="btn btn-success" onclick="navigator.clipboard.writeText('${link}')">Copy</button> <button class="btn btn-secondary" onclick="this.closest('.modal').remove()">Close</button> </div> `; } function tryTransfer(links, fidList, pathInput, attempt, triedIndices = []) { if (attempt === 0) showTransferringDialog(); if (attempt >= links.length) { console.error('Failed...'); document.querySelector('.transferring-modal').remove(); showTransferResultDialog(false); return; } let remainingIndices = links.map((_, index) => index).filter(index => !triedIndices.includes(index)); let randomIndex = remainingIndices[Math.floor(Math.random() * remainingIndices.length)]; triedIndices.push(randomIndex); const randomLink = links[randomIndex]; const { surl, pwd, shareid, realNameVerify } = parseLink(randomLink); const verifyUrl = `https://pan.baidu.com/share/verify?surl=${surl}&channel=chunlei&web=1&app_id=250528`; const verifyOptions = { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': 'https://pan.baidu.com' }, body: `pwd=${pwd}` }; fetch(verifyUrl, verifyOptions) .then(response => response.json()) .then(data => { if (data && data.randsk) { transferFile(shareid, data.randsk, realNameVerify, fidList, pathInput, () => { tryTransfer(links, fidList, pathInput, attempt + 1, triedIndices); }); } else { tryTransfer(links, fidList, pathInput, attempt + 1, triedIndices); } }) .catch(error => { tryTransfer(links, fidList, pathInput, attempt + 1, triedIndices); }); } function showTransferringDialog() { const modal = document.createElement('div'); modal.className = 'modal transferring-modal'; modal.innerHTML = ` <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body" style="text-align: center;"> <p style="font-size: 20px;">Saving...</p> </div> </div> </div> `; document.body.appendChild(modal); } function showTransferResultDialog(success) { const message = success ? "Success" : "Fail"; const modal = document.createElement('div'); modal.className = 'modal transfer-result-modal'; modal.innerHTML = ` <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body" style="text-align: center;"> <p style="font-size: 20px;">${message}</p> </div> <div class="modal-footer"> <button class="btn btn-secondary" onclick="this.closest('.modal').remove()">Close</button> </div> </div> </div> `; document.body.appendChild(modal); } function transferFile(shareid, sekey, realNameVerify, fidList, path, errorCallback) { const transferUrl = `https://pan.baidu.com/share/transfer?shareid=${shareid}&from=${realNameVerify}&sekey=${sekey}&ondup=newcopy&async=1&channel=chunlei&web=1&app_id=250528`; const transferOptions = { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': 'https://pan.baidu.com' }, body: `fsidlist=[${fidList}]&path=${path}` }; console.log(transferUrl); fetch(transferUrl, transferOptions) .then(response => response.json()) .then(respJson => { if (respJson.errno === 0) { document.querySelector('.transferring-modal').remove(); showTransferResultDialog(true); } else { errorCallback(); } }) .catch(error => { errorCallback(); }); } function showSaveDialog() { const modal = document.createElement('div'); modal.className = 'modal'; modal.innerHTML = ` <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body"> <input type="text" id="linkInput" class="form-control" placeholder="link"> <input type="text" id="pathInput" class="form-control" placeholder="/???,default root path."> </div> <div class="modal-footer"> <button class="btn btn-primary" id="saveButton">Save it!</button> <button class="btn btn-secondary" onclick="this.closest('.modal').remove()">Close</button> </div> </div> </div> `; document.body.appendChild(modal); document.getElementById('saveButton').addEventListener('click', function() { const linkInput = document.getElementById('linkInput').value; const pathInput = document.getElementById('pathInput').value; let encodedPath = encodeURIComponent(pathInput); if (encodedPath === '') { encodedPath = '%2f'; } try { const linksArray = atob(linkInput); const parsedData = JSON.parse(linksArray); const links = parsedData.links; const fidList = parsedData.fidLists; tryTransfer(links, fidList, encodedPath, 0); } catch (error) { console.error(error); } }); } function parseLink(link) { const [surl, pwdPart, shareidPart, realNamePart] = link.split('&'); const pwd = pwdPart.split('=')[1]; const shareid = shareidPart.split('=')[1]; const realNameVerify = realNamePart.split('=')[1]; return { surl, pwd, shareid, realNameVerify }; } const style = document.createElement('style'); style.textContent = ` .btn { background-color: #06a7ff; color: white; font-weight: 700; padding: 8px 24px; height: 32px; font-size: 14px; border-radius: 16px; border: none; margin-left: 10px; cursor: pointer; } .modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: white; padding: 20px; border-radius: 10px; box-shadow: 0px 0px 10px rgba(0,0,0,0.5); z-index: 1000; } .modal-dialog { width: auto; } .modal-content { padding: 15px; } .modal-body { padding: 10px 0; } .modal-footer { text-align: center; padding: 10px 0; } .link-display { margin-bottom: 15px; } .link-display input { width: 100%; padding: 6px 12px; margin-top: 5px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; border: 1px solid #ccc; border-radius: 4px; box-shadow: inset 0 1px 1px rgba(0,0,0,.075); } .link-display label { font-weight: 700; } .form-control { width: 100%; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; border: 1px solid #ccc; border-radius: 4px; box-shadow: inset 0 1px 1px rgba(0,0,0,.075); } .modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 30vw; background-color: white; padding: 20px; border-radius: 10px; box-shadow: 0px 0px 10px rgba(0,0,0,0.5); z-index: 1000; overflow: auto; } .loading-dialog { width: 30%; } .response-textarea { height: 200px; } .modal-dialog { width: 100%; } .modal-content { width: 100%; } .modal-body { padding: 10px 0; } .modal-footer { text-align: center; padding: 10px 0; } .link-display { margin-bottom: 15px; } .link-display input, .form-control { width: 100%; } text-area { min-height: 400px; } `; document.head.appendChild(style); })();