背景
参加了一场培训会,想将培训当天的直播回放下载下来,可是被群管理员设置了不允许下载,但是呢,我又想长期保存下来。所以就从网上搜索各种办法,最后通过Fiddler Everywhere 找到的.m3u8链接还是被禁止下载的,所以网上大神们的简单方法用不了,但是我发现,m3u8链接通过Fiddler Everywhere是可以拿到返回的body的,里面的每一个ts链接是可以单独下载的,哈哈,作为程序猿的我来说,单个一个一个的ts片是可以下载,那就好办了的。
使用到的工具以及系统
- 时间坐标:2023年06月15日15:47:29
- Fiddler Everywhere (Mac) Version: 4.3.1
- 钉钉 (Mac)Version: 7.0.30
- TS助手 (win7 ,Mac中的虚拟机) V3.5
具体操作办法
-
Fiddler Everywhere
1.1 打开Fiddler Everywhere,会有个10天的试用期,足够用了。然后进行一些配置
1.2 点击setting,或许第一次打开或直接弹出来,https ->trust root certificate 确定,下面两个√勾选上
然后save
1.3 然后打开钉钉,播放视频
1.4 Fiddler Everywhere界面就会抓到很多请求,使用url旁边的搜索按钮,搜索出来.m3u8的链接来
1.5 右击url 可以复制该链接
1.6 该链接下面的body中可以抓到该文件的所有数据,可以点击按钮进行复制或保存
![
- 下载视频
一般执行完,就可以使用m3u8下载工具进行下载了,可以我的.m3u8链接(https://dtliving-sh.dingtalk.com/live_hp/16572c35-c429-43a3-9b64-a2974b7c5e81_normal.m3u8?auth_key=1689328077-0-0-f3fd6d8d5fe03b4f0f4323ef69ca6fab
)是禁止下载的
这一步可以下载的链接,可以去看这个文章进行下载。如果上面链接看不了了,可以直接从我的百度网盘中下载,里面有视频教学:链接: https://pan.baidu.com/s/10g6L2IkAj9nqBzzfCOwndA 提取码: fybm
-
我的下载视频方式
由于我的.m3u8链接禁止下载,但是切片的数据是可以下载的,所以我的思路就是将每个视频的几百个切片数据都下载下来,然后再找工具进行合并成一个视频。
由于我再调研过程中,找到了,TS助手这个功能,我先拿了5个切片数据进行测试,OK 没问题,通过了,所以我就可以大胆的来将所有的切片数据下载下来了,但是一个视频几百个切片数据啊,所以我选择自己写了以小段nodejs代码来下来。
此处需要点nodejs基础知识,我就不多加赘述了。
3.1 上代码:
console.log('=====hello,m3u8========');
var fs = require('fs');
var https = require('https');
var async = require('async');
const urls = [
'https://dtliving-vip.dingtalk.com/live_hp/',
'https://dtliving-vip.dingtalk.com/live_hp/',
'https://dtliving-vip.dingtalk.com/live_hp/',
'https://dtliving-vip.dingtalk.com/live_hp/',
];
function readM3u8File(i) {
var file = fs.readFileSync(`/Users/hehe/Desktop/${i + 1}.m3u8`);
const tsData = [];
let key = 0;
file
.toString()
.split('\n')
.forEach(function (line, idx) {
if (line.indexOf('#') === -1) {
tsData.push({ url: `${urls[i]}${line}`, key: key });
key++;
}
});
console.log(`=======总共有${key}个切片,请核对数据======`);
return tsData;
}
var concurrencyCount = 0;
var fetchUrl = function (url, i, callback) {
var delay = parseInt((Math.random() * 10000000) % 2000, 10);
concurrencyCount++;
fetchUrl2(url.url, url.key, i);
setTimeout(function () {
concurrencyCount--;
callback(null, url, i);
}, delay);
};
function fetchUrl2(url, idx, i) {
https.get(url, function (res) {
var imgData = '';
res.setEncoding('binary');
res.on('data', function (chunk) {
imgData += chunk;
});
res.on('end', function () {
fs.writeFile(
`/Users/hehe/Desktop/${i + 1}/${idx + 1}.ts`,
imgData,
'binary',
function (err) {
if (err) {
console.log('保存失败');
} else {
console.log('保存成功');
}
}
);
});
});
}
function fetchTsFile(tsUrlsFull, i) {
// 并发连接数的计数器,并发太大后,导致文件写入失败
async.mapLimit(
tsUrlsFull,
3,
function (url, callback) {
fetchUrl(url, i, callback);
},
function (err, result) {
console.log('final:');
}
);
}
// 总执行
// for (let i = 0; i < urls.length; i++) {
// const tsUrlsFull = readM3u8File(i);
// fetchTsFile(tsUrlsFull, i);
// }
// 手动去执行1、2、3、4的文件,不然并行太多了
function run(i) {
const tsUrlsFull = readM3u8File(i);
fetchTsFile(tsUrlsFull, i);
}
//一次执行,我有4个视频,每个视频有个.m3u8文件,每个.m3u8文件有几百个切片,每个切片都是.ts文件
run(0);
// run(1);
// run(2);
// run(3);
我的1.m3u8文件是这样得到的:
我一共需要4个视频,所以我就下载了1、2、3、4个文件夹,这个地方下载完了需要核对下切片的数量是否正确,否则合并的视频会有丢失的。
3.2 使用TS助手,合并视频
TS助手下载链接,如果上述链接不能用了,可以去我的百度网盘中下载:链接: https://pan.baidu.com/s/11LI3cWGaCpvNgw_HwBdyZg 提取码: sn8j