62 votes

Comment fonctionnent tous ces services de "sauvegarde des vidéos de YouTube" ?

Je veux dire, comment fonctionnent-ils, en général ? Comment reçoivent-ils le lien vers le flux vidéo lui-même (et pas seulement la page contenant un lecteur Flash) ?

J'ai cherché sur le web mais je n'ai rien trouvé d'utile, tous les liens pointent vers de tels services, mais aucun n'indique comment ils sont réellement mis en œuvre.

52voto

slhck Points 209720

Il existe un téléchargeur en ligne de commande à code source ouvert très populaire appelé youtube-dl qui fait exactement cela. Il récupère les liens vers les fichiers vidéo et audio d'un lien YouTube donné - ou de tout autre site vidéo en ligne populaire comme Vimeo, Yahoo ! Video, uStream, etc.

Pour voir comment cela se passe, regardez dans la page d'accueil du site Web de la Commission européenne. Extracteur YouTube . C'est trop pour être montré ici. D'autres extracteurs existent pour les sites plus simples .

Pour trouver le flux vidéo, vous devez vous faire passer pour le client réel du navigateur, qui essaie de charger la vidéo. Cela signifie qu'il faut d'abord analyser le code HTML, charger le code Javascript correspondant et initialiser un objet lecteur, qui lit la vidéo par l'intermédiaire d'un fichier HTML <video> élément.

Cela signifie que quelque part dans l'exécution du Javascript, il y a un code d'initialisation pour le lecteur, contenant des paramètres importants comme l'endroit où trouver la vidéo.

Dans le cas le plus simple, la vidéo peut être présentée comme une URL vers un fichier MP4, directement dans un objet de configuration. Il est très facile d'analyser ce type d'URL en regardant la balise src de l'attribut <video> élément. Mais elle peut aussi être générée à la volée avec des jetons de téléchargement spécifiques négociés entre le client et un serveur d'authentification. La vidéo peut également être diffusée par un blob Vous ne pouvez donc pas le voir directement, car il est généré par l'intermédiaire de l'URL. API de MediaSource .

Souvent, le code Javascript lui-même est obscurci pour rendre plus difficile sa réingénierie, en utilisant des variables telles que xyz plutôt que player .

De nos jours, la plupart des sites web vidéo utilisent le MPEG-DASH ou le HTTP Live Streaming (HLS) d'Apple en arrière-plan. Ces systèmes n'utilisent pas d'URL directe vers un fichier vidéo, mais fonctionnent avec un fichier dit "manifeste". Le manifeste fournit des méta-informations pour obtenir le flux vidéo réel. Le fichier manifeste ( .mpd par exemple dans DASH, et .m3u8 pour HLS) contiendra des liens vers des segments vidéo et audio, qu'il faudra ensuite combiner pour obtenir un fichier lisible.

De nombreux sites Web transmettent ces manifestes du serveur au lecteur client. Si vous pouvez inspecter les requêtes réseau effectuées par le client, vous trouverez peut-être une .mpd que vous pouvez ensuite utiliser pour télécharger les segments vidéo à partir de votre propre client.

Toutefois, le manifeste pourrait également être transmis par d'autres canaux latéraux, intégré dans un code Javascript, généré à la volée, etc. Pour youtube-dl vous pouvez voir comment le code tente d'extraire l'URL du manifeste DASH à partir des informations de configuration transmises.

Il n'y a pas de solution générale pour cela. Il faut inspecter et déboguer soigneusement le site cible.

38voto

Red Tux Points 2074

Commencez par une vidéo typique :

https://www.youtube.com/watch?v=XeojXq6ySs4

En utilisant le même ID, construisez une URL comme celle-ci :

https://www.youtube.com/get_video_info?eurl=https://www.youtube.com&video_id=XeojXq6ySs4

La réponse sera une chaîne de requête, comme celle-ci (modifiée pour plus de lisibilité) :

innertube_api_version=v1&
innertube_context_client_version=2.20210504.09.00&
player_response=%7B%22responseContext%22%3A%7B%22serviceTrackingParams%22%3A...
ps=desktop-polymer&
root_ve_type=27240&

Extraire le player_response valeur. Ce sera un objet JSON, comme ceci :

{
  "streamingData": {
    "adaptiveFormats": [
      {
        "itag": 137,
        "mimeType": "video/mp4; codecs=\"avc1.640020\"",
        "bitrate": 570464,
        "height": 1080,
        "signatureCipher": "s=VZVZOq0QJ8wRgIhANWm3sPF-2hbzQQGrErjQFMNmxTfALco..."
      }
    ]
  }
}

Puis extraire le signatureCipher il s'agit d'une chaîne de requête, comme ceci :

sp=sig&
s=VZVZOq0QJ8wRgIhANWm3sPF-2hbzQQGrErjQFMNmxTfALcoZkZ4IVR1djIpAiEA8HFKix6d4B3T...&
url=https://r3---sn-q4flrnek.googlevideo.com/videoplayback%3Fexpire%3D16201927...

El url est l'URL vers l'audio ou la vidéo. Cependant, avant de pouvoir accéder à l URL, vous devez ajouter une entrée à la chaîne de requête. La nouvelle clé, est la valeur sous sp ci-dessus ( sig dans ce cas). La nouvelle valeur, est la valeur sous s au-dessus de ( VZVZOq0QJ8wRgIhANWm3sPF-2hbzQQGrErjQFMNmxTfALcoZkZ4IVR1djIpA... dans ce cas). Cependant, avant de pouvoir ajouter la nouvelle entrée, vous devez décoder l'adresse de l'utilisateur. s valeur. Pour décoder la valeur, suivez les étapes suivantes. Tout d'abord, visitez la page d'origine :

https://www.youtube.com/watch?v=XeojXq6ySs4

Dans le code source, il y aura un texte comme celui-ci :

/s/player/3e7e4b43/player_ias.vflset/en_US/base.js

que vous pouvez transformer en :

https://www.youtube.com/s/player/3e7e4b43/player_ias.vflset/en_US/base.js

Dans cette nouvelle page, il y aura du code comme celui-ci :

var uy={an:function(a){a.reverse()},
gN:function(a,b){a.splice(0,b)},
J4:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c}};
vy=function(a){a=a.split("");uy.gN(a,2);uy.J4(a,47);uy.gN(a,1);uy.an(a,49);
uy.gN(a,2);uy.J4(a,4);uy.an(a,71);uy.J4(a,15);uy.J4(a,40);return a.join("")};

Prenez l'original s et le faire passer par cette fonction :

vy('_l_lOq0QJ8wRAIgc-yNc9Z4lSO2CozG4B-W9uC5zeuTATDvqHlnQaHGNmkCICsZJGbEjKDmD...')

Le résultat sera à peu près le même, mais brouillé :

AOq0QJ8wRAIgc-ylc9Z4lSO2CozG4B-W9uC5zeuTNTDvqH_nQaHGNmkCICsZJGbEjKDmDSnKg_atTR...

Enfin, vous pouvez construire l'URL qui en résulte :

https://r3---sn-q4fl6nz7.googlevideo.com/videoplayback?vprv=1&
id=o-AHThxQXyxJ3jfw5EBUJeT0IJLrdQeYpMdCsCImMfbuac&
sig=AOq0QJ8wRAIgc-ylc9Z4lSO2CozG4B-W9uC5zeuTNTDvqH_nQaHGNmkCICsZJGbEjKDmDSnKg_...

J'ai une bibliothèque et un programme qui effectue ces étapes :

https://pkg.go.dev/github.com/89z/mech/youtube

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X