BaiduPanFileList

统计百度盘文件(夹)数量大小. Thanks BaiduPanMD5Button

目前為 2015-10-29 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name       BaiduPanFileList
// @namespace  https://greasyfork.org/scripts/5128-baidupanfilelist/code/BaiduPanFileList.user.js
// @version    1.045
// @description  统计百度盘文件(夹)数量大小. Thanks BaiduPanMD5Button
// @match	http://pan.baidu.com/disk/home*
// @include	http://pan.baidu.com/disk/home*
// @require http://libs.baidu.com/jquery/2.1.1/jquery.min.js
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @run-at document-end
// @copyright  2014+, [email protected]
// ==/UserScript==

// %Path% = 文件路径
// %FileName% = 文件名
// %Tab% = Tab键
// %FileSize% = 可读文件大小(带单位保留两位小数,如:6.18 MiB)
// %FileSizeInBytes% = 文件大小字节数(为一个非负整数)

var _BaiduPanFileList_Pattern = "%Path%%Tab%%FileSize%(%FileSizeInBytes% Bytes)";


var url = document.URL;
var BTN_WAITING_TEXT = "統計檔案";
var BTN_RUNNING_TEXT = "處理中...";
var CLASS_NAME_APPEND_TO = "bar global-clearfix";
var BASE_URL_API = "http://pan.baidu.com/api/list?channel=chunlei&clienttype=0&web=1&dir=";
var REQ_HEADERS = {
    "Host" : document.domain,
    "Connection": "keep-alive",
    "Cache-Control" : "no-cache",
    "Pragma" : "no-cache",
    "Accept" : "application/json, text/javascript, */*; q=0.01",
    "X-Requested-With" : "XMLHttpRequest",
    "User-Agent" : navigator.userAgent,
    "Referer" : "http://pan.baidu.com/disk/home",
    "Accept-Encoding" : "gzip,deflate,sdch",
    "Accept-Language" : "zh,en;q=0.8,ja;q=0.6,ko;q=0.4,zh-CN;q=0.2",
    "Cookie" : document.cookie
}; // 备用

var global = (function() { return this || (1,eval)('(this)'); }()); //

// 按钮
var btn_curr = document.createElement("button");
btn_curr.type = "button";
btn_curr.style.cssText = 'margin: 0px 10px;height: 28px;';
btn_curr.innerHTML = BTN_WAITING_TEXT;
btn_curr.id = BTN_WAITING_TEXT;
btn_curr.disabled = false;
btn_curr.waiting_text = BTN_WAITING_TEXT;
btn_curr.running_text = BTN_RUNNING_TEXT;
btn_curr.error = false;
// 按钮单击
btn_curr.onclick = function(e){
    e = e||window.event;
    if(e.ctrlKey){
       showInfo(btn_curr, true);
    }else{
       showInfo(btn_curr, false);
    }
};

// 键盘, 确保在按钮添加失败时依旧可用
document.addEventListener("keydown", function(e){
    e = e||window.event;
    var key = e.keyCode||e.charCode;
    if(key == 81||key == 113){
        if(e.ctrlKey){
            showInfo(btn_curr, true);
        }else{
            showInfo(btn_curr, false);
        }
    }
}, false);

// 自己的网盘添加按钮
if (url.indexOf("http://pan.baidu.com/disk/home") != -1) {
    var el_append_to = document.getElementsByClassName(CLASS_NAME_APPEND_TO)[0];
    if(!document.getElementById(BTN_WAITING_TEXT)){
        el_append_to.appendChild(btn_curr);
    }
}

