Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @id baidupan@ywzhaiqi@gmail.com
- // @name BaiduPanDownloadHelper modify by ted423
- // @version 2016.12.13.0
- // @namespace https://github.com/ywzhaiqi
- // @author ywzhaiqi
- // @description 批量导出百度盘的下载链接
- // @grant GM_addStyle
- // @grant GM_setClipboard
- // @grant GM_openInTab
- // @grant GM_xmlhttpRequest
- // @homepageURL https://greasyfork.org/scripts/294/
- // @require http://code.jquery.com/jquery-2.1.4.min.js
- // 兼容 GM 1.x, 2.x
- // @require https://greasyfork.org/scripts/2599/code/gm2_port_v102.js
- // @license GPL version 3
- // @include http*://yun.baidu.com/share/*
- // @include http*://pan.baidu.com/share/*
- // @include http*://yun.baidu.com/s/*
- // @include http*://pan.baidu.com/s/*
- // @include http*://pan.baidu.com/wap/*
- // @include http*://yun.baidu.com/wap/*
- // @include http*://yun.baidu.com/pcloud/album/*
- // @include http*://pan.baidu.com/pcloud/album/*
- // @include http*://pan.baidu.com/disk/home*
- // @include http*://yun.baidu.com/disk/home*
- // @run-at document-start
- // ==/UserScript==
- (function() {
- // 下面的去除云管家,会对上传插件无法显示上传文件夹
- var tmpScript = document.createElement('script');
- tmpScript.textContent = "navigator.__defineGetter__('platform', function() {return 'Linux x86';});navigator.__defineGetter__('userAgent', function() {return 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0';});";
- document.head.appendChild(tmpScript);
- document.head.removeChild(tmpScript);
- //阻止百度网盘wap版自动跳转,来自https://greasyfork.org/zh-CN/scripts/13434
- document.addEventListener('beforescriptexecute', function(e) {
- if (e.target.id == 'platform') {
- e.preventDefault();
- }
- });
- })();
- document.onreadystatechange = function() {
- //alert(document.readyState);
- if (document.readyState == "interactive") {
- var isChrome = !!this.chrome;
- function HttpSendRead(info) {
- if (info.contentType !== null) info.contentType = "application/x-www-form-urlencoded; charset=UTF-8";
- GM_xmlhttpRequest({
- method: info.type,
- url: info.url,
- dataType: info.dataType,
- onreadystatechange: function(response) {
- if (response.readyState == 4) {
- if ((response.status == 200 && response.status < 300) || response.status == 304) {
- clearTimeout(timeId);
- if (info.dataType == "json") {
- deferred.resolve(JSON.parse(response.responseText), response.status, response);
- } else if (info.dataType == "SCRIPT") {
- // eval(response.responseText);
- deferred.resolve(response.responseText, response.status, response);
- }
- } else {
- clearTimeout(timeId);
- deferred.reject(response, response.statusText, response.status);
- }
- }
- }
- });
- };
- var SetMessage = function(msg, type) {
- var Toast = require("common:widget/toast/toast.js");
- Toast.obtain.useToast(cloneInto({
- toastMode: Toast.obtain[type],
- msg: msg,
- sticky: false
- }, unsafeWindow));
- };
- function decode(url, i) {
- var newUrl;
- GM_xmlhttpRequest({
- method: 'get',
- url: url,
- headers: {
- "Referer": "http://pan.baidu.com/disk/home",
- "Range": "bytes=0-1",
- },
- onload: function(response) {
- var newUrl = response.finalUrl;
- debug(newUrl);
- $('.dlinks')[i].href = newUrl;
- $('.dlinks')[i].style.color = "red";
- }
- });
- };
- var Config = { // 默认的设置
- debug: false,
- trim_titles: [ // Share Home 标题移除的文字广告
- "[v.BDpan.COM]"
- ],
- lineBreak: isChrome ? '\r' : '\n',
- };
- var debug = Config.debug ? console.debug.bind(console) : function() {};
- // 最新的改版,在个人主页页面已失效,改用下面的 require
- var FileUtils = unsafeWindow.FileUtils,
- Utilities = unsafeWindow.Utilities,
- disk = unsafeWindow.disk,
- Page = unsafeWindow.Page;
- // 个人主页存在,其它页面可能不存在
- var require = unsafeWindow.require;
- var Utils = {
- r1: function(reg, str) {
- var m = str.match(reg);
- return m ? m[1] : null;
- },
- getParam: function(name, url) {
- var regexp = new RegExp("(?:^|\\?|#|&)" + name + "=([^&#]*)(?:$|&|#)", "i"),
- matches = regexp.exec(url || location.href);
- return matches ? decodeURIComponent(matches[1]) : "";
- },
- };
- var mHome = (function() { // 个人主页
- if (!require) return;
- var downloadAll = function() {
- var context=require("system-core:context/context.js");
- var dlinkService=require("disk-system:widget/system/fileService/fileDownLoad/dlinkService.js");
- var downloadController=require("file-widget-1:download/controller/downloadController.js");
- // 得到选中的条目,过滤文件夹
- var selected=context.prototype.list.getSelected();
- var fileList = [];
- $(selected).each(function(i, self) {
- var $self = $(self);
- if ($self.data('extname') === 'dir') return;
- fileList.push({
- fs_id: $self[0].fs_id,
- server_filename: $self[0].server_filename,
- })
- });
- if (fileList.length === 0) return;
- var type = 'dlink',
- callback = function(result) {
- if (!result.dlink) return;
- result.dlink.forEach(function(info) {
- for (var i = fileList.length - 1, file; i >= 0; i--) {
- file = fileList[i];
- if (file.fs_id == info.fs_id) {
- file.dlink = info.dlink;
- break;
- }
- }
- });
- Pan.checkedItems = fileList;
- Pan.showPanel(fileList);
- delete unsafeWindow.gm_pan_callback;
- };
- // 兼容 Greasemonkey 2.0+
- exportFunction(callback, unsafeWindow, {
- defineAs: "gm_pan_callback"
- });
- dlinkService.getDlinkPan(dlinkService.getFsidListData(selected), type, unsafeWindow.gm_pan_callback);
- };
- var setDocumentTitle = function() { // 设置页面标题,根据 hash 变化而变化,方便历史记录检索
- var path = Utils.getParam('dir/path') || Utils.getParam('path');
- if (path === "") {
- var key = Utils.getParam('key')
- if (key) {
- path = "搜索:" + key;
- }
- }
- if (path) {
- // 不知道是否是百度盘的问题,需要 2 次 decodeURIComponent
- document.title = '百度云 网盘-' + decodeURIComponent(path);
- }
- };
- var addButton = function() {
- $('<a class="icon-btn-download g-button"><span class="g-button-right"><em class="icon icon-offline-download" title="批量下载"></em><span style="width: auto;" class="text">批量下载</span></span></a>')
- .insertAfter('a.g-button[data-button-id="b13"]')
- .click(downloadAll);
- };
- var init = function() {
- addButton();
- setDocumentTitle();
- window.addEventListener('hashchange', setDocumentTitle, false);
- };
- return {
- init: init
- }
- })();
- var Pan = {
- fetchCount: 0,
- init: function() {
- var pageType = this.determineCurrentPageType();
- debug('pageType is ', pageType);
- if (pageType !== null) {
- this.pageType = pageType;
- this.processPage(pageType);
- }
- },
- determineCurrentPageType: function() {
- var pageType = null;
- var loc = window.location.href.toLowerCase();
- if (loc.indexOf('/disk/home') != -1) pageType = 'diskHome';
- else if (loc.indexOf('/share/link') != -1 || loc.indexOf('/s/') != -1) {
- var type = unsafeWindow.yunData.SHAREPAGETYPE;
- if (type == 'multi_file') pageType = 'shareDir';
- else if (type == 'single_file_page') pageType = 'shareOne';
- } else if (loc.indexOf('/share/home') != -1) pageType = 'shareHome';
- else if (loc.indexOf('/pcloud/album/info') != -1) pageType = 'albumInfo';
- else if (loc.indexOf('/pcloud/album/file') != -1) pageType = 'albumFile';
- else if (loc.indexOf('/share/init?') != -1) pageType = 'shareInit';
- return pageType;
- },
- processPage: function(pageType) {
- if (pageType !== null) {
- var pageProcessor = pageType + 'PageProcessor';
- this.pageType = pageType;
- if (typeof(this[pageProcessor]) == 'function') {
- GM_addStyle(panelCSS);
- this[pageProcessor]();
- }
- }
- },
- diskHomePageProcessor: function() { // 个人主页
- mHome.init();
- },
- shareDirPageProcessor: function() {
- var self = this;
- // 添加批量下载按钮
- $('<a class="bbtn" style="padding-left:10px"><b>批量下载</b></a>')
- .appendTo('.module-list-toolbar>.bar')[0].onclick = function(e) {
- self.downloadAll();
- };
- },
- shareOnePageProcessor: function() {
- },
- shareHomePageProcessor: function() {
- },
- albumInfoPageProcessor: function() {
- var self = this;
- var _mAlbumId, _mUk, _mPage;
- _mAlbumId = (disk.ui.album.albuminfo && disk.ui.album.albuminfo.album_id) || disk.getParam("album_id");
- _mUk = (disk.ui.album.uinfo && disk.ui.album.uinfo.uk) || disk.getParam("uk") || disk.getParam("query_uk");
- _mPage = {
- count: 0,
- totalPage: 0,
- nowPage: 1,
- limit: 60,
- handle: false
- };
- var getList = function() {
- var nowPage = $('#albumPage .page-input-wrap > input').val();
- _mPage.nowPage = parseInt(nowPage);
- var restUrl = "/pcloud/album/listfile?album_id=" + _mAlbumId + "&query_uk=" + _mUk +
- "&start=" + (_mPage.nowPage - 1) * 60 + "&limit=" + _mPage.limit;
- $.get(restUrl, function(result) {
- if (result && result.errno == 0 && result.list) {
- Pan.showPanel(result.list);
- Pan.toast.setVisible(false);
- } else {
- Pan.useToast("获取数据出错, " + restUrl);
- }
- });
- };
- // 内容由 js 生成
- var clicked = function(e) {
- var $quickFileSave = $('#quickFileSave');
- if ($quickFileSave[0]) {
- $('<a class="bbutton" style="margin-left:10px;padding-left:5px;">\
- <b style="padding-right: 5px;">批量下载</b></a>')
- .insertAfter($quickFileSave)[0].onclick = getList;
- $('body').unbind('click');
- }
- };
- $('body').bind('click', clicked);
- },
- shareInitPageProcessor: function() {
- },
- // --------------------
- downloadAll: function() {
- var self = this;
- var file_list = [];
- yunData=unsafeWindow.yunData;
- if (yunData.SHAREPAGETYPE == "single_file_page") {
- var fid_list = 'fid_list=' + JSON.stringify([yunData.FS_ID]);
- set_share_data(yunData, fid_list);
- } else {
- var File = require("common:widget/data-center/data-center.js");
- var Filename = File.get("selectedItemList");
- var file_info = File.get("selectedList");
- if (file_info.length == 0) {
- SetMessage("先选择一下你要下载的文件哦", "MODE_CAUTION");
- return;
- }
- var count=0;
- for (var i = 0; i < Filename.length; i++) {
- if (Filename[i].attr("data-extname") != "dir") {
- var lastFlag=false;
- fid_list = 'fid_list=' + JSON.stringify([Filename[i].attr("data-id")]);
- yunData["isdir"] = 0;
- set_share_data(yunData, fid_list, file_list);
- }
- }
- }
- function set_share_data(obj, fid_list, file_list) {
- var data = "encrypt=0&product=share&uk=" + yunData.SHARE_UK + "&primaryid=" + yunData.SHARE_ID + "&" + fid_list;
- if (yunData.SHARE_PUBLIC == 0) {
- var Service = require("common:widget/commonService/commonService.js");
- data = data + "&extra=" + encodeURIComponent(JSON.stringify({
- sekey: Service.getCookie("BDCLND")
- }));
- }
- if (obj.isdir == 1) {
- data = data + "&type=batch";
- }
- get_share_dlink(obj, data, file_list);
- }
- function get_share_dlink(obj, data, file_list) {
- var download = "http://" + window.location.host + "/api/sharedownload?channel=chunlei&clienttype=0&web=1&app_id=" + yunData.FILEINFO[0].app_id + "×tamp=" + yunData.TIMESTAMP + "&sign=" + yunData.SIGN + "&bdstoken=" + yunData.MYBDSTOKEN;
- var pic = "http://" + window.location.host + "/api/getcaptcha?prod=share&channel=chunlei&clienttype=0&web=1&bdstoken=" + yunData.MYBDSTOKEN + "&app_id=" + yunData.FILEINFO[0].app_id;
- var parameter = {
- 'url': download,
- 'dataType': 'json',
- type: 'POST',
- 'data': data
- };
- $.ajax(parameter)
- .done(function(json, textStatus, jqXHR) {
- if (json.errno == -20) {
- $.ajax({
- 'url': pic,
- 'dataType': 'json',
- type: 'GET'
- })
- .done(function(json, textStatus, jqXHR) {
- if (data.indexOf("input") != -1) {
- json.auth = true;
- }
- SetMessage("需输入验证码,无法继续", "MODE_FAILURE");
- console.log('需输入验证码,无法继续');
- })
- .fail(function(json, textStatus, jqXHR) {
- SetMessage("获取验证码失败?", "MODE_FAILURE");
- });
- } else if (json.errno == 0) {
- if (obj.isdir == 1) {
- self.get_dir(JSON.stringify(json));
- return;
- } else {
- for (var i = 0; i < json.list.length; i++) {
- var list = json.list[i];
- file_list.push({
- server_filename: list.path.slice(yunData.PATH.lastIndexOf("/") + 1, list.path.length),
- dlink: list.dlink
- });
- }
- count++;
- debug(count,Filename.length);
- if(count==Filename.length)
- Pan.showPanel(file_list);
- }
- } else {
- debug(json);
- SetMessage("出现异常!", "MODE_FAILURE");
- }
- })
- .fail(function(jqXHR, textStatus, errorThrown) {
- SetMessage("获取地址失败?", "MODE_FAILURE");
- });
- }
- },
- getList: function(item) {
- var self = this;
- var dir, restUrl;
- dir = item && item.path || disk.getParam('path');
- restUrl = this.API_URL + (dir ? '&dir=' + encodeURIComponent(dir) : '');
- debug('获取数据', restUrl);
- $.get(restUrl, function(result) {
- self.fetchCount -= 1;
- if (result && result.errno == 0 && result.list) {
- if (item) {
- item.children = result.list;
- } else { // 专辑获取到的结果为 checkedItems
- self.checkedItems = result.list;
- }
- self.handleResult(result.list);
- } else {
- Pan.useToast("获取数据出错, " + restUrl);
- }
- });
- },
- handleResult: function() { // 全部获取完成
- if (this.fetchCount > 0) return;
- var self = this;
- debug('得到选择的数据', this.checkedItems);
- },
- showPanel: function(checkedItems, dlinkMap) {
- if (!this.panel) {
- this.panel = this.createPanel();
- }
- var linksHTML = this.createDLinksHtml(checkedItems, dlinkMap);
- $("#mDownload-links").html(linksHTML);
- this.panel.style.display = "block";
- $('.dlinks').each(function(i) {
- var temp=$('.dlinks')[i].href.replace("https","http");
- decode(temp, i);
- });
- },
- createPanel: function() {
- var self = this;
- var container = document.createElement("div");
- container.id = "mDownload-container";
- var links_div = document.createElement("div");
- links_div.id = "mDownload-links";
- var closeButton = document.createElement("button");
- closeButton.id = "mDownload-close-button";
- closeButton.innerHTML = "关闭";
- closeButton.onclick = function() {
- container.style.display = "none";
- };
- var exportButton = document.createElement("button");
- exportButton.id = "mDownload-export-button";
- exportButton.innerHTML = "导出";
- exportButton.onclick = function() {
- GM_openInTab('data:text/html;charset=utf-8,' + encodeURIComponent(links_div.innerHTML));
- };
- var copyButton = document.createElement("button");
- copyButton.id = "mDownload-copy-button";
- copyButton.innerHTML = "复制";
- copyButton.onclick = function() {
- self.copyDlinks(null);
- };
- container.appendChild(closeButton);
- container.appendChild(exportButton);
- container.appendChild(copyButton);
- container.appendChild(links_div);
- document.body.appendChild(container);
- return container;
- },
- dir_tpl: "<b style='padding-left:{padding_left}'>{server_filename}</b>",
- dlinks_tpl: "<a class='dlinks' href={dlink} style='padding-left:{padding_left}'>{server_filename}</a>",
- createDLinksHtml: function(checkedItems, dlinkMap) {
- var self = this,
- htmls = [],
- isAdded = false;
- checkedItems.forEach(function(item) {
- item.padding_left = "0px";
- if (item.isdir == 1) {
- htmls.push(template(self.dir_tpl, item));
- if (Array.isArray(item.children)) {
- item.children.forEach(function(i) {
- i.padding_left = "15px";
- if (dlinkMap) {
- i.dlink = dlinkMap[i.fs_id];
- }
- var tpl = i.dlink ? self.dlinks_tpl : self.dir_tpl;
- htmls.push(template(tpl, i));
- });
- }
- } else {
- if (!isAdded) {
- htmls.push("<b>---------------</b>");
- isAdded = true;
- }
- if (dlinkMap) {
- item.dlink = dlinkMap[item.fs_id];
- }
- htmls.push(template(self.dlinks_tpl, item));
- }
- });
- return htmls.join("<br>");
- },
- copyDlinks: function(items, type) {
- var arr = [];
- items = $('.dlinks');
- items.each(function(i) {
- arr.push(items[i].href);
- //console.log('copy+'+items[i].href)
- });
- this.copy(arr);
- },
- copy: function(arr, isDlink) {
- if (typeof isDlink == 'undefined') isDlink = true;
- GM_setClipboard(arr.join(Config.lineBreak), 'text');
- Pan.useToast('已经复制 <b>' + arr.length + '</b> 条' + (isDlink ? '下载' : '') + '链接到剪贴板');
- },
- useToast: function(msg, sticky) {
- // disk.ui.Toast.MODE_FAILURE 错误
- // disk.ui.Toast.MODE_CAUTION 警告
- // disk.ui.Toast.MODE_LOADING 载入
- // disk.ui.Toast.MODE_SUCCESS 正常
- if (Utilities) {
- return Utilities.useToast(cloneInto({
- toastMode: disk.ui.Toast.MODE_CAUTION,
- msg: msg,
- sticky: sticky || false
- }, unsafeWindow));
- } else if (require) {
- var Toast = require("common:widget/toast/toast.js");
- Toast.obtain.useToast(cloneInto({
- toastMode: Toast.obtain.MODE_CAUTION,
- msg: msg,
- sticky: sticky || false,
- }, unsafeWindow));
- }
- }
- };
- var panelCSS = "#mDownload-container{position:fixed;z-index:1000;left:314px;top:120px;background:white;padding:10px;border:1px solid rgb(153,153,153);box-shadow:0px 0px 9px rgb(153,153,153);}#mDownload-containerbutton{margin-right:10px;}#mDownload-links{margin-top:10px;max-height:400px;overflow:auto;}#mDownload-linksb{color:red;}#mDownload-containerbutton{color:black !important;}";
- function template(tpl, data) {
- return tpl.replace(/\{([\w\.]*)\}/g, function(str, key) {
- var keys = key.split('.'),
- value = data[keys.shift()];
- keys.forEach(function(key) {
- value = value[key];
- });
- return (value === null || value === undefined) ? '' : value;
- });
- }
- Pan.init();
- }
- };
Add Comment
Please, Sign In to add comment