Greasy Fork is available in English.
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 r###lt = '';
- for (let i = 0; i < 4; i++) {
- r###lt += characters.charAt(Math.floor(Math.random() * characters.length));
- }
- return r###lt;
- }
- 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();
- showTransferR###ltDialog(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 showTransferR###ltDialog(success) {
- const message = success ? "Success" : "Fail";
- const modal = document.createElement('div');
- modal.className = 'modal transfer-r###lt-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();
- showTransferR###ltDialog(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);
- })();