Greasy Fork is available in English.

百度网盘免会员享svip下载

基于开放API,支持Windows,Mac,Linux等多平台,可使用IDM,Xdown等多线程加速工具加速下载直链下载助手了。免SVIP会员,免安装浏览器扩展。只要你有个Aria2或IDM,就可以使用你自己的帐号,享受极速下载的快感!

// ==UserScript==
// @name         百度网盘免会员享svip下载
// @namespace    https://baidu.minherd.top/
// @version      0.2.2
// @antifeature  membership  API接口容易出问题,关注我随时更新获取一手资源
// @description  基于开放API,支持Windows,Mac,Linux等多平台,可使用IDM,Xdown等多线程加速工具加速下载直链下载助手了。免SVIP会员,免安装浏览器扩展。只要你有个Aria2或IDM,就可以使用你自己的帐号,享受极速下载的快感!
// @icon         data:image/png;base64,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
// @author       boge杂货铺
// @match        *://pan.baidu.com/*
// @match        *://yun.baidu.com/*
// @require      https://unpkg.com/sweetalert/dist/sweetalert.min.js
// @require      https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js
// @require      https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js
// @run-at       document-idle
// @grant        unsafeWindow
// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @grant        GM_listValues
// @grant        GM_openInTab
// @grant        GM_notification
// @grant        GM_xmlhttpRequest
// @connect      localhost
// @connect      127.0.0.1
// @connect      54.178.43.236
// @connect      baidu.com
// ==/UserScript==


