Bookmarklet YouTube
Voici comment je l'ai fait avec JavaScript
Commencez avec ytplayer.config.args
objet. Ceci contient toutes les URL de la vidéo. Il est divisé en
url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts // DASH: contains video or audio stream
Chacun de ceux-ci est un tableau séparé par des virgules de ce que j'appellerais des "objets de flux". Chaque "objet de flux" contiendra des valeurs comme celle-ci
url // direct HTTP link to a video
itag // code specifying the quality
s // signature, security measure to counter downloading
Chaque URL
sera codée , vous devrez donc les décoder. Maintenant la partie la plus délicate.
YouTube a au moins 3 niveaux de sécurité pour leurs vidéos
unsecured // as expected, you can download these with just the unencoded URL
s // see below
RTMPE // uses "rtmpe://" protocol, no known method for these
Les vidéos RTMPE sont généralement utilisées dans les longs métrages officiels et sont protégées par SWF Verification Type 2. Cela existe
depuis 2011
et n’a pas encore été désossé.
Les vidéos de type "s" sont les plus difficiles à télécharger. Vous les verrez typiquement sur les vidéos VEVO et similaires. Ils commencent par une signature telle que
AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5
Ensuite, la signature est brouillée avec une fonction comme celle-ci
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("")
}
Cette fonction est dynamique, elle change tous les jours. Pour rendre la tâche plus difficile, la fonction est hébergée sur une URL telle que
http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js
cela introduit le problème de la politique de
même origine . Essentiellement, vous ne pouvez pas télécharger ce fichier www.youtube.com
car il s’agit de domaines différents. Une solution de ce problème est
CORS . Avec CORS,
s.ytimg.com
pourrait ajouter cet en-tête
Access-Control-Allow-Origin: http://www.youtube.com
et cela permettrait au JavaScript de télécharger depuis www.youtube.com
. Bien sûr, ils ne le font pas. Une solution de contournement pour cette solution consiste à utiliser un proxy CORS. C'est un proxy qui répond avec toutes les requêtes avec l'en-tête suivant
Access-Control-Allow-Origin: *
Donc, maintenant que vous avez envoyé votre fichier JS par proxy et que vous avez utilisé la fonction pour brouiller la signature, vous pouvez l'utiliser dans la chaîne de requête pour télécharger une vidéo.