115AV Helper

本脚本将在免登录115的状态下,在AVMOO、JAVBUS等片库网站中基于115实现一些额外功能(前提当然是你要有会员啦)

// ==UserScript==
// @name         115AV Helper
// @author       kyay006
// @namespace    http://tampermonkey.net/
// @version      1.6
// @description  本脚本将在免登录115的状态下,在AVMOO、JAVBUS等片库网站中基于115实现一些额外功能(前提当然是你要有会员啦)
// @description  理论上只要页面看起来跟AVMOO、JAVBUS像,脚本就支持该网站,只需自行在下方参照格式添加一条match即可
// @match        http*://avmask.com/*
// @match        http*://avmoo.com/*
// @match        http*://avsox.asia/*
// @match        http*://www.javbus.com/*
// @match        http*://www.dmmbus.us/*
// @match        http*://www.dmmbus.work/*
// @match        http*://www.dmmsee.work/*
// @match        http*://www.busjav.us/*
// @match        http*://www.buscdn.work/*
// @match        http*://www.busdmm.work/*
// @match        http*://www.seedmm.us/*
// @match        http*://www.seedmm.in/*
// @match        http*://www.cdnbus.work/*
// @match        http*://www.cdnbus.icu/*
// @domain     115.com
// @domain     btos.pw
// @require      https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js
// @grant         GM_registerMenuCommand
// @grant         GM_xmlhttpRequest
// @grant         GM_notification
// @grant         GM_addStyle
// ==/UserScript==

