YouTube Bookmarklet
Tak właśnie zrobiłem z JavaScript
Zacznij od ytplayer.config.args
obiektu. Zawiera wszystkie adresy URL filmu. Jest podzielony na
url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts // DASH: contains video or audio stream
Każdy z nich jest tablicą oddzieloną przecinkami tego, co nazwałbym „obiektami strumieniowymi”. Każdy „obiekt strumienia” będzie zawierał takie wartości
url // direct HTTP link to a video
itag // code specifying the quality
s // signature, security measure to counter downloading
Każdy adres URL
zostanie zakodowany, więc będziesz musiał go odkodować. Teraz trudna część.
YouTube ma co najmniej 3 poziomy bezpieczeństwa dla swoich filmów
unsecured // as expected, you can download these with just the unencoded URL
s // see below
RTMPE // uses "rtmpe://" protocol, no known method for these
Filmy RTMPE są zwykle używane w oficjalnych pełnometrażowych filmach i są chronione za pomocą SWF Verification Type 2. Jest to
od 2011 roku
i nie zostało jeszcze poddane inżynierii wstecznej.
Filmy typu „s” są najtrudniejsze do pobrania. Zazwyczaj zobaczysz je na filmach VEVO i podobnych. Zaczynają od podpisu, takiego jak
AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5
Następnie podpis jest kodowany za pomocą takiej funkcji
function mo(a) {
a = a.split("");
a = lo.rw(a, 1);
a = lo.rw(a, 32);
a = lo.IC(a, 1);
a = lo.wS(a, 77);
a = lo.IC(a, 3);
a = lo.wS(a, 77);
a = lo.IC(a, 3);
a = lo.wS(a, 44);
return a.join("")
}
Ta funkcja jest dynamiczna i zazwyczaj zmienia się każdego dnia. Aby utrudnić, funkcja jest hostowana pod adresem URL takim jak
http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js
wprowadza to problem polityki tego
samego pochodzenia . Zasadniczo nie można pobrać tego pliku, www.youtube.com
ponieważ są to różne domeny. Obejściem tego problemu jest
CORS . W przypadku CORS
s.ytimg.com
można dodać ten nagłówek
Access-Control-Allow-Origin: http://www.youtube.com
i pozwoliłoby na pobieranie JavaScript z www.youtube.com
. Oczywiście, że tego nie robią. Obejściem tego obejścia jest użycie serwera proxy CORS. Jest to serwer proxy, który odpowiada na wszystkie żądania następującym nagłówkiem
Access-Control-Allow-Origin: *
Więc teraz, gdy masz już proxy swojego pliku JS i użyłeś funkcji do szyfrowania podpisu, możesz użyć tego w zapytaniu, aby pobrać wideo.