網頁對youtube真實播放地址進行分析,拉回來分辨率列表

先參照這篇博客寫sign,http://www.javashuo.com/article/p-dseesjzp-ed.html瞭解一下signhtml

 

而後開始youtube視頻真實地址分析,之因此用youtube作分析,是由於youtube並無作視頻切片,新建網站服務端不須要作不少工做,基本上均可以丟給瀏覽器客戶端用js作(使用客戶端作的話就另說了,這裏主要是說網頁作的思路)html5

 

youtube的下載連接以下:web

https://r5---sn-i3b7knlk.googlevideo.com/videoplayback?expire=1583084985&ei=WaFbXte7JeyE1d8PjO6d-A8&ip=112.120.125.249&id=o-APv2GZAKtidWtOg-EFLLI3FCRJEX4Pm9Lrq36teusL17&itag=251&source=**&requiressl=yes&mm=31,26&mn=sn-i3b7knlk,sn-npoeene6&ms=au,onr&mv=m&mvi=4&pl=19&initcwndbps=1313750&vprv=1&mime=audio/webm&gir=yes&clen=10471622&dur=811.281&lmt=1582982306022140&mt=1583063322&fvip=5&keepalive=yes&fexp=23842630,23882513&c=web&txp=6411222&sparams=expire,ei,ip,id,itag,source,requiressl,vprv,mime,gir,clen,dur,lmt&sig=ADKhkGMwRQIhAJL3b_OpRnLdUVNkTsVqfElLcsF0QunrlLFhSrHljixiAiAfs8bruj11w_XaI_b7DXfqB5mzFrI09ck-Jb2l2S2LZA==&lsparams=mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=ABSNjpQwRAIgMFcOcinalm6VxZBvWcAc-XLzCuCJEybydBY9Nvkig8sCIFjoxjIFMN6vNIxNuNLEY47GL8oMfu_MBIwnJJ45JpSn&alr=yes&cpn=EWtuRS6qSNVh1cH9&cver=html5&range=128635-262609&rn=6&rbuf=9524算法

 

youtube的連接比較有意思,F12 直接在頁面js中能夠分析的到,可是不必定能直接使用,我這裏用的是一個比較取巧的辦法,直接在我本身的網頁建立隱藏的video標籤而後動態引入youtube的js建立youtube使用到的對象,例如:yt.player.Application.create("player-api", ytplayer.config);api

而後建立的對象中有streamingData.adaptiveFormats,這裏面就有各類分辨率對應的實際播放地址了。能夠看到其實adaptiveFormats這個數組裏面不少分辨率,每一個分辨率詳細信息都有,這個其實也分了兩類型,跨域

1:有現成的url,其中是帶了sign的,這個sign是有效的,能夠直接使用。忽略數組

2,是這裏主要要說的,其中沒有呢url,只有cipher裏面帶有播放地址:瀏覽器

sp=sig&s=LDADKhkGMwRAIgO2V4zHeTrQij4NgtmxDJprA8i8ob-ec6T0OyomcQA7kCIB4tqWJZT_Kam_ACns7ewOeYpFbnljhsi1t2Stu0tb-a&url=https://r4---sn-t0a7sn7d.googlevideo.com/videoplayback?expire=1583086010&ei=WqVbXrCgAp-g4gGl97qoAw&ip=144.208.100.216&id=o-AN9N59pTxxxMvqooPmx30b9gn7N19gCRXrLIaPTZLM-j&itag=136&aitags=133,134,135,136,160,242,243,244,247,278,394,395,396,397,398&source=**&requiressl=yes&mm=31,26&mn=sn-t0a7sn7d,sn-vgqskned&ms=au,onr&mv=u&mvi=3&pl=22&vprv=1&mime=video/mp4&gir=yes&clen=24447277&dur=275.040&lmt=1575159615261812&mt=1583063918&fvip=4&keepalive=yes&fexp=23842630&c=WEB&txp=5535432&sparams=expire,ei,ip,id,aitags,source,requiressl,vprv,mime,gir,clen,dur,lmt&lsparams=mm,mn,ms,mv,mvi,pl&lsig=ABSNjpQwRAIgAOsUy0hgqIwEOMQ0zOW07Yx3Wf8ApVou3-YyJ_ZLD_wCIBBVODttEGNK707ikKBlXygvZt9_udXAiR3NlH6FteGW服務器

