以此網(wǎng)站如下的電影《2012》為例:
在這個(gè)網(wǎng)站上面,電影2012是以一系列幾秒的ts格式來(lái)播放的,所以沒(méi)辦法直接復(fù)制視頻地址來(lái)下載整部電影捌蚊。看如下截圖:
并且近弟,每段ts還是加密的缅糟,單獨(dú)下載ts文件是無(wú)法播放的,需要解密藐吮,如下圖:
那要怎樣才能下載完整的解密后的視頻呢?下面分幾步進(jìn)行說(shuō)明逃贝。
1谣辞、首先,獲取該電影所有的ts列表沐扳,和加密方式及密鑰:
要用chrome瀏覽器打開(kāi)該網(wǎng)址泥从,然后右擊,點(diǎn)擊檢查沪摄,然后重新刷新頁(yè)面躯嫉,然后根據(jù)如下截圖查看:
點(diǎn)擊“index.m3u8”這個(gè)請(qǐng)求纱烘,然后根據(jù)如下截圖:
能夠得出該電影的所有ts列表,并且加密方式是“AES-128”祈餐,密鑰是enc.key的請(qǐng)求中擂啥,iv是16字節(jié)長(zhǎng)度的0 。 現(xiàn)查看enc.key請(qǐng)求如下:
發(fā)現(xiàn)是亂碼(有些網(wǎng)站不是亂碼帆阳,而是字符串)哺壶。亂碼是因?yàn)樵撁荑€是二進(jìn)制的,需要用查看hex工具來(lái)獲取16進(jìn)制的密鑰蜒谤。
先下載該“enc.key”到本地山宾,然后用hex工具查看16進(jìn)制值。mac系統(tǒng)可以用如下查看:
可以得出該密鑰的16進(jìn)制為:7be5d74d56af87838c3b98f1a2febf8f
2鳍徽、根據(jù)ts列表资锰,用php來(lái)實(shí)現(xiàn)多進(jìn)程快速下載
下載所有ts文件有很多方法,可以手動(dòng)一個(gè)個(gè)下載阶祭,但是因?yàn)樘啾炼牛赃@個(gè)方法會(huì)比較麻煩∨趾玻可以用php腳本來(lái)快速下載接剩。
創(chuàng)建個(gè)1.php文件,用來(lái)下載ts文件萨咳。寫(xiě)入如下內(nèi)容:
<?php
function my_file_get_contents($url) {
$arrContextOptions = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
]
];
return file_get_contents($url, false, stream_context_create($arrContextOptions));
}
for ($i=$argv[1]; $i <= $argv[2]; $i++) {
echo $i.'...'.PHP_EOL;
$f = $i.'.ts';
if (file_exists($f)) {
continue;
}
// 下面的鏈接要改成“index.m3u8”這里面相對(duì)應(yīng)的ts鏈接
$data = my_file_get_contents('https://hnts.ymuuy.com:65/hls/200/20240110/2077/plist'.$i.'.ts');
file_put_contents($f, $data);
}
然后懊缺,再創(chuàng)建個(gè)2.php文件,用來(lái)創(chuàng)建下載命令培他。寫(xiě)入如下內(nèi)容:
<?php
// 882要改成改成“index.m3u8”這里面最大數(shù)字的ts鏈接后的數(shù)字
for ($i=1; $i<=882; $i+=20) {
$tmp = $i+20;
if ($tmp > 882) {
$tmp = 882;
}
echo 'php 1.php '.$i.' '.$tmp.' &'.PHP_EOL;
}
然后鹃两,運(yùn)行如下命令:
生成了可以多進(jìn)程下載ts文件的命令行,然后復(fù)制生成的命令舀凛,在終端運(yùn)行如下:
可以看到俊扳,已經(jīng)在快速下載了,分為了882/20=44個(gè)進(jìn)程來(lái)同時(shí)快速下載猛遍。
可以用如下命令來(lái)查看下載進(jìn)度:
while true
do
du -sh `pwd`; ls |wc -l;sleep 1;
done
顯示如下:
會(huì)顯示出當(dāng)前下載的大小馋记,和下載的總ts數(shù)。
注意懊烤,全部都下載完后梯醒,要查看下有沒(méi)有大小為0的ts文件,這些是下載失敗的文件腌紧,刪除后茸习,重新運(yùn)行下下載命令即可。
3壁肋、所有文件都下載完后号胚,要開(kāi)始解密并合并了
同樣也是用php腳本來(lái)解密籽慢,保存下面腳本為decrypt.php:
<?php
// 如果“enc.key”的密鑰是二進(jìn)制的話,就用下面這行
$key = hex2bin("7be5d74d56af87838c3b98f1a2febf8f");
// 如果“enc.key”的密鑰是字符串的話猫胁,就用下面這行
// $key = 'Cibz2Dp3bCnzlmVx';
// 原樣復(fù)制“index.m3u8”里面的IV的0x后面的部分
$iv = hex2bin("00000000000000000000000000000000");
$decrypted_file = 'output.ts'; // 最終要保存的文件
// 882改為ts總數(shù)
for ($i=1; $i<=882; $i++) {
echo $i,'...',PHP_EOL;
$encrypted_file = $i.'.ts';
$data = file_get_contents($encrypted_file);
$decrypted_data = openssl_decrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
file_put_contents($decrypted_file, $decrypted_data, FILE_APPEND);
}
echo "解密成功箱亿,已保存為:".$decrypted_file;
運(yùn)行如下命令:
這樣,就成功的解密并合并為了output.ts文件杜漠,用支持ts的播放器就可以播放此電影了极景。
有問(wèn)題這邊留言探討下~