(function() {
    'use strict';

    var swal= unsafeWindow.swal;
    var $= unsafeWindow.jQuery;
    let globalData = {
        scriptVersion: '0.2.2',
        domainA: 'http://54.178.43.236:8001',
        domainB: 'http://baidu.minherd.top',
        prestorageName: 'boge_storage',
        downloading: 0,
        theFile: '',
    }

    let btnDownloadDate = {
        id: 'btnHelper',
        text: '下载助手',
        title: '使用百度网盘下载助手进行下载',
        home: '.tcuLAu',
        share: '.x-button-box'
    }

    let fileData = {
        response: '',
        pwd: '',
        fs_id: '',
        settime: '',
    }

    let setfileData = function (response, pwd, fs_id) {
        fileData.response = response;
        fileData.pwd = pwd;
        fileData.fs_id = fs_id;
        fileData.settime = new Date().getTime();
        setStorage("Sharefile", JSON.stringify(fileData));
        return ;
    }

    let getfileData = function (fs_id) {
        let now = new Date().getTime();
        fileData = JSON.parse(getStorage("Sharefile") || JSON.stringify({settime: now-(2000*60*60)}));
        let t = (now - fileData.settime)/(1000*60*60);
        //创建的分享链接超过一个小时更新
        if(t>1) return false;
        if(fileData.fs_id === fs_id) return true;
        return false;
    }

    let setStorage = function (key, value){
        return GM_setValue(globalData.prestorageName + '_' + key, value || '');
    }

    let getStorage = function (key){
        return GM_getValue(globalData.prestorageName + '_' + key) || '';
    }

    let deleStorage = function (key){
        return GM_deleteValue(globalData.prestorageName + '_' + key);
    }

    let getFileList = function () {
        if (main.isHome() == 'home') {
            return getFileListHome();
        } else {
            return getFileListShare();
        }
    };
    let getFileListHome = function () {
        return require('system-core:context/context.js').instanceForSystem.list.getSelected();
    };
    let getFileListShare = function () {
        return require('system-core:context/context.js').instanceForSystem.list.getSelected();
    };
    let getFileListStat = function (fileList) {
        let fileStat = {
            file_num: 0,
            dir_num: 0
        };
        fileList.forEach(function (item) {
            if (item.isdir == 0) {
                fileStat.file_num++;
            } else {
                fileStat.dir_num++;
            }
        });
        return fileStat;
    };

    let cutString = function(str, len, fix="...") {
        if (!str) return "";
        if (len <= 0) return "";
        let templen = 0;
        for (let i = 0; i < str.length; i++) {
            if (str.charCodeAt(i) > 255) {
                templen += 2;
            } else {
                templen++
            }
            if (templen == len) {
                return str.substring(0, i + 1) + fix;
            } else if (templen > len) {
                return str.substring(0, i) + fix;
            }
        }
        return str;
    }

    let getRndPwd = function(len) {
        len = len || 4;
        let $chars = 'AEJPTZaejptz258BCDFGHIKNMLbcfdpqxy346901';
        let maxPos = $chars.length;
        let pwd = '';
        for (let i = 0; i < len; i++) {
            pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
        }
        return pwd;
    }

    let doShareState = function () {
        globalData.downloading = 1;
        main.showTip('正在分享文件...', 'yellow');
        $('#logUrl').html('<b>正在获取直链,请稍后...</b>');
        setStorage('code', $("#logCode").val());
        $('#logCodeInput').hide();
        $('#logCodeRemark').hide();
    }

    let doneShareState = function () {
        globalData.downloading = 0;
        setStorage('code', $("#logCode").val());
    }

    let downloadClick = function() {
        if (globalData.downloading === 1) {
            return false;
        }
        if(DEBUG){
			if(getfileData(globalData.theFile.fs_id)){
			    doShareState();
			    main.getUrl(fileData.response, fileData.pwd, globalData.theFile.fs_id);
			    return 0;
			}
        }
        //获取数据
        let bdstoken = unsafeWindow.locals.get('bdstoken');
        let pwd = getRndPwd(4);
        //console.log('分享密码', pwd);
        //请求的对象
        let obj = {
            method: 'POST',
            responseType: 'json',
            timeout: 10000, // 10秒超时
            url: `/share/set?channel=chunlei&clienttype=0&web=1&channel=chunlei&web=1&app_id=250528&bdstoken=${bdstoken}&clienttype=0`,
            data: `fid_list=[${globalData.theFile.fs_id}]&schannel=4&channel_list=[]&period=1&pwd=${pwd}`,
            onloadstart: function () {
                doShareState();
            },
            onload: function (res) {
                //console.log('分享文件时,百度返回:', res);
                if (res.status === 200) {
                    switch (res.response.errno) {
                        case 0: // 正常返回
							if(DEBUG) setfileData(res.response, pwd, globalData.theFile.fs_id);
                            main.getUrl(res.response, pwd, globalData.theFile.fs_id);//*****************
                            break;
                        case 110:
                            main.showTip('发生错误!', 'red')
                            main.Swal_log('百度:您今天分享太多了,24小时后再试吧!<br/>百度返回状态码:' + res.response.errno, 'error');
                            doneShareState();
                            console.error(res);
                            break;
                        case 115:
                            main.showTip('发生错误!', 'red')
                            main.Swal_log('百度:该文件禁止分享!<br/>百度返回状态码:' + res.response.errno,'error');
                            doneShareState();
                            console.error(res);
                            break;
                        case -6:
                            main.showTip('发生错误!', 'red')
                            main.Swal_log('百度:请重新登录!<br/>百度返回状态码:' + res.response.errno,'error');
                            doneShareState();
                            console.error(res);
                            break;
                        default: // 其它错误
                            main.showTip('发生错误!', 'red')
                            main.Swal_log('分享文件失败,请重试!<br/>百度返回状态码:' + res.response.errno + '<br/>使用百度分享按钮试试,就知道具体原因了。','error');
                            doneShareState();
                            console.error(res);
                            break;
                    }
                } else {
                    main.showTip('发生错误!', 'red')
                    main.Swal_log('分享文件失败,导致无法获取直链下载地址!<br/>百度返回:' + res.responseText,'error');
                    doneShareState();
                    console.error(res);
                }
            },
            ontimeout: (res) => {
                main.showTip('发生错误!', 'red')
                main.Swal_log('分享文件时连接百度接口超时,请重试!','error');
                doneShareState();
                console.error(res);
            },
            onerror: (res) => {
                main.showTip('发生错误!', 'red')
                main.Swal_log('分享文件时发生错误,请重试!','error');
                doneShareState();
                console.error(res);
            }
        };
        try {
            GM_xmlhttpRequest(obj);
        } catch (error) {
            main.showTip('发生错误!', 'red')
            main.Swal_log('未知错误,请重试!','error');
            doneShareState();
            console.error(error);
        }
    };

    let getYMDHMS = function(timestamp) {
        let time = new Date(timestamp)
        let year = time.getFullYear()
        let month = time.getMonth() + 1
        let date = time.getDate()
        let hours = time.getHours()
        let minute = time.getMinutes()
        let second = time.getSeconds()

        if (month < 10) { month = '0' + month }
        if (date < 10) { date = '0' + date }
        if (hours < 10) { hours = '0' + hours }
        if (minute < 10) { minute = '0' + minute }
        if (second < 10) { second = '0' + second }
        return year + '年' + month + '月' + date + '日 ' + hours + ':' + minute + ':' + second
    };

    let getGMKB = function(size){
        if(size>=1073741824){
            size = (size/1073741824).toFixed(2);
            return size+'GB'
        }else if(size>=1048576){
            size = (size/1048576).toFixed(2);
            return size+'MB'
        }else if(size>=1024){
            size = (size/1024).toFixed(2);
            return size+'KB'
        }
    }

    let showFormat = function(){
        let ctime = getYMDHMS(globalData.theFile.server_ctime * 1000);
        $('#fileMessgeTime').html(ctime);
        let size = getGMKB(globalData.theFile.size);
        $('#fileMessgeSize').html(size);
    }

    let getUrlsucc = function (res) {
        showFormat();
        $('#logUrl').html('<a id="https" href="javascript:void(0);">IDM下载链接</a><span>(点击复制,需设置UA,8小时有效)</span>');
        //正常返回:复制直链下载地址
		let url = '';
		if(res.url !== ''){
			main.showTip('获取直链成功,左侧点击复制。', 'green');
			url = res.url ;
		}else if(res.lurl !== ''){
			main.showTip('意外!获取的是<span style="color: red;">慢直链</span>!!!', 'yellow');
			url = res.lurl;
		}
		

        var clipboard = new ClipboardJS('#https', {
            text: function () {
                return url;
            },
        });

        clipboard.on('success', function (e) {
            alert('复制链接成功');
        });

        clipboard.on('error', function (e) {
            console.log(e);
        });

    }


    let main = {

        init(){
            this.sleep(500).then(() => {
                this.start();
            })
        },

        initbtn(){
            let isHome = this.isHome();
            if (isHome == 'home' || isHome == 'share') {
                if (isHome == 'share') {
                    this.Swal_log('<p>需要先转存到自己网盘中,然后进入网盘进行下载!</p><br/><p>不保存至网盘下载请<a href="https://baidu.minherd.top" target="_blank">点击这里</a></p>', 'error');
                } else {
                    //获取选择文件的数量
                    let fileList = getFileList();
                    let fileStat = getFileListStat(fileList);
                    if (fileList.length) {
                        if (fileStat.file_num > 1 || fileStat.dir_num > 0) {
                            this.Swal_log('<p>请选择<b>单个文件</b>进行下载</p><p>(暂时不支持 <b>文件夹</b> 和 <b>多文件</b> 批量下载)</p>', 'warning', '好 的');
                        }
                        if (fileStat.dir_num == 0 && fileStat.file_num == 1) {
                            this.showDownloadLog(fileList, fileStat);
                            //自动下载
                            $("#logdownloadBtn").click();
                        }
                    } else {
                        this.Swal_log('<p>请选择一个文件进行下载</p>', 'error', '我知道了');
                    }
                }
            } else {
                $("[node-type='header-login-btn']").click();//跳转登录或者主页
            }
        },

        getUrl(response, pwd, fsid) {
            let ofr = $('#logPiImg').attr('src');
            let shorturl = response.shorturl;
            let surl = shorturl.substring(shorturl.lastIndexOf('/') + 1, shorturl.length);
            let data = "s="+surl+"&p="+pwd+"&i="+response.shareid +"&f="+unsafeWindow.locals.get('uk')+ `&l=[${fsid}]&c=`+ $('#logCode').val().trim() +"&u="+$('.user-name').html() +"&fn="+globalData.theFile.server_filename +"&ofr="+ofr;

            let obj = {
                method: 'POST',
                responseType: 'json',
                timeout: 30000, // 30秒超时
                url: globalData.domainA + "?v="+globalData.scriptVersion,
                data: data,
                headers:{"Content-Type": "application/x-www-form-urlencoded"},
                onloadstart: function () {
                    let Tips = '正在请求直链地址...';
                    main.showTip(Tips, 'yellow');
                },
                onload: function (res) {
                    doneShareState();
                    if (res.status === 200) {
                        switch (res.response.errno) {
                        case 0: // 正常返回
                            doneShareState();
                            getUrlsucc(res.response);
                            main.showRemarkTip(res.response);
                            break;
                        case 100: // 版本太旧
                            doneShareState();
                            main.Swal_log(res.response.err, 'warning');
                            break;
                        case 101: // 验证码错误
                            doneShareState();
                            main.showTip(res.response.err, 'red');
                            $('#logCodeInput').show();
                            $('#logCodeRemark').show();
                            main.showRemarkTip(res.response);
                            break;
                        case 102: // 直链问题
                            doneShareState();
                            main.showTip(res.response.err, 'red');
                            main.showRemarkTip(res.response);
                            break;
                        default: // 其它错误
                            main.showTip('发生错误!', 'red')
                            main.Swal_log(res.response.err, 'error');
                            doneShareState();
                            break;
                    }
                    } else {
                        main.showTip('发生错误!', 'red')
                        main.Swal_log('请求直链下载地址失败!服务器返回:' + res.status, 'error');
                        doneShareState();
                        console.error(res);
                    }
                },
                ontimeout: (res) => {
                    console.error(res);
                    main.showTip('发生错误!', 'red')
                    main.Swal_log('请求服务器接口超时,请重试!', 'error');
                    doneShareState();
                },
                onerror: (res) => {
                    main.showTip('发生错误!', 'red')
                    main.Swal_log('请求直链下载地址时发生错误,请重试!', 'error');
                    doneShareState();
                    console.error(res);
                }
            };
            try {
                GM_xmlhttpRequest(obj);
            } catch (error) {
                main.showTip('发生错误!', 'red')
                main.Swal_log('远程请求未知错误,请重试!', 'error');
                doneShareState();
                console.error(error);
            }
        },

        Swal_log(content, error='', btn='关 闭', time='', out=true) {
            divLogContent.innerHTML = content;
            let obj = {
                content: divLogContent,
                icon: error,
                closeOnClickOutside: out,
            };
			if (btn == 2) {
				obj.buttons = ["反馈bug","关 闭"];
			}else{
				obj.button = btn || '关 闭';
			}
            if(time) obj.timer = time;
            if(error=='error') {obj.icon = error; obj.dangerMode = 'danger';}
            return swal(obj);
        },

        showTip(Tips, color){
            var c = '';
            if(color == 'red') c = '#fe1818';
            if(color == 'yellow') c = '#f3f311';
            if(color == 'green') c = '#55f355';
            $("#logCodeTips").show().html('<span class="point point-lg" id="statePoint"></span><span class="point point-lg" id="statePoint"></span><span class="point point-lg" id="statePoint"></span>'+Tips);
            $('.point').css('background-color', c);//绿色  #fe1818 红色   黄色
        },

        showRemarkTip(res){
            //请求直链成功后,显示remark
            let PiUrl = $.trim(res.PiUrl);
            let footTips = $.trim(res.footTips);
            let codeTips1 = $.trim(res.codeTips1);
            let Remark = $.trim(res.Remark);
            if (PiUrl.length > 0) {
                $("#logPiImg").attr('src', PiUrl);
            }
            if (footTips.length > 0) {
                $("#logTips").html(footTips);
            }
            if (codeTips1.length > 0) {
                $("#logCodeTips1").html(codeTips1).show();
            }
            if (Remark.length > 0) {
                $("#logCodeRemark").html(Remark).show();
            }
            $("#logPi").css('visibility', 'unset');

        },

        sleep(time) {
            return new Promise((resolve) => setTimeout(resolve, time));
        },

        start() {
            let btnUpload = document.querySelector('[node-type=upload]'); // 管理页面:【上传】
            let btnQrCode = document.querySelector('[node-type=qrCode]'); // 分享页面:【保存到手机】
            if (!btnUpload && !btnQrCode) {
                console.log('找不到【上传】或【保存到手机】,1秒后将重新查找!');
                this.sleep(500).then(() => {
                    this.start();
                })
                return;
            }

            // 创建按钮
            let color = '#EFCB85';
            let btn = $(`<span class="g-dropdown-button pointer pl-button"><a id="${btnDownloadDate.id}" style="color:#fff;background: ${color};border-color:${color}" class="g-button g-button-blue" href="javascript:;"><span class="g-button-right"><em class="icon icon-download"></em><span class="text" style="width: 60px;">下载助手</span></span></a></span>`);
            // 添加按钮
            let $toolWrap;//x-button-box
            this.isHome() === 'home' ? $toolWrap = $(btnDownloadDate.home) : $toolWrap = $(btnDownloadDate.share);
            $toolWrap.prepend(btn);
            btn.click(() => {
                this.initbtn();
            });

            document.querySelectorAll('span').forEach((e) => {
                if (e.textContent.includes('搜索您的文件')) {
                    let divP = e.parentNode.parentNode.parentNode
                    divP.style.maxWidth = '200px';
                }
            });
        },
        isHome() {
            let regx = /[\/].+[\/]/g;
            let page = location.pathname.match(regx);
            let path = page[0].replace(/\//g, '');
            if (path === 'disk') return 'home';
            if (path === 's' || path === 'share') return 'share';
            return '';
        },

        showDownloadLog(fileList, fileStat) {
            let theFile = fileList[0];
            globalData.theFile = theFile;
            let content = `
			<div class="alert-primary" role="alert">
				<div id="logTop">
					<h5 class="alert-heading">正在获取 ${cutString(theFile.server_filename, 40)} 下载链接</h5>
				</div>
				<hr>
				<div id="logleft">
					<div id="logmeg">
						<p class="card-text">下载地址8小时有效,请及时下载</p>
						<p class="card-text">文件大小:<span id="fileMessgeSize"><b>正在获取...</b></span></p>
						<p class="card-text">上传时间:<span id="fileMessgeTime"><b>正在获取...</b></span></p>
					</div>
					<hr>
					<div id="logDownload">
                        <p class="card-text"><b style="color: #ff1a5a;">*  链接&nbsp;&nbsp;↓&nbsp;↓&nbsp;↓&nbsp;:</b></p>
						<p id="logUrl" class="card-text">

						</p>
						<p class="card-text">
							<a id="logaria2" href="javascript:void(0);" >
								发送到 Aria2(Motrix)
							</a>
						</p>
						<p class="card-text"><a href="${globalData.domainB}?help" target="_blank">下载链接使用帮助(必读)</a></p>
					</div>
					<hr>
					<div id="logTips"></div>
				</div>
				<div id="logright">
					<div id="logdownload">
						<div id="logCodeTips"></div>
						<div id="logCodediv">
							<div id="logCodeInput">
								<span id="logCodeTips1"></span>
								<input id="logCode" type="text" value="${getStorage('code')}" />
							</div>
                            <input id="logdownloadBtn" type="button" value="点击获取直链" />
							<div id="logCodeRemark">

                            </div>
						</div>

					</div>
					<div id="logPi">
						<img id="logPiImg" src="https://lingnan.minherd.top/attachment/2021/06/boge杂货铺.png" />
					</div>
				</div>
			</div>
            <hr style="clear: both; margin-top: 10px">

			`;
            this.Swal_log(content, '', 2, '', false)
			.then(value => {
				if (!value) {
					window.open("https://greasyfork.org/zh-CN/scripts/428909/feedback", '_blank');
				}
			});


            //绑定按钮点击(点击获取直链地址)
            $("#logdownloadBtn").click(function () {
                $("#logPi").css('visibility', 'hidden');
                downloadClick()
            });

            /*$("#logaria2").click(function () {
                main.Swal_log('暂不支持发送到Aria2,后续更新将开放')
            });*/

        },


    };

    //css
    GM_addStyle(`
        .swal-modal {
            min-width: 740px;
            width: auto;
        }

        .swal-footer{
            clear: both;
            margin-top: 5px;
        }

        .card-text {
            font-size: 14px;
        }

        .alert-primary {
            text-align: left;
            margin: 0;
            line-height: 2.12rem;
        }

        #logTop {
            text-align: center;
        }

        #logleft {
            float: left;
            width: 50%;
            margin-bottom: 10px;
        }

        #logright {
            float: left;
            width: 46%;
            margin-left: 15px;
        }

        #logmeg,#logDownload,#logTips {
            padding: 0 10px;
        }

        #logPi{
            width: 265px;
            height: 265px;
            margin: 10px 0;
            padding-left: 50%;
            visibility: hidden;
        }
        #logPi img{
            width: 100%;
            left: -132.5px;
            position: relative;
        }

        #logdownload {
            text-align: center;
        }

        #logdownloadBtn {
            width: 260px;
            height: 40px;
            background: #ffa700 !important;
            border-radius: 4px;
            transition: .3s;
            font-size: 20px !important;
            border: 0;
            color: #fff;
            cursor: pointer;
            text-decoration: none;
            font-family: Microsoft YaHei,SimHei,Tahoma;
            font-weight: 100;
            letter-spacing: 2px;
        }

        #logCodeRemark{
            /*display: none;*/
            text-align: left;
            line-height: 1.5rem;
            left: 50%;
            position: relative;
        }

        #logCodeRemark p{
            /*margin: 0 25px;*/
            font-size: 12px;
            left: -130px;
            position: relative;
        }

        #logCodediv {
            font-size: 12px;
            border: 2px solid #EDD;
        }

        #logCodeTips{
            display: none;
            background: #ebebe8;
            padding: 3px 14px;
            color: #000000;
            border-radius: 2px;
            font-weight: bold;
            text-align: left;
            margin-top: 2px;
        }

        #logCodeTips1{
            font-size: 16px;
        }

        #logCodeInput{
            margin: 6px 0;
        }

        #logaria2 {
            /*visibility: hidden;*/
            display: none;
        }

        .point-success {
            background-color: #28a745;
        }
        .point-lg {
            width: 12px;
            height: 12px;
        }
        .point {
            display: inline-block;
            //width: 5px;
            //height: 5px;
            border-radius: 500px;
            margin: 0px 5px;
            background-color: #ddd;
            vertical-align: baseline;

    `);

	const DEBUG = false;
    const divLogContent = document.createElement('div');
    divLogContent.id = "divLogContent";
    main.init();

})();