[web.view] 利用js在wb.waitEle("video")中获网页视频地址

Mr_MAO 16小时前 71


//仅供aardio爱好者学习研究用,勿用与其它用途
import win.ui;
/*DSG{{*/
var winform = win.form(text='利用js在wb.waitEle2("video")中获网页视频地址';right=839;bottom=631)
winform.add(
btnDown={cls="button";text="下载视频";left=704;top=576;right=821;bottom=610;db=1;dr=1;z=2};
btnGo={cls="button";text="go";left=768;top=16;right=824;bottom=40;dr=1;dt=1;z=7};
custom={cls="custom";text="自定义控件";left=16;top=48;right=824;bottom=464;db=1;dl=1;dr=1;dt=1;edge=1;z=4};
edtMp4UrlList={cls="edit";left=16;top=472;right=824;bottom=568;autohscroll=false;db=1;dl=1;dr=1;edge=1;multiline=1;vscroll=1;z=1};
edtUrl={cls="edit";text="https://haokan.baidu.com/";left=104;top=16;right=760;bottom=40;dl=1;dr=1;dt=1;edge=1;z=6};
progress={cls="progress";left=16;top=584;right=677;bottom=594;db=1;dl=1;dr=1;edge=1;max=100;min=0;z=3};
static={cls="static";text="输入视频url:";left=16;top=16;right=128;bottom=40;center=1;dl=1;dt=1;transparent=1;z=5}
)
/*}}*/

import web.view;
wb = web.view(winform.custom);

winform.btnDown.disabled = true;
winform.show();

//存储网页中捕获的视频url列表
var videoUrls = [];
//存储视频标题
var title = "";

//表中仅添加一次元素
var addUnique = function(arr, value) {
    if(!value) return false;
    if(table.find(arr, value)) return false;
    table.push(arr, value); return true;
}

//生成符合windows要求的文件名
var safeFileName = function(name) {
    name = name || "video.mp4";
    name = string.replace(name, `[\\\/\:\*\?"\<\>\|]`, "_");
    if(!string.match(string.lower(name), "\.mp4$")) {
        name ++= ".mp4";
    }
    return name;
}
//回显url
wb.onDocumentInit = function(url){
    wb.setTimeout(
        function(){
            winform.edtUrl.text = url;
        }
    )
}
//不允许在新窗口打开
wb.onNewWindow = function(url) {     
    return function(){ 
        wb.go(url); return false;
    }   
};

//获取视频标题
wb.onDocumentComplete = function(url){
    wb.setTimeout(
        function(){
            var myclass = ".VideoInfo_videoinfo-title__rr4xD";
            title = wb.xcall("cls => document.querySelector(cls)?.innerText", myclass);
            
            if(title){
                winform.text = title;
            }else{
                winform.text = wb.eval("document.title");
            }
        }
    );
}

//浏览网页
winform.btnGo.oncommand = function(id,event){
    var url = string.trim(winform.edtUrl.text);
    if(#url>0){
        wb.go(url);
          
        wb.waitEle2("video",
            function() {
                if(winform.videoTimerId) winform.clearInterval(winform.videoTimerId);
                winform.videoTimerId = winform.setInterval( 
                    function(){
                        var srcs = wb.eval(`(function(){
                            var arr = [];
                            var videos = document.querySelectorAll('video');
        
                            for(var i=0;i<videos.length;i++){
                                var v = videos[i];
        
                                if(v.currentSrc) arr.push(v.currentSrc);
                                if(v.src) arr.push(v.src);

                                var sources = v.querySelectorAll('source');
                                for(var j=0;j<sources.length;j++){
                                    if(sources[j].src) arr.push(sources[j].src);
                                }
                            }
                            return arr;
                        })()`);
        
                        if(srcs) {
                            winform.edtMp4UrlList.text = "";
                            videoUrls = [];
                            for i, src in srcs {
                                if(addUnique(videoUrls, src)) {
                                    winform.edtMp4UrlList.print("视频地址:   "++ src ++ '\r\n');
                                    break;
                                }
                            }
                            winform.btnDown.disabled = false;
                        }
                    },1500
                )
            }, 
        );
    }
}
      
// 下载视频
winform.btnDown.oncommand = function(id,event){ 
    import web.rest.client;
    var http = web.rest.client(); 

    var cookies = wb.getCookies();
    http.setCookie(cookies);
    http.referer = string.trim(winform.edtUrl.text);
    http.setHeaders({
        ["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36";
        ["Accept"] = "video/mp4,video/*,*/*";
    });
    http.setTimeouts(15000, 15000, 120000);
    
    var mp4Url = videoUrls[1];
    var savePath = "d:\" ++ safeFileName(title);
    
    var received = 0;
    var lastTick = 0;
    
    var client, createErr = http.receiveFile(
        savePath,
        function(data, size, total,remain) {
            received += size;

            var now = time.tick();
            if(now - lastTick > 800 || total == received) {
                lastTick = now;
                winform.progress.pos=math.floor(received * 100 / total);
            }
        }
    );

    if(!client) return;
    
    var ok, err = client.get(mp4Url); 

    if(ok) {
        winform.msgbox("下载完成:"++ savePath);
    } else{
        winform.msgbox('下载失败!\r\n' ++ err, "下载失败","warn");
    }       
}

winform.edtUrl.onOk = function(ctrl,alt,shift){ 
    winform.btnGo.oncommand();
    return true;    
}

win.loopMessage();


最新回复 (2)
  • ccbwx 14小时前
    0 2
    赞,感谢分享
  • cyzn_lfss 7小时前
    0 3

    优秀

返回