工具:google瀏覽器 + fiddler抓包工具
說明:這里不貼代碼,【只講思路!!!】
原始url = https://v.youku.com/v_show/id_XMzIwNjgyMDgwOA==.html? 【隨便找的一部電影鏈接】稱它為原始url
開始分析:
打開 fiddler ,然后打開google,輸入url,按F12.得到下圖 :
分析上圖內容: 首先通過fiddler抓包得知真實播放地址是一段一段的,就如上圖標號3,然后將其中一小段播放地址復制到瀏覽器打開,得到403error,由此可知,該鏈接需要重構一些東西,然后才能通過代碼發送請求,否則是會被拒絕的。因此,來到上圖標號4,分析請求url。首先先分析不同視頻段之間的url區別,對比發現僅僅是【ts_seg_no】參數不同,而且該參數是從0開始逐漸+1,但是末尾是多少尚未可知。然后分析當不同時間打開原始url時,視頻真實地址的請求url有哪些區別。老方法,將原始url在新建標簽頁再打開一次,對比兩次打開的請求url。請求url參數的對比過程省略,參數對比的結果如下圖:
可以看到每次打開,psid 和 vkey 這兩個參數都是在變的,並且代表什么尚未可知。同次打開時的不同視頻段的請求url在 ts_start 、 ts_end、ts_seg_no 參數上也有變化,雖然變化規律已知,但是並不能確定這三個參數的在什么時間結尾,因此也是尚未可知。分析到這里,可以確定的是在分段視頻鏈接之前肯定還有鏈接或者js文件加載了這些未知的參數或者這些未知的請求url鏈接。於是在 network 中嘗試地搜索了psid、vkey兩個值,鏈接的一部分長這樣【pl-ali.youku.com/playlist/m3u8?】,然后點開查看響應,如下圖:
正好,響應的內容剛好是視頻分段的請求鏈接。所以現在就不用去重構視頻分段的請求鏈接了,把重點放在上圖中的url鏈接上【暫且叫它播放url】,只要能弄到播放url,那么這次任務就算完成。
然后開始分析播放url,它的模樣如下圖:
看上去有點復雜,所以就采用之前對比分析url的方法,得到播放url參數區別,區別如下圖:
分析這個鏈接,得到鏈接中需要重構的參數只有 psid、ups_key 。所以要開始分析這兩個參數的來源。
因此在google network 中ctrl+f 搜索 psid 、ups_key,發現兩個參數出現在鏈接叫【https://acs.youku.com/h5/mtop.youku.play.ups.appinfo.get】中,這個鏈接【叫它js鏈接】如下圖;
這個js鏈接是一個js文件。點開后,查看響應,發現響應是一個json格式的js函數,如下圖:
接着在響應中搜索psid、ups_key的值,居然找到了之前的播放鏈接,給個圖:
ok! 現在一切都很明朗了,只要能獲取到這個js鏈接的響應信息,將m3u8_url 提取出來再請求,並提取響應【這個響應里面就是真實的視頻播放地址】。因此現在要想辦法怎么才能獲取這個js鏈接,
問題的出現
嗯。。。?(猜想中...)從響應中可以看到 json 格式是在mtopjsonp1() 這個里面,那么這個mtopjsonp1()是什么呢?他是一個js函數嗎?如果是一個js函數的話,那么可以嘗試搜索一下看看【嘗試過,並沒有看到完全一樣的函數】,難道嘗試着去請求這個js鏈接嗎?【這個鏈接也看了看,特別~特別的長,看起來好復雜,這條路先不考慮】,如果前面兩個都不考慮的話,那么又要開始考慮重構那個 播放url 了,畢竟 播放url 只要找出psid、ups_key兩個參數就ok。於是開始思考:這兩個如果有其他路徑存在的話,那它應該是在某個js函數里面,所以開始在 network 中search 兩個參數 psid 、ups_key。嗯,發現了 psid 參數的痕跡。如下圖:
確實在另一個js文件中發現了 psid ,但是又不太像,而且就算是的話,js不怎么熟的我也是找不出 psid 是怎么生成的,所以呢,這個變量先放着,接着搜一下 ups_key,很遺憾,沒有在js文件中找到這個變量,因此需要回到猜想【如何想辦法來請求那個很長很復雜的 js鏈接 】,為什么說它復雜呢? 看下圖就知道了:
而且還是 GET 請求,發送 Data 的鏈接 ,下圖是鏈接的參數(先絕望一下):
說心里話,看到這樣的鏈接,實在不想弄了。
但是還是得花時間把它給摸透了,不然我得爬蟲技術就是到此為止咯。(弄還是要弄的,不過想到爬蟲方面的問題又無人可問,不由十分悲傷,技術瓶頸只能靠自己用未知的時間去堆出來)再接着弄吧。
寫在結尾
我現在在爬蟲破解js方向上出現了技術瓶頸,上一次那個破解檢索網站也是萬事具備就差一個由js加密的參數,因為沒法解決js加密,最后又失敗了。想來想去,這個技術瓶頸只能是現在開始學習js,自己也學着來做下js加密數據。如此翻來覆去,想必js破解指日可待。等以后js學成后,我要自己加密自己破解。
另外文中所寫完全是我個人的思路。可能是正確的,可能是錯誤的,可能某部分偏了等等,如果你不幸看到我的隨筆,還不幸看到這個地方的話,十分真誠地希望你可以指正錯誤。
另外,如果后續破解成功,這篇文章還會更新的。