Ce référentiel contient un script que j'ai utilisé pour télécharger des vidéos LinkedIn en direct.
Pour utiliser le script, modifiez les variables PUBLIC_URL
et VIDEO_ID
dans linkedin.sh
.
J'ai donné une conférence récemment lors d'une rencontre communautaire où ils utilisaient le nouveau LinkedIn Live pour diffuser l'événement. Après l'événement, j'ai décidé que je voulais une copie de la vidéo, mais LinkedIn ne semblait pas être d'accord avec moi que je devrais avoir une copie de ma vidéo. De plus, aucun des sites Web de téléchargeur vidéo existants n'a fonctionné, et aucun des conseils donnés par d'autres personnes en ligne ne l'a fait également. Apparemment, LinkedIn avait changé la façon dont ils avaient fait des vidéos. Donc. L'onglet réseau c'était!
Ce court article documente la façon dont j'ai réussi à télécharger une vidéo LinkedIn avec un peu de piratage sur la console Chrome et les scripts shell. Vous devriez être à l'aise avec la ligne de commande pour que les choses fonctionnent.
Vous avez donc vu un article LinkedIn avec une vidéo que vous souhaitez localement disponible. Nous commençons par cliquer sur la vidéo afin qu'elle s'ouvre en mode de type théâtre. Pour ma vidéo, l'URL ressemblait:
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
Une fois la page chargée, ne frappez pas le jeu - ouvrez la console Chrome et accédez à l'onglet réseau. Maintenant, appuyez sur Play et regardez l'onglet réseau pour un appel manifest(format=m3u8-aapl-v3)
. Cet appel semble faire une demande pour récupérer les variantes possibles de la vidéo et la réponse doit ressembler à:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=351536,RESOLUTION=340x192,CODECS="avc1.64000d,mp4a.40.5"
QualityLevels(200000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=709236,RESOLUTION=384x216,CODECS="avc1.640015,mp4a.40.5"
QualityLevels(550000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=1015836,RESOLUTION=512x288,CODECS="avc1.640015,mp4a.40.5"
QualityLevels(850000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=1526836,RESOLUTION=704x396,CODECS="avc1.64001e,mp4a.40.5"
QualityLevels(1350000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=2395536,RESOLUTION=960x540,CODECS="avc1.64001f,mp4a.40.5"
QualityLevels(2200000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=3724136,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.5"
QualityLevels(3500000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=138976,CODECS="mp4a.40.5"
QualityLevels(128000)/Manifest(audio_und,format=m3u8-aapl-v3)
Le manifeste ci-dessus est utilisé pour déterminer ce que QualityLevel
doit être diffusée lorsque la BANDWIDTH
est supérieure à un certain taux. Nous verrons comment cela est utilisé plus tard.
La prochaine demande d'intérêt qui devrait arriver peu de temps après la demande ci-dessus doit avoir le nom Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
. En cliquant dessus et en allant à l'onglet Réponse, vous devriez voir un énorme fichier qui se compose de lignes comme celles-ci:
...
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_1%,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_2%,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_3%,format=m3u8-aapl-v3,audiotrack=audio_und)
...
Ceux-ci définissent apparemment la liste des fragments vidéo qui passent à travers vos navigateurs pour former la vidéo complète.
En regardant légèrement en dessous de la demande ci-dessus, vous trouverez des appels de réseau nommés Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
. Eh bien, cela ne semble-t-il pas familier?
Consultez l'URL complète de l'appel (clic droit sur la ligne, copier comme Curl) de ces demandes et vous devriez le trouver ressemble au format suivant:
https://streamwus2-livectorprodmedia11-usw22.licdn.com/%UUID%/%SOME_VIDEO_ID%-livemanifest.ism/QualityLevels(2200000)/Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
Remarquez les QualityLevels
et Fragments
. C'est l'appel qui récupère les fragments de données qui sont rassemblés pour former votre vidéo.
Nous savons donc maintenant comment la vidéo est diffusée, nous pouvons reproduire cela au minimum par:
manifest...
, notez le QualityLevel
Manifest...
, copiez l'URL en tant que commande CurlQualityLevel
de l'étape 2, modifiez l'URL dans la demande de boucle afin qu'elle soit de la plus haute qualitémanifest
.cat ./manifest | grep -v '#' | cut -f 2 -d '=' | cut -f 1 -d ',' > ./fragment_ids
touch video.mp4
while read FRAGMENT_ID ; do
echo ' processing ${FRAGMENT_ID} ' ;
curl ... >> video.mp4
done < ./fragment_ids ;