ที่เก็บนี้มีสคริปต์ที่ฉันเคยดาวน์โหลดวิดีโอ LinkedIn Live
หากต้องการใช้สคริปต์ให้แก้ไขตัวแปร PUBLIC_URL
และ VIDEO_ID
ใน linkedin.sh
ฉันได้พูดคุยเมื่อเร็ว ๆ นี้ในการพบปะกันของชุมชนที่พวกเขาใช้ LinkedIn Live ใหม่แฟนซีเพื่อสตรีมเหตุการณ์ โพสต์เหตุการณ์ฉันตัดสินใจว่าฉันต้องการสำเนาวิดีโอ แต่ LinkedIn ดูเหมือนจะไม่เห็นด้วยกับฉันว่าฉันควรจะมีสำเนาวิดีโอของฉัน นอกจากนี้ไม่มีเว็บไซต์ ดาวน์โหลดวิดีโอ ที่มีอยู่เดิมและไม่มีคำแนะนำใด ๆ ที่ให้โดยคนอื่น ๆ ออนไลน์ก็ทำเช่นกัน เห็นได้ชัดว่า LinkedIn เปลี่ยนวิธีที่พวกเขาทำวิดีโอ ดังนั้น. แท็บเครือข่ายมันคือ!
โพสต์สั้น ๆ นี้เอกสารวิธีที่ฉันจัดการเพื่อดาวน์โหลดวิดีโอ LinkedIn พร้อมแฮ็คเล็กน้อยบนคอนโซล Chrome และ Shell Scripts คุณควรจะสบายใจกับบรรทัดคำสั่งสำหรับสิ่งที่จะได้ผล
ดังนั้นคุณได้เห็นโพสต์ LinkedIn พร้อมวิดีโอที่คุณต้องการให้พร้อมใช้งานในพื้นที่ เราเริ่มต้นด้วยการคลิกที่วิดีโอเพื่อให้เปิดขึ้นในโหมดเหมือนละคร สำหรับวิดีโอของฉัน URL ดูเหมือน:
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
เมื่อโหลดหน้าเว็บแล้ว อย่าเข้าเล่น - เปิดคอนโซลโครเมี่ยมและไปที่แท็บเครือข่าย ตอนนี้กดปุ่มเล่นและมองออกไปที่แท็บเครือข่ายเพื่อ 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)
รายการข้างต้นใช้เพื่อกำหนดว่าควรมีการสตรีม QualityLevel
ระดับใดเมื่อแบน BANDWIDTH
สูงกว่าอัตราที่กำหนด เราจะดูว่าจะใช้ในภายหลังอย่างไร
คำขอครั้งต่อไปที่น่าสนใจซึ่งควรจะมาไม่นานหลังจากที่คำขอข้างต้นเสร็จสมบูรณ์ควรมีชื่อ 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 เป็นคำสั่ง CURLQualityLevel
จากขั้นตอนที่ 2 แก้ไข URL ในคำขอ CURL เพื่อให้คุณภาพสูงสุด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 ;