//仅供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();