背景
參加了一場培訓會,想將培訓當天的直播回放下載下來阵具,可是被群管理員設(shè)置了不允許下載拢驾,但是呢奖磁,我又想長期保存下來。所以就從網(wǎng)上搜索各種辦法繁疤,最后通過Fiddler Everywhere 找到的.m3u8鏈接還是被禁止下載的咖为,所以網(wǎng)上大神們的簡單方法用不了,但是我發(fā)現(xiàn)稠腊,m3u8鏈接通過Fiddler Everywhere是可以拿到返回的body的躁染,里面的每一個ts鏈接是可以單獨下載的,哈哈架忌,作為程序猿的我來說吞彤,單個一個一個的ts片是可以下載,那就好辦了的叹放。
使用到的工具以及系統(tǒng)
- 時間坐標: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 可以復(fù)制該鏈接
1.6 該鏈接下面的body中可以抓到該文件的所有數(shù)據(jù),可以點擊按鈕進行復(fù)制或保存
![
- 下載視頻
一般執(zhí)行完端仰,就可以使用m3u8下載工具進行下載了捶惜,可以我的.m3u8鏈接(https://dtliving-sh.dingtalk.com/live_hp/16572c35-c429-43a3-9b64-a2974b7c5e81_normal.m3u8?auth_key=1689328077-0-0-f3fd6d8d5fe03b4f0f4323ef69ca6fab
)是禁止下載的
這一步可以下載的鏈接,可以去看這個文章進行下載荔烧。如果上面鏈接看不了了吱七,可以直接從我的百度網(wǎng)盤中下載,里面有視頻教學:鏈接: https://pan.baidu.com/s/10g6L2IkAj9nqBzzfCOwndA 提取碼: fybm
-
我的下載視頻方式
由于我的.m3u8鏈接禁止下載鹤竭,但是切片的數(shù)據(jù)是可以下載的踊餐,所以我的思路就是將每個視頻的幾百個切片數(shù)據(jù)都下載下來,然后再找工具進行合并成一個視頻臀稚。
由于我再調(diào)研過程中吝岭,找到了,TS助手這個功能,我先拿了5個切片數(shù)據(jù)進行測試窜管,OK 沒問題散劫,通過了,所以我就可以大膽的來將所有的切片數(shù)據(jù)下載下來了幕帆,但是一個視頻幾百個切片數(shù)據(jù)啊获搏,所以我選擇自己寫了以小段nodejs代碼來下來。
此處需要點nodejs基礎(chǔ)知識失乾,我就不多加贅述了常熙。
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}個切片,請核對數(shù)據(jù)======`);
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) {
// 并發(fā)連接數(shù)的計數(shù)器,并發(fā)太大后碱茁,導(dǎo)致文件寫入失敗
async.mapLimit(
tsUrlsFull,
3,
function (url, callback) {
fetchUrl(url, i, callback);
},
function (err, result) {
console.log('final:');
}
);
}
// 總執(zhí)行
// for (let i = 0; i < urls.length; i++) {
// const tsUrlsFull = readM3u8File(i);
// fetchTsFile(tsUrlsFull, i);
// }
// 手動去執(zhí)行1裸卫、2、3纽竣、4的文件墓贿,不然并行太多了
function run(i) {
const tsUrlsFull = readM3u8File(i);
fetchTsFile(tsUrlsFull, i);
}
//一次執(zhí)行,我有4個視頻退个,每個視頻有個.m3u8文件募壕,每個.m3u8文件有幾百個切片调炬,每個切片都是.ts文件
run(0);
// run(1);
// run(2);
// run(3);
我的1.m3u8文件是這樣得到的:
我一共需要4個視頻语盈,所以我就下載了1、2缰泡、3刀荒、4個文件夾,這個地方下載完了需要核對下切片的數(shù)量是否正確棘钞,否則合并的視頻會有丟失的缠借。
3.2 使用TS助手,合并視頻
TS助手下載鏈接宜猜,如果上述鏈接不能用了泼返,可以去我的百度網(wǎng)盤中下載:鏈接: https://pan.baidu.com/s/11LI3cWGaCpvNgw_HwBdyZg 提取碼: sn8j