AnyProxy,springboot,ffmpeg强强联合,下载msup大会阿里加密视频,学习大牛打怪招式。
麦思博(msup)有限公司是一家面向软件研发团队的培训咨询机构,专注于软件研发中心的快速成长,服务于软件开发团队的技能提升、软件工程的实际应用和软件品质的创新与超越。强调人员、技术、流程和管理的有机结合,注重个体的技能提升与职业发展,研发团队的管理与协作。分享世界级软件研发团队最佳管理实践,这正是msup的精髓所在!
AnyProxy是一个开放式的HTTP代理服务器。
Github主页:https://github.com/alibaba/anyproxy
主要特性包括:
这里以Windows
为例
npm install -g anyproxy
anyproxy
解析https请求的原理是中间人攻击(man-in-the-middle),用户必须信任AnyProxy生成的CA证书,才能进行后续流程
anyproxy-ca #生成rootCA证书,生成后需要手动信任
anyproxy --intercept #启动AnyProxy,并解析所有https请求
{userhome}\.anyproxy\certificates
,双击打开证书,根据提示安装。AnyProxy提供了二次开发的能力,你可以用js编写自己的规则模块(rule),来自定义网络请求的处理逻辑。
规则模块的能力范围包括:
anyproxy --rule ./rule.js
module.exports = {
* beforeSendResponse(requestDetail, responseDetail) {
// 这里可能需要根据自己所在地区切换下URL,看下请求替换就可以了
if (requestDetail.url.indexOf('vod.cn-shanghai.aliyuncs.com') > -1) {
const newResponse = responseDetail.response;
const body = newResponse.body;
let result = JSON.parse(body.toString());
let res = result.PlayInfoList.PlayInfo;
let hdInfo;
for (var i = 0; i < res.length; i++) {
var r = res[i];
if (r.Definition == 'HD') {
hdInfo = r;
break;
}
}
if (!hdInfo) {
hdInfo = res[res.length - 1];
}
let url = hdInfo.PlayURL;
let vid = result.VideoBase.VideoId;
console.log(url);
console.log(vid);
return {
response: newResponse
};
}
},
};
这里不在赘述如何获取全部视频和如何获取视频播放地址,有心的人自然知道怎么处理
anyproxy --intercept --rule rule.js
打开浏览器输入地址 chrome://settings/
展开 高级选项
- 打开您计算机的代理设置
配置代理地址和端口为 127.0.0.1 8001
点击保存即可
浏览器输入视频地址 https://case.msup.com.cn/play?id=165&videoId=0
观察控制台,发现可以打印出我们需要的视频地址信息
拷贝地址使用 ffplay
播放确认是否可用
ffplay url
控制台有日志输出,并且开始播放,binggo~,地址对了,接下来就是如何保存视频。
环境变量
下,方便使用ffmpeg -i [url] [test.mp4]
使用springboot的目的是把整个流程脚本化执行批量下载,关于所有视频信息的获取,有兴趣的自行研究吧,这里只介绍如何根据得到的视频信息自动下载。
我们需要借助 anyproxy
的 rule
脚本的能力 拦截 response
把视频地址发送到我们的程序,然后自动下载。接口请求使用 axios
库。
// 我是个java程序猿,不要吐槽我的前端代码!
if (vid && url) {
axios.get('http://127.0.0.1:8081/msup/item/vid?vid=' + vid + '&url=' + url).then(function (response) {
const data = response.data;
if (data.id) {
axios.get('http://127.0.0.1:8081/msup/down?id=' + data.id + '&url=' + data.url);
} else {
console.log('>>>>>>>>>>>>>>>>>>>>')
}
});
}
public static String ffmpeg(String id, String url) {
return execute("sh", "-c", "cd /root/msup/ && nohup ffmpeg -i " + url + " " + id + ".mp4 > " + id + ".log 2>&1 &");
}
private static String execute(String... args) {
LOGGER.info("exec : " + Arrays.toString(args));
StringBuilder sb = new StringBuilder();
try {
ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process proc = pb.start();
LOGGER.info("Process started !");
String line;
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gbk"));
while ((line = in.readLine()) != null) {
sb.append(line).append(System.getProperty("line.separator"));
LOGGER.info(line);
}
proc.destroy();
LOGGER.info("Process ended !");
} catch (Exception e) {
}
return sb.toString();
}