Greasy Fork

Greasy Fork is available in English.

百度网盘批量解压缩

百度网盘当前目录压缩文件一键解压

当前为 2020-03-09 提交的版本,查看 最新版本

// ==UserScript==
// @name         百度网盘批量解压缩
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  百度网盘当前目录压缩文件一键解压
// @match        https://pan.baidu.com/*
// @require      https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
let btnToolHTML = '<a class="g-button" href="javascript:;" title="批量解压" style="display: inline-block;"><span class="g-button-right"><em class="icon icon-remark-remove" title="批量重命名"></em><span class="text" style="width: auto;">批量解压</span></span></a>';

$(btnToolHTML).appendTo('.tcuLAu').click(function () {
    unZip();
    return false;
});
let baidu_tips = require('system-core:system/uiService/tip/tip.js');
let allList = $.grep($('.file-name .text a'), function (element, index) {
    return $(element).text();
}).map(function (item, index) {
    return $(item).text();
});//获取当前目录所有文件列表
let folders = $.grep($('.file-name .text a'), function (element, index) {
    return !/\.\w{2,4}$/ig.test($(element).text());
}).map(function (item, index) {
    return $(item).text();
});//获取当前目录文件夹列表

async function unZip() {
    let url_list = 'https://pan.baidu.com/api/zipfile/list';
    let url_copy = 'https://pan.baidu.com/api/zipfile/copy';
    let url_task = 'https://pan.baidu.com/api/taskquery';
    let url_delete = 'https://pan.baidu.com/api/filemanager?';
    let password = prompt('请输入解压密码,没有密码为空即可', '');
    let path = $('.FuIxtL li[node-type] span:last');
    path = path.attr('title').replace('全部文件', '') + '/';

    let filelist = $.grep($('.file-name .text a'), function (element, index) {
        return /\.(zip|rar)$/ig.test($(element).text()) && !folders.includes($(element).text().replace(/\.(zip|rar)$/ig,
            ''));
    });//获取当前文件夹压缩文件列表,排除同名文件夹

    for (var i = 0; i < filelist.length; i++) {
        var data_copy = [];
        let optiona = {
            path: path + filelist[i].text,
            start: 0,
            limit: 100,
            passwd: password,
            subpath: '/',
            channel: 'chunlei',
            web: 1,
            bdstoken: yunData.MYBDSTOKEN,
            app_id: 250528,
            clienttype: 0,
        };


        let file_name = [];
        let status = [];
        let responsedata = [];


        await ajax('GET', url_list, optiona).then(data => {
            responsedata = data;
        });//获取压缩文件文件列表
        if (responsedata['errno'] == 0) {
                $.each(responsedata['list'], function (index, element) {
                    file_name.push(element.file_name)
                 });
                } else {
                    console.log('errno' + responsedata['errno'] + '普通会员支持2G以内压缩包,超级会员支持4G以上压缩包')
                    status.push(0)
                    break;


                }
        let file_list = $.grep(file_name, function (element, index) {
            return element && !allList.includes(element)
        });//排除已存在的文件


        for (var x = 0; x < file_list.length; x++) {
            let taskidno;
            let optionb = {
                path: path + filelist[i].text,
                subpath: '[' + JSON.stringify('/' + file_list[x]) + ']',
                topath: path,
                type: 'unzip',
                channel: 'chunlei',
                web: 1,
                app_id: '250528',
                clienttype: 0,
                passwd: '',
                bdstoken: yunData.MYBDSTOKEN
            };
            baidu_tips.show({
            mode: "loading",
            msg: `正在解压第${i + 1}个压缩包中的第${x + 1}个文件,共${filelist.length}个压缩文件`,
            autoClose: !1
        });

            await ajax('GET', url_copy, optionb).then(data => {
                if (data['errno'] == 0) {
                    taskidno = data['taskid']
                } else {
                    console.log('errno' + data['errno'])


                }

            });//发送解压命令
            let optionc = {
                channel: 'chunlei',
                taskid: taskidno,
                web: 1,
                app_id: '250528',
                clienttype: 0,
                bdstoken: yunData.MYBDSTOKEN
            };


            for (var y = 0; y < 5; y++) {
                let response = [];
                await ajax('GET', url_task, optionc).then(data => {
                    response = data;
                });//判断文件是否解压成功
                if (response['errno'] !== 0) {
                    status.push(0)
                    console.log('解压' + filelist[i].text + '/' + file_list[x] + '失败')
                    break;
                } else if (response['status'] == 'failed') {
                    status.push(0)
                    console.log('解压' + filelist[i].text + '/' + file_list[x] + '失败')
                    break;
                } else if (response['status'] == 'success') {
                    break;
                } else if (y == 2) {
                    status.push(0)
                    console.log('解压' + filelist[i].text + '/' + file_list[x] + '超时')
                    break;
                }


            }


        }
        if (status.length == 0) {
            let optiond = {
                channel: 'chunlei',
                web: 1,
                bdstoken: yunData.MYBDSTOKEN,
                app_id: '250528',
                clienttype: 0,
                opera: 'delete',
                async: 2,
                onnest: 'fail'

            };
            let postdata = {
                filelist: '[' + JSON.stringify(path + filelist[i].text) + ']'

            };
            let url = url_delete + $.param(optiond);
            await ajax('POST', url, postdata)//删除已解压文件
        }


    }
    window.yunHeader.tools.ui.tip.show({
        msg: `全部解压命令发送完成,正在刷新页面……`,
        type: 'success'
    });
    setTimeout(function () {
       location.reload(true);
    }, 4000);


}


function ajax(method, url, option) {
    return new Promise((resolve, reject) => {
        $.ajax(url, {
            data: option,
            type: method,
            datatype: "json",
            success: function (data) {
                setTimeout(function () {
                    resolve(data);
                }, 2000);
            }
        });
    });
}
    // Your code here...
})();