Youku 视频绝对地址获取的方法详解_php技巧
前一阵子为了研究 KnLiveCommentary 而进行了一系列的关于视频站点的研究。由于KnLiveCommentary需要能够获取充足的视频源进行测试,所以我们选取了 Youku(优酷)一个比较大的视频网站来进行测试。
其实开始研究解析绝对地址也是为了研究Youku 的自带播放器,顺便去除广告什么的。后来我们就把Youku 的播放器用 ASV6 (ActionScript Viewer 6)“反编译”了一下,达到了惊人的效果。
Youku的视频采取了加密+动态的获取方式,视频地址需要访问网站动态获取,而结果则还需经过解密等操作。
$base_url = 'http://v.youku.com/player/getPlayList/VideoIDS/'; //获取视频信息的地址 基地址
$_VIDEO_ID = $_GET['vid']; //从GET里面把Video Id提取
if($_VIDEO_ID=='')
$_VIDEO_ID = 'XMjY0ODE1MDA0'; //我比较懒,测试的时 候就固定了一个
$ch = curl_init(); //开启cURL对象
curl_setopt($ch, CURLOPT_URL, $base_url . $_VIDEO_ID); //获取这个视频的信息的地址
curl_setopt($ch, CURLOPT_HEADER, 1); //要 HEADER
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://v.youku.com/v_show/id_' . $_VIDEO_ID); //给一个假的"REFERER"
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //把现在的浏览器User Agent传递给服务器
curl_setopt($ch, CURLOPT_NOBODY, 0);
$content = curl_exec($ch); //执行!!!
curl_close($ch); /*下面解析*/
preg_match(‘~”seed”s*:\s*(\d+)\s*,~iUs',$content,$seed);
preg_match(‘~\{\s*”(flv|mp4)”s*:\s*”(.*)”s*\}~iUs',$content,$encoded);
preg_match(‘~”key1″s*:\s*”(.*)”s*,~iUs',$content,$key1);
preg_match(‘~”key2″s*:\s*”(.*)”s*,~iUs',$content,$key2);
//从返回的JSON串中提取必要信息 seed, encoded_url, key1, key2
class decoder{
var $randomSeed = 0;
var $cg_str=”";
function __construct($seed){
$this->randomSeed = $seed;
}
function ran(){
$this->randomSeed = (($this->randomSeed * 211)+30031)%65536;
return ($this->randomSeed / 65536);// 根据旧的 Seed 计算新的Seed,并且返回一个Seed的比例位置 [0,1)
}
function cg_hun(){ //估计这个叫 “CG混”,反正ASV解的函数就是这个名字
$this->cg_str="";
$sttext = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890'; //默认字符串(最大)
$len = strlen($sttext); //获取其长度
for($i=0;$i$cuch = (int)($this->ran()*strlen($sttext)); //获取字符串 Seed比例 位置的字符下标
$this->cg_str.=$sttext[$cuch]; //把字母读出来
$sttext = str_replace($sttext[$cuch],”,$sttext); //删掉这个读出来的字母(到 0 就停)
}
}
function decode($string){
$output=”";
$this->cg_hun();
$expl = explode(‘*',$string); //把 1*23*34*45*56* 这个字符串打散
for($i=0;$i
}
return $output; //OK拉
}
function decode_key($key1,$key2){
$key = hexdec($key1); //两个Key都是HEX
$key = $key ^ -1520786011; //这个原来也是个8 位HEX,后来被我用计算器算了数值,因为这样方便PhP位运算
return $key2 . dechex($key); //合成最终 Key
}
}//解密类,用这个很方便$new = new decoder((int)$seed[1]);
$fileid = $new->decode($encoded[2]);
$key = $new->decode_key($key1[1],$key2[1]);
//把数据喂进去,计算//地址载构成
$s7 = substr($fileid,10,strlen($fileid));
$s5 = substr($fileid,0,8);
$s6 = substr($fileid,6,2);
//拆开$s4 = '00′;//注意这是一个 HEX 值,即00表示视频第一个分段,01第二个 0f第十五个…依此类推$sid = time() . mt_rand(10,99) . '1000′ . mt_rand(30,80) . '00′;//获取一个随机的SID,给服务器(其实不会被检查)
$d_ADDR = ‘http://f.youku.com/player/getFlvPath/sid/‘ . $sid . ‘_'. $s4 . ‘/st/' . $encoded[1] . ‘/fileid/' . $file_id;
echo $d_ADDR . ‘?K=' . $key;
//最后把地址输出
请注意,由于Youku 更换算法/格式上面的方法已经不能处理所有情况,我来描述下现在的流程:
1.访问http://v.youku.com/player/getPlayList/VideoIDS/[ID]
2.获得文件,同时解析”streamfileids”:{“flv”:”加密地址”,”mp4″:”加密地址”,”等等等”:”加密地址”
3.按照上面的方法破解加密地址
4.获取分段数目和K
{“mp4″:[{“no”:”0“,”size”:”18367795″,”seconds”:”421″,”k”:”281ff2875db680bb261c02ce“},{“no”:”1“,”size”:”19045091″,”seconds”:”421″,”k”:”45398cdd4aa44968261c02ce“},
……
5.合成地址,不过每个分段的K都采用上面获得的新K

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python中的檔案副檔名是附加在檔案名稱末尾的後綴,用來表示檔案的格式或類型。它通常由三個或四個字元組成,檔案名稱後面跟著一個句點,例如“.txt”或“.py”。作業系統和程式利用檔案副檔名來確定檔案的類型以及應如何處理它。被識別為純文字檔案。 Python中的檔案副檔名在讀取或寫入檔案時至關重要,因為它建立了檔案格式以及讀取和寫入資料的最佳方法。例如,「.csv」檔案副檔名是讀取CSV檔案時使用的副檔名,而csv模組則用於處理該檔案。 Python中取得檔案副檔名的演算法在Python中操作檔名字串來

使用math.Max函數取得一組數中的最大值在數學和程式設計中,經常需要找出一組數中的最大值。在Go語言中,我們可以使用math套件中的Max函數來實現這個功能。本文將介紹如何使用math.Max函數來取得一組數中的最大值,並提供對應的程式碼範例。首先,我們需要導入math包。在Go語言中,導入套件可以使用import關鍵字,如下所示:import"mat

谷歌驗證器是一種用於保護使用者帳戶安全的工具,其金鑰是用於產生動態驗證碼的重要資訊。如果忘記了谷歌驗證器的金鑰,只能透過安全碼進行驗證,那麼下文站小編就會為大家帶來谷歌安全碼在哪裡取得的詳細內容介紹,希望能幫助到大家,想要了解的用戶們就請跟著下文繼閱讀吧!首先開啟手機設置,進入設定頁面。下拉頁面,找到Google。進入Google頁面,點選Google帳號。進入帳號頁面,點選驗證碼下方的檢視。輸入密碼或使用指紋驗證身分。取得Google安全碼,利用安全碼驗證Google身分。

從Java中的LinkedHashSet中檢索最後一個元素意味著檢索其集合中的最後一個元素。儘管Java沒有內建方法來幫助檢索LinkedHashSets中的最後一個項,但存在多種有效的技術,可以提供靈活性和便利性,有效地檢索此最後一個元素而不破壞插入順序-這是Java開發人員必須在其應用程式中有效處理的問題。透過將這些策略有效地應用於他們的軟體專案中,他們可以實現滿足此要求的最佳解決方案LinkedHashSetLinkedHashSet是Java中的一種高效資料結構,它結合了HashSet和

如果「最新更新可用後立即取得最新更新」選項缺失或灰顯,則你可能正在執行開發人員頻道Windows11版本,這是正常的。對於其他人,安裝KB5026446(22621.1778)更新後會出現問題。您可以採取以下措施來取回「在最新更新可用時立即取得更新」選項。如何取回「在最新更新可用時立即取得更新」選項?在開始以下任何解決方案之前,請確保檢查最新的Windows11更新並安裝它們。 1.使用ViVeTool前往「Microsoft更新目錄」頁面並尋找KB5026446更新。在您的PC上下載並重新安裝更

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

現代科學在很大程度上依賴複數的概念,而這個概念最初是透過GirolamoCardano在16世紀引入的17世紀初建立。複數的公式是a+ib,其中a保留html代碼且b是實數。一個複數被認為有兩個部分:實部<a>和虛部(<ib>)。 i或iota的值為√-1。 C++中的複數類別是用來表示複數的類別。 C++中的complex類別可以表示並控制幾個複數操作。我們來看看如何表示和控制顯示複數。 imag()成員函數如前所述,複數由實部和虛部兩部分組成。顯示實部我們使用real()

雖然說國產手機的大致操作是很相似的,但是在有的細節上面還是會有些區別的,比如說不同的手機型號和製造商可能會有不同的雙卡安裝方式。二真我12Pro這款新手機也是支援雙卡雙待的,但這款手機具體又該怎麼安裝雙卡呢?真我12Pro怎麼安裝雙卡?安裝之間記得先把手關機喲。步驟一查找SIM卡托盤:查找手機的SIM卡托盤,通常,在真我12Pro中,SIM卡托盤位於手機的側邊或頂部。步驟二插入第一張SIM卡,使用專用的SIM卡針或一個細小的物體,將其插入SIM卡托盤中的開槽,然後,將第一張SIM卡小心地