這個地址是沒法直接播放下載的,就是今天說的主角sign的問題了。youtube請求實際播放的時候會把這個sign從新計算,這裏面帶的就與服務器上計算後的對不上號了。ide

 

怎麼辦?能怎麼辦,固然就是須要咱們去分析怎麼計算他的這個sign,而後替換了。關鍵是在兩個cipher裏面的參數s=LDADKhkGMwRAIgO2V4zHeTrQij4NgtmxDJprA8i8ob-ec6T0OyomcQA7kCIB4tqWJZT_Kam_ACns7ewOeYpFbnljhsi1t2Stu0tb-a

其實上一步引入youtube的js的時候咱們就在建立對象了,這裏我也沒找到好辦法從他壓縮後的js中分析他計算的js,全憑感受和調試,而且後面你會發現,它引入的js 計算sign(也能夠叫加密或者解密吧)的函數並不會對外公開,因此在咱們網頁js中實際上是沒法直接使用的。這個不是咱們討論的重點,今天的重點實際上是如何計算他的sign達到咱們獲取能夠觀看下載的視頻地址。

 

咱們去youtube自帶的js中找到一個base.js的文件。這個就是咱們以前引入的js,一步一步的調試(實在沒找到好一點的分析方式,大佬們若是有好辦法能夠分享一下),能夠找到

var Js = {
cm: function(a, b) {
a.splice(0, b)
},
vB: function(a) {
a.reverse()
},
L3: function(a, b) {
var c = a[0];
a[0] = a[b % a.length];
a[b % a.length] = c
}
};

這一串,這個就是計算sign的具體函數了,這裏就須要用到cipher裏面的sig=後面的一串字符了。可是參數和值究竟怎樣,就有了下面一段js的發現

Ks = function(a) {
a = a.split("");
Js.L3(a, 54);
Js.vB(a, 21);
Js.L3(a, 68);
Js.vB(a, 80);
Js.cm(a, 2);
return a.join("")
}

注:這個函數裏面的具體調用,youtube都是在不停修改的,上面的三個具體實現的函數纔是不多變更的

 

 

咱們只要將s=LDADKhkGMwRAIgO2V4zHeTrQij4NgtmxDJprA8i8ob-ec6T0OyomcQA7kCIB4tqWJZT_Kam_ACns7ewOeYpFbnljhsi1t2Stu0tb-a這個s=後面內容傳入 Ks這個函數從新計算就能夠得出新的sign的值了

而後取出cipher中的url參數,用計算到的新字符串替換一下(若是沒有sig,參照cipher中的p參數加上對應的參數這裏就是&sig=),就能夠拿到能夠觀看下載的真實地址了。

 

至此,分析結束,後面就是用代碼實現了。

 

 

其實網站去解析youtube下載地址最主要的問題有兩個,

1,獲取youtube網頁內容跨域的問題,解決辦法是作個服務端中轉,這裏會引起另一個問題,youtube會封ip,因而服務端就加上代理。

2,即便是我從youtube的base.js中分析出了生成sign的函數,可是咱們沒法直接調用,base.js並未對外開放這個函數,並且youtube會頻繁改動這個算法,如何將這個函數也作成自動的呢?我暫時沒想出好辦法來,只是分析出來,而後複製出來寫入到本身js中,但願有大佬提點一下。固然若是是客戶端來作這個事,2的問題就不是問題了,大不了每次把js請求回來,當作字符串去分析,用正則找出這一串,生成本身的js文件而後調用。

 這裏說明一下,調試別人網站的js腳本,常常遇到網站在js中作處理,禁止客戶端調試,個人辦法實際上是對網站的js作重定向處理,本身搭建服務器,拉回網站js代碼,刪除禁止調試的相關代碼,而後配置host,將網站引用的js指向本機修改過的js。

相關文章
相關標籤/搜索