// 处理按钮和快捷键
function showInfo(button, includeSubDir) {
    if(button.disabled||button.error){
        return;
    }
    showBtn(false);
    url = document.URL;
    while (url.indexOf("%25") != -1) {
        url = url.replace("%25", "%");
    }
    var listurl = BASE_URL_API; 
    var folder_access_times = 0;
    var currentDir = "";
    var checkedPath = new Array();
    
    var str_alert = "";
    var num_all_files = 0;
    var num_all_folder = 0;
    var num_jpg = 0;
    var num_original = 0;
    var name_all = new Array();
    var size_all = 0;
    // 百度api
    // http://pan.baidu.com/api/list?channel=chunlei&clienttype=0&web=1&num=100&page=1&dir=<PATH>&order=time&desc=1&showempty=0&_=1404279060517&bdstoken=9c11ad34c365fb633fc249d71982968f&app_id=250528
    // 测试url
    // http://pan.baidu.com/disk/home#dir/path=<PATH>
    // http://pan.baidu.com/disk/home#from=share_pan_logo&path=<PATH>
    // http://pan.baidu.com/disk/home#key=<KEY>
    // http://pan.baidu.com/disk/home#path=<PATH>
    // http://pan.baidu.com/disk/home
    // http://pan.baidu.com/disk/home#path=<PATH>&key=<KEY>
    if (url.indexOf("path=") == -1) {
        listurl += "%2F";
        currentDir = "/";
        getList(listurl);
    } else if(url.indexOf("path=") != -1){
        var path = url.substring(url.indexOf("path=") + 5);
        if(path.indexOf("&") != -1){
            path = path.substring(0, path.indexOf("&"));
        }
        listurl += path;
        currentDir = decodeURIComponent(path);
        getList(listurl);
    }
    // 保存选择文件(夹)路径
    checkedPath = getCheckedPathArray(currentDir);
    // 请求数据
    function getList(url) {
        if(button.error){
            return;
        }
        GM_xmlhttpRequest({
            method : 'GET',
            synchronous : false,
            url : url,
            timeout : 9999,
            onabort : function() {
                showError(decodeURIComponent(url.replace(BASE_URL_API, ""))
                          + "\n\n意外终止, 请刷新重试");
            },
            onerror : function() {
                showError(decodeURIComponent(url.replace(BASE_URL_API, ""))
                          + "\n\n未知错误, 请刷新重试");
            },
            ontimeout : function() {
                showError(decodeURIComponent(url.replace(BASE_URL_API, ""))
                          + "\n\n请求超时, 请刷新重试");
            },
            onload : function(reText) {
                var JSONobj = JSON.parse(reText.responseText);
                if (JSONobj.errno != 0) {
                    showError("读取目录: "
                              + decodeURIComponent(url.replace(BASE_URL_API, ""))
                              + "  失败, 错误码: " + JSONobj.errno);
                    return;
                }
                var size_list = JSONobj.list.length;
                var curr_item = null;
                for ( var i = 0; i < size_list; i++) {
                    curr_item = JSONobj.list[i];
                    if(listurl === url && checkedPath.length != 0 && !isArrayContains(checkedPath, curr_item.path)){
                    	continue;
                    }
                    if (curr_item.isdir == 1) {
                        num_all_folder++;
                        name_all.push(curr_item.path);
                        if (includeSubDir) {
                            folder_access_times++;
                            getList(BASE_URL_API
                                    + encodeURIComponent(curr_item.path));
                        }
                    } else {
                        num_all_files++;
                        if (curr_item.server_filename.indexOf(" (JPG).zip") != -1) {
                            num_jpg++;
                        } else if (curr_item.server_filename.indexOf(".zip") != -1) {
                            num_original++;
                        }
                        size_all += curr_item.size;
						if(typeof _BaiduPanFileList_Pattern == "string"){
                            name_all.push(_BaiduPanFileList_Pattern.replace("%FileName%", curr_item.server_filename).replace("%Path%", curr_item.path).replace("%FileSizeInBytes%", curr_item.size).replace("%Tab%", "\t").replace("%FileSize%", getReadableFileSizeString(curr_item.size)));
                        }else{
                            name_all.push(curr_item.path + "\t" + getReadableFileSizeString(curr_item.size) + "(" + curr_item.size + " Bytes)");
                        }
                    }
                }
                folder_access_times--;
                if (folder_access_times + 1 == 0) {
                    var CTL = "\r\n";
                    str_alert = (checkedPath.length == 0 ? currentDir : checkedPath.join("\r\n")) + CTL + CTL
                    + "files: " + num_all_files + ", folders: " + num_all_folder + CTL
                    + "xxx (JPG).zip: " + num_jpg + CTL
                    + "xxx.zip: " + num_original + CTL 
                    + "size: " + getReadableFileSizeString(size_all) + "  ("+ size_all + " Bytes)" + CTL;
                    GM_setClipboard(str_alert + CTL + CTL + name_all.sort().join("\r\n") + "\r\n");
                    alert(str_alert.replace(/\r\n/g, "\n"));
                    showBtn(true);
                }
            }
        });
    }
    // 错误提示
    function showError(info){
        if(!button.error){
            button.error = true;
            alert(info);
        }
    }
    // 禁用启用按钮
    function showBtn(isDisplay) {
        if (isDisplay === true) {
            button.innerHTML = button.waiting_text;
            button.disabled = false;
        } else {
            button.disabled = true;
            button.innerHTML = button.running_text;
        }
    }
}

// 转换可读文件大小
function getReadableFileSizeString(fileSizeInBytes) {
    var i = 0;
    var byteUnits = [ ' Bytes', ' KiB', ' MiB', ' GiB', ' TiB', ' PiB', ' EiB',
                     ' ZiB', ' YiB' ];
    while (fileSizeInBytes >= 1024) {
        fileSizeInBytes = fileSizeInBytes / 1024;
        i++;
    }
    return fileSizeInBytes.toFixed(2) + byteUnits[i];
}

// 得到选择项目,如果获取失败则返回空数组
function getCheckedPathArray(currentDir){
	var re = new Array();
	var items;
	try {
		items = getCheckItems();
		for (var i = 0; i < items.length; i++) {
            if(items[i].server_filename == "我的应用数据"){
                re.push("/apps");
            }else{
                re.push((currentDir == "/" ? currentDir : currentDir + "/") + items[i].server_filename);
            }
		}
	} catch (e) {
		// TODO: handle exception
	}
	return re;
}

// 判断是数组中是否还有指定元素
function isArrayContains(arr, obj) {
    var i = arr.length;
    while (i--) {
       if (arr[i] === obj) {
           return true;
       }
    }
    return false;
}



// //////////////////////////////////////////////////////////////////////

/*
 * === 说明 ===
 *@作者:有一份田
 *@官网:http://www.duoluohua.com/download/
 *@Email:[email protected]
 *@Git:http://git.oschina.net/youyifentian
 *@转载重用请保留此信息
 *
 *
 * */
function getCheckItems(){
    var items=[],boxCss=$('.list-selected').length ? 'module-list-view' : 'module-grid-view';
    $('div.' + boxCss).find('.item-active').each(function(i,o){
        items.push(getListViewCheckedItemInfo(o));
    });
    return items;
}
function getListViewCheckedItemInfo(obj){
    var o=$(obj),fs_id=o.attr('data-id'),category=o.attr('data-category'),
        isdir=o.attr('data-extname')=='dir' ? 1 : 0,
        server_filename=o.find('[node-type="name"]').attr('title'),
        dlink=o.attr('dlink') || '';
    return {'fs_id':fs_id,'category':category,'isdir':isdir,'server_filename':server_filename,'dlink':dlink,'item':obj};
}