没有任何复杂操作或代码,不需要*载下**配置任何其他东西。
打开只有几 MB 的最简开发工具 aardio ,新建工程。

默认会打开主窗口 main.aardio ,点击『代码视图』按钮:

简单解释一下主窗口代码:
//导入界面库
import win.ui;
//创建主窗口
mainForm = win.form(text="视频*载下**");
//显示主窗口
mainForm.show();
//启动界面消息循环
win.loopMessage();
最后一句:
win.loopMessage();
启动界面消息循环很重要,它就好比汽车的发动机 —— 要一直运转不停,窗口界面才能收发处理各种消息,用户才能在界面上操作、查看结果。
然后我们再添加几句代码创建网页浏览器:
import win.ui;
mainForm = win.form(text="视频*载下**");
mainForm.show();
//导入浏览器组件
import web.view;
//在主窗口上创建浏览器
var wb = web.view(mainForm);
//在浏览器中显示网页
wb.go("https://www.*******.com/video/*******/")
win.loopMessage();
现在我们再为浏览器添加一个网页可以调用的 external 对象,这样网页里的 JavaScript 脚本就可以直接调用本地导出的 aardio 对象了。
新增的代码如下:
//导出 aardio 对象到网页
wb.external = {
//添加一个网页可以调用的 aardio 函数
parseRenderData = function(renderData){
}
}
上面这段代码应当添加在哪个位置呢?后面我会讲,但您可以动手试一下,看能不能提前找到答案。
那么现在我们就可以在网页 JavaScript 里调用上面的
external.parseRenderData() 函数了。
下面我们调用 wb.waitEle 等待网页创建指定的节点,并执行 JavaScript 脚本,代码如下:
//导出 aardio 函数
wb.external = {
parseRenderData = function(renderData){
}
}
//打开视频页面
wb.go("https://www.*******.com/video/*******/")
//等待 CSS 选择器 "#RENDER_DATA" 指定的节点出现
wb.waitEle("#RENDER_DATA",`
aardio.parseRenderData( this.innerText )
`);
wb.waitEle() 函数的第 1 个参数用于指定等待节点的 CSS 选择器,而 "#RENDER_DATA" 指的是 id 属性为 "RENDER_DATA" 的节点。
wb.waitEle() 函数的第 2 个参数指定节点出现后要执行的 JavaScript 脚本。在这个 JS 脚本里 this 对象就指向找到的 HTML 节点,this.innerText 就是这个节点内部包含的文本数据。
JavaScript 的 aardio 对象就是 aardio 里的 wb.external 对象。
那么下面我们就要改进 aardio 中的 parseRenderData 函数分析网页传过来的数据,并提取视频地址。
改进的代码如下,每句都写了注释:
//导出 aardio 对象
wb.external = {
//导出 aardio 函数
parseRenderData = function(renderData){
// URL 解码
var json = inet.url.decode(renderData);
// JSON 解码
var jsonData = web.json.tryParse(json);
//提取视频信息,双 [[]] 的作用是 jsonData 为空不报错
var info = jsonData[["data"]][["initialVideo"]][["videoPlayInfo"]];
//忽略错误数据
if(!info) return;
//视频*载下**地址列表(数组)
var vList = info.dynamic_video.dynamic_video_list;
//音频*载下**地址列表(数组)
var aList = info.dynamic_video.dynamic_audio_list;
//取出最后一个视频信息,#取数组长度(起始索引为 1)
var video = vList[#vList];
//取出最后一个音频信息
var audio = aList[#aList];
//创建*载下**对话框,*载下**视频,支持断点续传
import inet.downBox;
var d = inet.downBox(winform,"正在*载下**视频",1);
d.download(video.backup_url,"/download/v.mp4");
//*载下**音频
var d = inet.downBox(winform,"正在*载下**音频",1);
d.download(audio.backup_url,"/download/a.mp4");
//合并音频与视频
import process.ffmpeg;
//第一个参数指定 FFmpeg 工作目录
var ffmpeg = process.ffmpeg("/download/"
, "-y -i v.mp4 -i a.mp4 -vcodec copy -acodec copy "
+ "out.mp4");
//等待操作完成
ffmpeg.waitOne();
}
}
下面是完整代码:
import win.ui;
mainForm = win.form(text="视频*载下**");
import web.view;
var wb = web.view(mainForm);
wb.external = {
parseRenderData = function(renderData){
var json = inet.url.decode(renderData);
var jsonData = web.json.tryParse(json);
var info = jsonData[["data"]][["initialVideo"]][["videoPlayInfo"]];
if(!info) return;
var vList = info.dynamic_video.dynamic_video_list;
var aList = info.dynamic_video.dynamic_audio_list;
var video = vList[#vList];
var audio = aList[#aList];
import inet.downBox;
var d = inet.downBox(winform,"正在*载下**视频",1);
d.download(video.backup_url,"/download/v.mp4");
var d = inet.downBox(winform,"正在*载下**音频",1);
d.download(audio.backup_url,"/download/a.mp4");
import process.ffmpeg;
var ffmpeg = process.ffmpeg("/download/"
, "-y -i v.mp4 -i a.mp4 -vcodec copy -acodec copy "
+ "out.mp4");
ffmpeg.waitOne();
process.exploreSelect("/download/out.mp4");
}
}
mainForm.show();
wb.go("https://www.*******.com/video/*******/");
wb.waitEle("#RENDER_DATA",`
aardio.parseRenderData( this.innerText )
`);
win.loopMessage();
点击『保存 Ctrl +S』按钮:

按『运行 F5 』按钮看效果,按 F7 一键生成独立 EXE 文件。
测试的视频网址这里就不写了,*载下**视频不是目的,学习编码技术才是最重要的。