優酷真實視頻位址解析(更新至2016-2-28)

來源:互聯網
上載者:User

標籤:

優酷視頻的演算法在2015年11月24日起至今連續更改了好幾個版本,之前發的這篇臨時解決方案得到很多響應,非常感謝!現在對這篇文章重新修改,全面規整完整的破解思路(含破解方法)!

對了,這篇文章只是針對m3u8格式的視頻。

 

一.準備工作

所謂工欲善其事必先利其器,做好破解的準備工作會令你事半功倍。

1.首先準備一個Http抓包工具,PC上推薦Fiddler或者Postman,iOS上推薦Surge

2.手備一台iOS測試裝置(因為在Safari裡優酷視頻是確定使用m3u8進行播放的)

 

二.抓包過程

以Fiddler為例子,先配置Fiddler的設定和iOS裝置,讓Fiddler可以抓取iOS裝置的請求資料,這一步如果不會請先自行摸索。

開啟Safari,輸入優酷網址,進入一個視頻查看Fiddler視窗,需要關注的一些重要訊息:

  • 請求v.youku.com/v_show/id_{vid}.html時,返回的Cookie資訊ykss
  • 請求play.youku.com/play/get.json?vid={vid}&ct=12時,要求標頭部的Cookie資訊ykss和__ysuid,以及返回的security節點
  • 最終拼出m3u8地址pl.youku.com/playlist/m3u8?vid=....,請求後得到m3u8的具體視頻內容

前兩步都好說,可第三部的m3u8這麼一個複雜的串,格式如http://pl.youku.com/playlist/m3u8?vid=XMTQzNzIwODQ3Ng==&type=flv&ts=1452839810&keyframe=0&ep=ciaRGEGOX8YB5SPYjD8bNC6xJnIGXJZ3kn7P%2F5gbR8RQKevBzjPcqJ21TPs%3D&sid=045283981007412c2cb59&token=0524&ctype=12&ev=1&oip=2093868719,是怎麼得到的?回頭看一下抓到的一堆js代碼,你會發現精髓就在這裡——http://player.youku.com/embed/unifull/unifull_.js,這裡面就是全部優酷真真實位址的解析演算法,源碼非常長,如果你有興趣,可以對檔案格式化一下後慢慢閱讀。下一節就具體來講講這裡邊的演算法是怎樣的。

三.真真實位址演算法解析

在上一節各個步驟標註的重要訊息中,get.json這個介面返回的securiy節點就對演算法起著很重要的作用(其實從名字就能看出它的特別意義嘛~)

1. 擷取sid, token和ep

security節點有兩個值,一個是encryp_string,一個是ip。

在http://player.youku.com/embed/unifull/unifull_.js裡,隨處可以找到YK.m3u8src這個function,其中傳入兩個參數,一個是視頻的vid,另一個是視頻片段的格式(如"mp4")。

總結一下這個方法做的事情(這個演算法需要計算3個值:sid, token和ep):

1). 對encrypt_string進行Decode64,即對其進行base64解碼,得到一個byte數組decoded_ep

2).產生一個秘鑰key_a(其值其實是固定的),利用這個秘鑰與decoded_ep作Rc4演算法加密,得到一個字串temp

3).temp的結果由“xxxx_xxxx”組成,切割‘_’,前者為sid,後者為token

4).產生一個秘鑰key_b(其值也是固定的),利用這個秘鑰與字串{sid}_{vid}_{token}的ASCII碼位元組數組whole記性Rc4演算法加密,得到一個字串temp2

5).對temp2進行base64轉換,然後再做url encode,得到ep

至此sid, token和ep就得到了!

關於Rc4加解密,可以參考https://zh.wikipedia.org/wiki/RC4

上代碼:

 

 

 

2. 固定秘鑰key_a和key_b的產生方法

如果對秘鑰key_a和秘鑰key_b怎麼得到有興趣,請繼續細度下面的內容,不感興趣可以跳過這一段。

在http://player.youku.com/embed/unifull/unifull_.js裡,秘鑰由方法translate(a, b)產生,其中a為一個組合字元串,b是一個固定的目標數組。

translate方法的作用是利用字元的ASCII碼進行變形,對於組合字元串中的每個字元,如果是小寫字母a-z,則取其ASCII碼,否則將其ASCII碼+26;接下來如果能在目標數組裡找到這個數位,如果能找到,且碼的值 > 25,則取碼-26,否則取碼+97對應的字元;最後組合成新的位元相等的字串,這就是秘鑰。上代碼:

 

 