(function() {
    var cookie = "";//★★★使用前请先在双引号中填入你的115 Cookie★★★

    var code,json;
    var site = {};
    var sites = {
        btspread:{
            result:[],//存放搜索结果
            getUrl:function (code){
                var url = "https://btsow.club/search/";
                return url + code;
            },
            matchResult:function (data){
                var magnet,name,date,size;
                var result;
                var nodes_regExp = /\<div class\=\"row\"\>([\s\S]*?)\<\/a\>/g;
                var node_regExp = /href\=\".*\/(\w+)\"\stitle\=\"(.*)\"[\s\S]*?Size\:([0-9KGMB.]+).*Date\:([0-9\-]+)/;
                var links = data.responseText.match(nodes_regExp);
                links.pop();//最后一个不是,去除
                if(links.length){
                    $.each(links,function(key,val){
                        result = val.match(node_regExp);
                        magnet = result[1];
                        name = result[2];
                        date = result[3];
                        size = result[4];
                        site.result.push(new Result(magnet,name,date,size));
                    })
                }
            }
        },
/*       bthaha:{
            getUrl:function(code){
                var url = "https://bthaha.men/search/";
                return url + code;
            },
            matchResult:function(data){
                var i,url,magnet,name,date,size;
                var results = new Array();
                var links = $(data.responseText).find("a.title");
                if(!$.isEmptyObject(links)){
                    $.each(links,function(key,val){
                        url = "https://bthaha.men/" + $(val).attr("href");
                        httpGet(url,function(){

                        })
                        results.push(new Result(magnet,name,date,size));
                    })
                }
            }
        },
        cltt:{
            result:[],
            getUrl:function (code){
                var url = "https://www.cltt13.xyz/search/";
                return url + code + "_ctime_1.html";
            },
            matchResult:function(data){
                var a,b,magnet,name,date,size;
                var results = new Array();
                var links = $(data.responseText).find('.panel-body');
                if(!$.isEmptyObject(links)){
                    $.each(links,function(key,val){
                        a = $(val).find('a');
                        magnet = a.attr('href').match(/\/(\w+).html/)[1];
                        name = a.text();
                        b = $(val).find('b');
                        date = b[0].innerText;
                        size = b[1].innerText;
                        site.result.push(new Result(magnet,name,date,size));
                    })
                }
            }
        } */
    }

    var URL_USER_INFO = "https://webapi.115.com/files/index_info";
    var URL_SEARCH = "https://webapi.115.com/files/search?cid=0&limit=50&search_value=";
    var URL_VIDEO = "http://115.com/api/video/m3u8/";
    var URL_BTSEARCH= "https://btspread.com/search/";
    var URL_ADDONETASK = "https://115.com/web/lixian/?ct=lixian&ac=add_task_url";
    var URL_ADDMULTITASK = "https://115.com/web/lixian/?ct=lixian&ac=add_task_urls";
    var URL_GETTASKLISTS = "https://115.com/web/lixian/?ct=lixian&ac=task_lists";

    if(urlMatch()){
        addMagnetSearch();
    }
    getCookieState();

    function getCookieState(){
        if(cookie == ""){
            msg("脚本中的Cookie为空\n请先在脚本中填写Cookie,否则将无法查询数据!");
        }else{
            httpGet(URL_USER_INFO,function(xhr){
                json = $.parseJSON(xhr.responseText);
                if(!json.state){
                    msg("脚本中的Cookie已过期,请重新填写!");
                }else{
                    if(urlMatch()){
                        setSingleEle($('div.container'));
                    }else{
                        $('a.movie-box').each(function(){
                            setMultiEles($(this));
                        })
                    }
                }
            })
        }
    }

    function urlMatch(){
        code = $('div.container').find("span[style='color:#CC0000;']").text();
        if(code === ""){
            return false;
        }else{
            return true;
        }
    }

    function setMultiEles(node){
        var title = node.find('div.photo-info span');
        code = title.find('date:first').text();
        searchVideo(code,function(pickcode){
            setTitleCss(title);
            addPlayBtn(pickcode,node.find('div.photo-frame'));
        })
    }

    function setSingleEle(node){
        searchVideo(code,function(pickcode){
            setTitleCss(node.find('h3:first'));
            addPlayBtn(pickcode,node.find('div.screencap'));
        })
    }

    function searchVideo(fanhao,callback){
        httpGet(URL_SEARCH + fanhao,function(xhr){
            json = $.parseJSON(xhr.responseText);
            if(!$.isEmptyObject(json.data)){
                callback(getVideo(json.data));
            }else{
                if(/\-/.test(fanhao)){
                    fanhao = fanhao.replace("-","_");
                    httpGet(URL_SEARCH + fanhao, function(xhr){
                        json = $.parseJSON(xhr.responseText);
                        if(!$.isEmptyObject(json.data)){
                            callback(getVideo(json.data));
                        }else{
                            fanhao = fanhao.replace("_","");
                            httpGet(URL_SEARCH + fanhao, function(xhr){
                                json = $.parseJSON(xhr.responseText);
                                if(!$.isEmptyObject(json.data)){
                                    callback(getVideo(json.data));
                                }
                            })
                        }
                    })
                }else{
                    fanhao = fanhao.replace("_","-");
                    httpGet(URL_SEARCH + fanhao, function(xhr){
                        json = $.parseJSON(xhr.responseText);
                        if(!$.isEmptyObject(json.data)){
                            callback(getVideo(json.data));
                        }
                    })
                }
            }
        })
    }

    function addPlayBtn(pickcode,node){
        node.append("<a class='play-box' href='javascript:;'><i class='play-ico'></i></a>");
        node.find('a.play-box').on('click',function(){
            startPlay(pickcode);
        })
    }

    function getVideo(data){
        var regExp = /avi|mp4|wmv|mkv/;
        for(var i=0;i<data.length;i++){
            if(!$.isEmptyObject(data[i].pc)){
                var name = data[i].ico;
                if(name){
                    if(name.search(regExp) >= 0){
                        return data[i].pc;
                    }
                }
            }
        }
    }

    function startPlay(pickcode){
        httpGet(URL_VIDEO + pickcode + ".m3u8",function(xhr){
            var arr = xhr.responseText.split("\n");
            arr.shift();
            arr.pop();
            var num,index,max = 0;
            for(var i=0;i<=arr.length - 2;i=i+2){
                num = Number(arr[i].match(/BANDWIDTH=(\d+)/)[1]);
                if(num == 3000000){
                    index = i;
                    break;
                }
                if(num > max){
                    index = i;
                    max = num;
                }
            }
            window.location.href = "potplayer://" + arr[index+1];
        })
    }

    function setTitleCss(ele){
        ele.css("font-weight","bold");
        ele.css("color","blue");
    }

    function httpGet(url,load,loadstart){
        GM_xmlhttpRequest({
            method:"GET",
            url:url,
            headers:{'Cookie':cookie},
            onloadstart: loadstart,
            onload:xhr => load(xhr)
        })
    }

    function httpPost(url,data,callback){
        GM_xmlhttpRequest({
            method:"POST",
            url:url,
            headers:{
                'Content-Type':'application/x-www-form-urlencoded',
                'Cookie':cookie
            },
            data:data,
            onload:xhr => callback(xhr)
        })
    }

    function msg(content){
        GM_notification(content,"油猴脚本\"115已有影片标记\"");
    }

    function msgBox(type,title,content){
        var node,box;
        //var heading = `<div class="panel-heading" style='font-size:16px'><b>`+ title +`</b></div>`;
        var heading = `<div class="msgbox-title"><span class="msgbox-close" onclick="$('#msgBox').remove()">×</span><b>`+ title +`</b></div>`;
        var body = `<div class="msgbox-body">`+ content +`</div>`;
        if(type == 0){
            box = `<div id="msgBox" class="msg-box msgbox-info"></div>`;
        }else{
            box = `<div id="msgBox" class="msg-box msgbox-danger"></div>`;
        }
        $('body').append(box);
        $('div.msg-box').append(heading);
        $('div.msg-box').append(body);
    }

    function addOffTask(text){
        if(confirm("确定添加到115离线吗?")){
            if(/\n/.test(text)){
                addMultiMagnet(text);
            }else{
                addOneMagnet(text);
            }
            $('#layer-bt').remove();
        }
    }

    function addOneMagnet(magnetLink){
        httpPost(URL_ADDONETASK,"url=" + magnetLink,function(xhr){
            json = $.parseJSON(xhr.responseText);
            if(json.state){
                alert("任务添加成功!\n刷新一下网页,如果标题变蓝,点击封面图即可播放\n如果没有,请30秒后再尝试,还是没有请换个磁链离线");
/*                 setInterval(function(){
                    getTaskStatus(magnetLink);
                },2000) */
            }else{
                alert(json.error_msg);
            }
        })
    }

    function addMultiMagnet(text){
        var err_task = new Array();
        var links = text.split('\n');
        for(var i = 0; i < links.length; i++){
            links[i] = "url[" + i + "]=" + links[i];
        }
        httpPost(URL_ADDMULTITASK,links.join("&"),function(xhr){
            json = $.parseJSON(xhr.responseText);
            if(json.state){
                $.each(json.result,function(key,val){
                    if(!val.state){
                        err_task.push(val);
                    }
                })
                if(err_task.length){
                    openErrTaskWindow(err_task);
                }else{
                    alert("所有任务添加成功!");
                }
            }else{
                alert(json.error_msg);
            }
        })
    }

    function addMagnetSearch(){
        var node = (`
            <h4>磁力链接——数据来源:<select id='bt-sites' disabled></select></h4>
            <div id='data-list' class='panel panel-default'>
                <div class="panel-heading">
                    <div class="panel-title">
                        <span>搜索结果</span>
                    </div>
                </div>
                <div class="panel-body">
                </div>
            </div>
        `);
        $('div#movie-share').remove()//删除分享节点
        $('div.container .row.movie').after(node);
        $('#bt-sites').on('change',function(){
            getMagnet(code);
        });
        loadBTSites();
        getMagnet(code);
    }

    function addSearchResult(){
        var node = $('div#data-list');
        var list =node.find('div.panel-body');
        $('select#bt-sites').removeAttr("disabled");
        list.find('span').remove();//去除“未找到磁链”字样
        if(!$.isEmptyObject(site.result)){
            $.each(site.result,function(index,val){
                list.append(
                    "<a class='btn btn-default magnet-link' href='magnet:?xt=urn:btih:"+ val.magnet +"'>"+ (val.name.length>30 ? val.name.substring(0,30) + "..." : val.name) +
                    "  <span class='label label-info'>" + val.size + " / " + val.date + "</span>"+
                    "</a>"
                )
            });
            list.find('a').on('click',function(){
                addOffTask($(this).attr('href'));
                event.returnValue=false;
            })
        }else{
            list.append("<span>没有找到相关磁链</span>");
        }
    }

    function getMagnet(code){
        var node = $('div#data-list div.panel-body');
        node.empty();//清空当前搜索结果
        site = sites[$('#bt-sites').val()];//设置当前搜索站点
        if($.isEmptyObject(site.result)){
            httpGet(site.getUrl(code),addMagnetLink,function(){node.append('<span>搜索中...</span>')});
        }else{
            addSearchResult();
        }
    }

    function loadBTSites(){
        $.each(sites,function(key,val){
            $('#bt-sites').append('<option value="' +key+'">'+key+'</option>')
        })
    }

    function addMagnetLink(data){
        site.matchResult(data);
        addSearchResult();
    }

    function openBTWindow(){
        $("body").append(`
            <div id="layer-bt" style="z-index: 101; width: 600px; height: 380px;">
                <div class="w-layer-title">新建离线任务</div>
                <div class="layui-layer-content">
                    <div id="JS_try_BT2" class="layui-layer-wrap" style="display: block;">
                        <div class="fct mt15 mb8">
                            <textarea id="dl-text" rows="9" placeholder="支持HTTP、HTTPS、FTP、磁力链和电驴链接,换行可添加多个" style="width: 550px;"></textarea>
                        </div>
                        <p class="fct" style="padding: 20px 0px;">
                            <button type="button" id='add-bt-btn'>添加</button>
                        </p>
                    </div>
                </div>
                <span class="layui-layer-setwin"><a href="javascript:;" class="layui-layer-close" onclick="$('div#layer-bt').remove()"></a></span>
                <span class="layui-layer-resize"></span>
            </div>
        `);
        $('button#add-bt-btn').on('click',function(){addOffTask($('#dl-text').val())});
    }

    function openErrTaskWindow(task){
        $("body").append(`
            <div id="err-task-window" class='msg-box msgbox-danger'>
                <div class='msgbox-title'><span class="msgbox-close" onclick="$('#err-task-window').remove()">×</span><b>以下链接离线失败</b></div>
                <div class='msgbox-body'>
                    <table class='table'>
                        <thead>
                            <th>链接</th>
                            <th>原因</th>
                        </thead>
                        <tbody></tbody>
                    </table>
                </div>
            </div>
        `)
        var node = $('#err-task-window').find('tbody');
        $.each(task,function(key,val){
            node.append(`
                <tr>
                    <td><a href='`+ val.url +`'>`+ val.url.substring(0,30) +`...</a></td>
                    <td>`+ val.error_msg +`</td>
                </tr>
            `)
        })
    }

    function getTaskStatus(link){
        httpPost(URL_GETTASKLISTS,"page=2",function(xhr){
            json = $.parseJSON(xhr.responseText);
            if(json.state){
                $.each(json.tasks,function(key,val){
                    if(val.url === link){
                        console.log(val.percentDone)
                        if(val.status === 2){
                            location.reload();
                        }
                    }
                })
            }
        })
    }

    document.addEventListener("keydown", function(e) {
        if(e.keyCode == 120) {
            if($('div#layer-bt').length){
                $('div#layer-bt').remove();
            }else{
                openBTWindow();
            }
        }
    });

    function Result(magnet,name,size,date){
        this.magnet = magnet;
        this.name = name;
        this.size = size;
        this.date = date;
    }

    GM_addStyle(`
        div.photo-frame{
            position:relative;
        }

        a.play-box{
            display:none;
            width:100%;
            height:100%;
            position:absolute;
            top:0;
            background:rgba(207,207,207,0.5);
        }

        i.play-ico{
            width:50px;
            height:50px;
            background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACC0lEQVRoQ+2a0W2DMBCGfc956QgMkB3abtJuABMUJijZINkg3SDZIJVMkke6QSLhPMVc5QgiKwoRYIyPCL9j3cfd7/s5DOxJFjwJBxtBqGWyMiOe571MJpNvAPAYY6ssy2Zpmh6oAZTxVIJMp9OQMfalBa4gQs75jCLMI5AVY+z1NmhETPM8D3a73ZISUGMQLfgVIgZJkmwoAJmAXOJHxLkQInCtH2OQIhtKP7HLA6ErkDI7qToQkiRZ9F1unYLo+mGMRZxzdWD0smyBXPUjpYz2+73KlNVlFUSLPLStn75AFNMBEX1b+ukTpCy3DQAEXeundxCt3Jbn8znoSj8uQcoMxUKIyLShOgfRGqqRIaUCcm2oAPDZRj+kQEwMKVWQxoaUNIhuSDnn0SNrMASQa/8RQrxXnW6DAVE0eZ7Pttutfy8zI4hVK3tnc0T8FUK8Dbm0jurrk3OupjqVi3RpIeJCCOHXsS9UQdaF5a89oSEFgoh/APAxZItyREQ1tIjbHiLOM6J6w+l0CuvogKTYEfFHSukP9sNK9QMA8NvogEpGlA7U8GHeVgeuQS4NLcuy2FQHzkBUQ5NShl3pwAXIuvgpNMyRqWpoxRDbig76yEgtY2dD5OWexg2xibGjCtLY2JECMTF2rkBuf08bGzsnIMWFgVi7MGC1oZlCjndRTN9g18+PGen6jZru9w9A+YlCWMD4+gAAAABJRU5ErkJggg==);
            position:absolute;
            top:50%;
            left:50%;
            transform: translate(-50%, -50%);
        }

        div.photo-frame:hover a.play-box{
            display:block;
        }

        div.screencap:hover a.play-box{
            display:block;
        }

        #layer-bt,.msg-box{
            position: fixed;
            background: #fff;
            border-radius: 5px!important;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
            box-shadow: 1px 1px 50px rgba(0,0,0,.3);
        }

        .w-layer-title {
            height: 48px;
            line-height: 48px;
            border-radius: 5px 5px 0 0!important;
            border-bottom: 1px solid #eee;
            font-size: 16px;
            color: #333;
            overflow: hidden;
            background-color: #f8f8f8;
            padding: 0 80px 0 20px;
        }

        .layui-layer-content {
            position: relative;
        }

        .mb8 {
            margin-bottom: 8px;
        }

        .mt15 {
            margin-top: 15px;
        }

        .fct {
            text-align: center;
        }

        .layui-layer-setwin {
            position: absolute;
            right: 15px;
            top: 15px;
            font-size: 0;
            line-height: normal;
        }

        .layui-layer-close {
            display: inline-block;
            cursor: pointer;
            background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwklEQVQ4T6WT0Q3CMAxEXzeADdiAsgGjwAYwCWxQRmEDYBIYAV1VSya100jkL4nu6XyXdPy5OmADPIAzcGvkHYALsBNA6wlsgWMDROIBeAG9AVbAvQHixXvgYwC5WILMxBJ5QA0SiiNABNGZzTza9kGXDuzOj6MzBTYTZw4Mcpqq0l4VX6OKMwd+ZunSiiNAGZgAacUlIEs7rdgD0qqm2UOIAZbEUTvjsxdA5HetqiJ972RtDtSxPtTPI6n8TEF6hfsFORY8Qcjn1/kAAAAASUVORK5CYII=);
            width: 16px;
            height: 16px;
        }

        #add-bt-btn {
            line-height: 1;
            border: 1px solid #dcdfe6;
            padding: 12px 30px;
            border-radius: 4px;
            color: #fff;
            background-color: #409eff;
            border-color: #409eff;
            font-size: 16px;
        }

        #dl-text {
            padding: 9px 11px;
            line-height: 1.6;
            border: 1px solid #e6e6e6;
            border-radius: 3px;
            background: #fff;
            color: #333;
            font-size: 14px;
            transition: border-color .15s;
            outline: 0;
            resize: none;
        }

        a.magnet-link{
            margin: 0px 10px 10px 0px;
        }

        .msg-box{
            min-width:500px;
            border:1px solid transparent;
            border-radius:4px;
        }

        .msgbox-close{
            float:right;
            cursor: pointer;
            font-size:21px;
            font-weight:700;
            line-height:1;
        }

        .msgbox-title{
            padding:10px 15px;
            border-bottom:1px solid transparent
        }

        .msgbox-body{
            padding:15px;
        }

        .msgbox-info{
            border-color:#337ab7;
        }

        .msgbox-info .msgbox-close{
            color:#fff;
        }

        .msgbox-info .msgbox-title{
            color:#fff;
            background-color:#337ab7;
            border-color:#337ab7;
        }

        .msgbox-danger{
            border-color:#ebccd1;
        }

        .msgbox-danger .msgbox-close{
            color:#a94442;
        }

        .msgbox-danger .msgbox-title{
            color:#a94442;
            background-color:#f2dede;
            border-color:#ebccd1;
        }
    `);
})();