Greasy Fork

mp4ba百度网盘一键保存

自动检测 mp4ba 百度网盘分享链接,一键保存

目前为 2020-05-28 提交的版本。查看 最新版本

// ==UserScript==
// @name         mp4ba百度网盘一键保存
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  自动检测 mp4ba 百度网盘分享链接,一键保存
// @author       zsandianv
// @match        http://www.mp4ba.cc/*
// @match        http://mp4ba.cc/*
// @match        https://pan.baidu.com/share/*
// @match        https://pan.baidu.com/s/*
// @match        http://23.225.57.26:89/*
// @grant        GM_xmlhttpRequest
// @require      https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/Minified/notiflix-2.1.3.min.js
// @connect      pan.baidu.com
// ==/UserScript==

(function() {
    'use strict';
    let domparser = new DOMParser();
    let path = '/';//请自行修改

    async function verifypwd ( url , pwd ) {
        let responsedata = [];
        let surl;
        let doc;
        console.log(5)
        await ajax( 'GET', url,'' , )
            .then( response => {
            responsedata = response;
            console.log( responsedata )
        } );
        doc = domparser.parseFromString( responsedata.responseText, "text/html" );
        if ( responsedata.status === 200 ){
            surl = responsedata.finalUrl.split('=')[1];
            let r = /yunData.setData\((.*?)\)/;
            r.exec( responsedata.responseText );
            let yunData = JSON.parse( RegExp.$1 );
            let queryData = {
                surl: surl ,
                t: (new Date()).valueOf() ,
                channel: 'chunlei' ,
                web: 1 ,
                app_id: '250528' ,
                bdstoken: yunData.bdstoken ,
                clienttype:0
            }
            let headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                'Referer': responsedata.finalUrl
            }
            let postData = 'pwd=' + pwd + '&vcode=&vcode_str=';
            let verifyurl = 'https://pan.baidu.com/share/verify?' + $.param(queryData);
            await ajax( 'POST', verifyurl , postData , headers )
                .then( response => {
                responsedata = response;
                console.log( responsedata )
            } );
            if ( JSON.parse( responsedata.responseText ).errno === 0 ) {
                saveFile ( url )
            } else{
                Notiflix.Notify.Failure('提取码验证失败')
            }
        }
    }

    async function checkUrl ( ) {
        console.log(1)

        let responsedata = [];
        let doc;
        let url;
        let pwd;
        let dow_con = $('div.btn-group.cloud');
        for (var i = 0; i < dow_con.length; i++) {
            if ( dow_con[i].children.length === 1 ){
                let btnToolHTML = '<a href="javascript:;" target="_self" class="btn btn-default btnbd">没有分享链接</a>'
                Notiflix.Notify.Failure('没有分享链接')
                $(btnToolHTML).appendTo('div.btn-group.cloud:first')
                continue;
            }
            else{
                if ( i === 0 ){
                    url = $('div.btn-group.cloud:first')[0].children[0].href;
                    pwd = $('div.btn-group.cloud:first')[0].children[1].innerText.split(':')[1];
                } else {
                    url = $('div.btn-group.cloud:last')[0].children[0].href;
                    pwd = $('div.btn-group.cloud:last')[0].children[1].innerText.split(':')[1];
                }
            }
            await ajax( 'GET', url,'' , )
                .then( response => {
                responsedata = response;
                console.log( responsedata )
            } );
            doc = domparser.parseFromString( responsedata.responseText, "text/html" );
            if ( responsedata.status === 200 ){
                if ( responsedata.finalUrl === url ){
                    if (doc.getElementsByClassName("error-img").length !== 0 ){
                        console.log(2)
                        Notiflix.Notify.Failure('链接已失效')
                        let btnToolHTML = '<a href="javascript:;" target="_self" class="btn btn-default btnbd">链接已失效</a>'
                        if ( i === 0){
                            $(btnToolHTML).appendTo('div.btn-group.cloud:first')
                        } else{
                            $(btnToolHTML).appendTo('div.btn-group.cloud:last')
                        }
                        continue;
                    }
                    else {
                        console.log(3)
                        Notiflix.Notify.Success('链接有效')
                        let btnToolHTML = '<a href="javascript:;" target="_blank" class="btn btn-default btnbd">一键保存</a>'
                        if ( i === 0){
                            $(btnToolHTML).appendTo('div.btn-group.cloud:first').click(function () {
                                Notiflix.Notify.Warning('正在保存,请稍后...');
                                saveFile ( url );
                                return false;
                            });
                        } else{
                            $(btnToolHTML).appendTo('div.btn-group.cloud:last').click(function () {
                                Notiflix.Notify.Warning('正在保存,请稍后...');
                                saveFile ( url );
                                return false;
                            });
                        }
                    }
                }
                else if ( responsedata.finalUrl.indexOf("surl") !== -1 ){
                    console.log(4)
                    Notiflix.Notify.Success('链接有效')
                    let btnToolHTML = '<a href="javascript:;" target="_blank" class="btn btn-default btnbd">一键保存</a>'
                    if ( i === 0){
                        $(btnToolHTML).appendTo('div.btn-group.cloud:first').click(function () {
                            Notiflix.Notify.Warning('正在保存,请稍后...');
                            verifypwd ( url , pwd);
                            return false;
                        });
                    } else{
                        $(btnToolHTML).appendTo('div.btn-group.cloud:last').click(function () {
                            Notiflix.Notify.Warning('正在保存,请稍后...');
                            verifypwd ( url , pwd);
                            return false;
                        });
                    }
                }
                else {
                    let btnToolHTML = '<a href="javascript:;" target="_self" class="btn btn-default btnbd">未知错误</a>'
                    Notiflix.Notify.Failure('未知错误')
                    if ( i === 0){
                        $(btnToolHTML).appendTo('div.btn-group.cloud:first')
                    } else{
                        $(btnToolHTML).appendTo('div.btn-group.cloud:last')
                    }
                }
            }
        }
    }

    async function saveFile ( url ) {
        console.log(6)
        Notiflix.Notify.Warning('正在保存,请稍后...');
        let responsedata = [];
        let surl;
        let doc;
        let params = [];
        let fsidlist = [];
        await ajax( 'GET', url,'' , )
            .then( response => {
            responsedata = response;
            console.log( responsedata )
        } );
        doc = domparser.parseFromString( responsedata.responseText, "text/html" );
        let r = /yunData.setData\((.*?)\)/;
        r.exec( responsedata.responseText );
        let yunData = JSON.parse( RegExp.$1 );
        let queryData = {
            shareid: yunData.shareid ,
            from: yunData.uk ,
            channel: 'chunlei' ,
            web: 1 ,
            app_id: '250528' ,
            bdstoken: yunData.bdstoken,
            clienttype: 0
        }
        if (yunData['file_list']['list']){
            $.each(yunData['file_list']['list'], function (index, element) {
                fsidlist.push(element.fs_id)
            });
        }
        let option = {
            fsidlist: '[' + fsidlist.toString() + ']' ,
            path: path
        }
        let headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Referer': url
        }
        let saveApi = 'https://pan.baidu.com/share/transfer?' + $.param(queryData);
        for ( let k in option ) params.push( `${encodeURIComponent(k)}=${encodeURIComponent(option[k])}` );
        let postData = params.join( '&' );
        await ajax( 'POST', saveApi , postData , headers )
            .then( response => {
            responsedata = response;
            console.log( responsedata )
        } );
        let data = JSON.parse( responsedata.responseText );
        if ( data.errno === 0 ) {
            Notiflix.Notify.Success('保存成功')
        }
        else if ( data.errno === 12 ){
            for (let i = 0; i < data.info.length; i++) {
                if ( data.info[i].errno === -30 ){
                    Notiflix.Notify.Failure('文件已存在')
                }
                else {
                    Notiflix.Notify.Failure('保存失败,请手动保存')
                }
            }
        }
        else {
            Notiflix.Notify.Failure('保存失败,请手动保存')
        }
    }

    function tips (){
        let head = document.getElementsByTagName("head")[0];
        let link = document.createElement("link");
        link.rel = "stylesheet";
        link.type = "text/css";
        link.href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/Minified/notiflix-2.1.3.min.css";
        head.appendChild(link);
        let script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/Minified/notiflix-2.1.3.min.js";
        head.appendChild(script);

        Notiflix.Notify.Init({fontSize:"18px",timeout:3000,showOnlyTheLastOne:true});
        Notiflix.Report.Init();
        Notiflix.Confirm.Init();
        Notiflix.Loading.Init({svgColor:"#f60000",});
    }

    async function checkSite ( ) {
        tips ()
        if ( document.querySelector( 'a.btn.btn-default.btnbd') !== null ){
            checkUrl ( )
        }
        else if ( document.querySelector( 'a.g-button.g-button-blue') !== null ){
            await saveFile ( window.location.href )
        }
        else if ( document.querySelector( 'div.error-img') !== null ){
            Notiflix.Notify.Failure('链接失效')
        }
        else if ( document.querySelector( 'div.verify-form') !== null ){
            Notiflix.Notify.Failure('请输入提取码')
        }
    }

    checkSite ( )

    function ajax ( Method, Url, Data, Headers ) {
        return new Promise( ( resolve, reject ) => {
            GM_xmlhttpRequest( {
                url: Url,
                method: Method,
                data: Data,
                headers: Headers,
                onload: function ( response ) {
                    resolve( response );
                }
            } );
        } );
    }


    // Your code here...
})();