이 저장소에는 LinkedIn 라이브 비디오를 다운로드하는 데 사용했던 스크립트가 포함되어 있습니다.
스크립트를 사용하려면 linkedin.sh
에서 PUBLIC_URL
및 VIDEO_ID
변수를 수정하십시오.
나는 최근에 커뮤니티 모임에서 대화를 나누었고, 그들은 멋진 새로운 Linkedin Live를 사용하여 행사를 스트리밍했습니다. 이벤트 후, 나는 비디오 사본을 원한다고 결정했지만 LinkedIn은 비디오 사본이 있어야한다는 데 동의하지 않았습니다. 또한 기존 비디오 다운로더 웹 사이트 중 어느 것도 효과가 없었으며 온라인으로 다른 사람들이 제공 한 조언도하지 않았습니다. 분명히 LinkedIn은 비디오를 수행 한 방식을 변경했습니다. 그래서. 네트워크 탭이었다!
이 짧은 게시물은 Chrome 콘솔 및 쉘 스크립트에서 약간의 해킹으로 LinkedIn 비디오를 다운로드하는 방법을 문서화합니다. 일이 해결되도록 명령 줄에 익숙해야합니다.
따라서 로컬에서 원하는 비디오가 포함 된 LinkedIn 게시물을 보았습니다. 우리는 비디오가 극장과 같은 모드로 열리도록 비디오를 클릭하여 시작합니다. 내 비디오의 경우 URL은 다음과 같습니다.
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
페이지가로드되면 플레이를 치르지 마십시오 . Chrome 콘솔을 열고 네트워크 탭으로 이동하십시오. 이제 플레이를 치고 네트워크 탭에서 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 (행을 마우스 오른쪽 버튼으로 클릭하고 CURL로 복사)을 확인하면 다음 형식과 유사해야합니다.
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을 컬 명령으로 복사하십시오.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 ;