该存储库包含我用来下载LinkedIn实时视频的脚本。
要使用脚本,请在linkedin.sh
中修改PUBLIC_URL
和VIDEO_ID
变量。
我最近在社区聚会上发表了演讲,他们正在使用花哨的新LinkedIn Live来播放活动。赛后,我决定要看视频的副本,但LinkedIn似乎并不同意我的视频副本。另外,现有的视频下载网站都没有奏效,其他人在线提供的建议也没有。显然,LinkedIn改变了他们的视频方式。所以。是网络标签!
这篇简短的帖子记录了我如何在Chrome Console和Shell脚本上进行一些黑客攻击的LinkedIn视频。您应该对命令行感到满意,以便可以解决问题。
因此,您已经看到了一个LinkedIn帖子,其中包含您想要本地可用的视频。我们首先单击视频,以便以剧院的模式打开。对于我的视频,URL看起来像:
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
加载页面后,请勿播放- 打开Chrome Console,然后转到网络选项卡。现在点击播放并查找“网络”选项卡以manifest(format=m3u8-aapl-v3)
调用。这个电话似乎是在要求检索视频的可能变体,并且响应应看起来类似于:
#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)
上面的清单用于确定当BANDWIDTH
高于一定速率时应流QualityLevel
。我们将看到以后如何使用。
上述请求应在上述请求完成后不久提出的下一个兴趣请求应具有名称Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
。单击它并转到“响应”选项卡,您应该看到一个由这样的行组成的巨大文件:
...
#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)
...
这些显然定义了通过浏览器流式传输以形成完整视频的视频片段列表。
略低于上述请求,您将找到名为Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
。好吧,那看起来不熟悉吗?
查看这些请求的通话的完整URL(右键单击行,复制为卷发),您应该发现它类似于以下格式:
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)
注意QualityLevels
和Fragments
。这是检索整理以形成视频的数据片段的呼吁。
因此,我们现在知道视频是如何流式传输的,我们可以通过以下方式最少复制此视频。
manifest...
,请注意QualityLevel
Manifest...
,将URL复制为curl命令QualityLevel
s,修改卷曲请求中的URL,以使其质量最高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 ;