このリポジトリには、LinkedInライブビデオをダウンロードするために使用したスクリプトが含まれています。
スクリプトを使用するには、 linkedin.sh
のPUBLIC_URL
とVIDEO_ID
変数を変更します。
私は最近、コミュニティミートアップで講演を行い、そこで彼らはイベントをストリーミングするために派手な新しいLinkedIn Liveを使用していました。イベント後、私はビデオのコピーが欲しいと決めましたが、LinkedInは自分のビデオのコピーを持っているべきだと私に同意しなかったようです。また、既存のビデオダウンローダーのWebサイトはどれも機能しておらず、他の人々からオンラインで与えられたアドバイスもありませんでした。どうやらLinkedInはビデオのやり方を変えていたようです。それで。ネットワークタブでした!
この短い投稿では、Chromeコンソールとシェルスクリプトを少しハッキングしてLinkedInビデオをダウンロードする方法を説明しています。コマンドラインに慣れる必要があります。
そのため、ローカルで利用可能なビデオが掲載されているLinkedInの投稿を見ました。まず、ビデオをクリックして、演劇のようなモードで開くようにします。私のビデオでは、URLは次のように見えました。
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
ページが読み込まれたら、再生をヒットしないでください-Chromeコンソールを開き、[ネットワーク]タブに移動します。ここで、Play 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(行を右クリック、copyとしてコピー)をチェックしてください。次の形式に似ていることがわかります。
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を参照して、CURL要求の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 ;