兩個秘鑰的原始字串分別為b4eto0b4和boa4poz1

目標數組:[19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26]

(不要問我怎麼知道,看js源碼自己組一下,都是固定的)

 

3.拼接m3u8地址

接下來就是按照m3u8指定的格式將數值填入即可,格式如下:

http://pl.youku.com/playlist/m3u8?vid={vid}&type={type}&ts={ts}&keyframe=1&ep={ep}&sid={sid}&token={token}&ctype=12&ev=1&oip={oip}

在這個串中還有其他一些變數需要填寫,其中

type指m3u8的內容中視頻片段的格式,可取值標清(flv, 3pgphd)、高清(mp4, flvhd)、超清(hd2)、1080P(hd3)

ts指目前時間的Unix時間戳記(精確到秒)

oip指security節點中的ip

組合完成後就去請求m3u8地址吧,會得到一系列的視頻片段。

 

4.注意事項

演算法邏輯清楚了,還需要有寫注意點,一旦忽略就會導致最終即使拼出m3u8地址,也請求不到視頻內容。

回顧一下第二節的3個步驟,每個步驟都有注意點:

第一個步驟,請求v.youku.com/v_show/id_{vid}.html ,傳回值會帶有名字為ykss的Cookie,這個很重要,不能丟

第二個步驟,請求get.json時,第一步的Cookie:ykss也要發送,並且還要增加一個名為__ysuid的Cookie,__ysuid=getPvid(6),演算法請看以往的更新記錄;還有一點,Referer要填視頻的url地址,絕對不能丟,否則即使get.json能正常返回資料,也能拿到security節點,但是拼出來的m3u8無論你怎麼請求都無法得到視頻內容,切記Referer不要丟!

第三個步驟,請求m3u8地址時,就目前看已經不需要再傳名為r的Cookie,但是以優酷的尿性,保不準以後還會再加上。

 

如果有什麼疑問,歡迎留言。(以下內容是以往的一些變更記錄,已作廢)

————————————————————————————————————————————————————————————————

11-30更新:

今日又發現了一個問題,這裡補充一下。get.json這個介面返回的時候,Response帶有Cookie,如果你是自己提供web api,這個Cookie記得也要返回去給應用,否則應用即使拼出m3u8的地址,也無法擷取到完整的視頻內容。

 

————————————————————————————————————————————————————————————————

12-8更新:

感謝@kkia 發現,

請求http://play.youku.com/play/get.json?vid={vid}&ct=12這個api的時候,http請求需要帶上Referer:{url},url為需要擷取的視頻的頁面連結,不然會出現非主站請求的錯誤。

另外,cookie校正機制又啟動了。

所以,如果自己封裝web api,建議每次請求,都把m3u8檔案的內容下載下來,自己產生並儲存臨時的m3u8檔案,再把這個檔案的連結返回給用戶端,再定時去清理這些臨時檔案。

 

————————————————————————————————————————————————————————————————

12-29更新:

感謝@kkia 發現,name=r的Cookie擷取途徑再次發生了變化,步驟更新如下:

1.通過完整的視頻地址url(http://v.youku.com/v_show/id_{vid}.html)中拿到一堆Cookie,只提取其中的ykss=132b825604a2f7516fd91fc0; path=/; domain=.youku.com; 這條Cookie

2.請求get.json時帶上以上名為ykss的Cookie,且加上Referer=視頻url,請求結果中就會出現名為r的Cookie了

3.最後請求m3u8地址的時候帶上名為r的Cookie,Referer=視頻url,就能得到結果了。

 

————————————————————————————————————————————————————————————————

12-30更新:

優酷日常作死,又更新了Cookie演算法,看來這是持久戰,大家做好心理準備,相信這麼折騰大家都明白名為r的Cookie的重要性了吧。

目前可以這樣擷取名為r的Cookie:

直接請求get.json這個API,頭部需要有如下格式的資訊:

Cookie: __ysuid={16-length-string};

Referer: http://v.youku.com/v_show/id_{vid}.html

其中__ysuid的演算法如下(感謝@kkia)

 

 

由13位長的UNIX時間戳記拼接3位長的隨機字串組成__ysuid。

事實上,只要在請求m3u8連結的時候Cookie裡含有r(不用管value是啥,至少現階段一直是這樣的),就能請求成功。

 

優酷真實視頻位址解析(更新至2016-2-28)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.