ซอฟต์แวร์ชิ้นนี้มีไว้เพื่อการใช้งานส่วนตัวของฉัน และฉันจะไม่รับผิดชอบต่อวิธีที่คุณจะใช้งาน ดังนั้นจงหลีกเลี่ยงปัญหา ทำขวดโหลและอย่าทำสงคราม!
กิจกรรมงานอย่างหนึ่งของฉันคือการเผยแพร่ข่าวเกี่ยวกับ Redis ซึ่งรวมถึงวิดีโอและการสัมมนาผ่านเว็บแบบสดด้วย ล่าสุดฉันกำลังถ่ายทอดสดบน LinkedIn ถ่ายทอดสดจาก Zoom และไม่ใช่ทุกครั้งที่ฉันจำได้ว่าต้องกดปุ่ม "บันทึก"
อย่างไรก็ตาม และโชคดีที่ LinkedIn เก็บบันทึกการแสดงสดของฉันไว้เป็น "บันทึกการแสดงสดก่อนหน้านี้" เพื่อให้สามารถรับชมได้ในภายหลัง ฉันไม่ทราบเกี่ยวกับการรักษาที่ LinkedIn มอบให้สำหรับวิดีโอเหล่านั้น แต่ฉันแน่ใจว่าไม่มีวิธีดาวน์โหลดวิดีโอดังกล่าว
ฉันก็เลยสำรวจไปรอบๆ และก็ไม่พบอะไรร้ายแรงเลย การดาวน์โหลด YouTube, เครื่องมือดาวน์โหลด Pinterest, เครื่องมือดาวน์โหลด Facebook แต่ผู้ดาวน์โหลดทั้งหมดที่เกี่ยวข้องกับ LinkedIn เป็นเพียงของปลอม
ดังนั้น ฉันจึงต้องสร้าง LinkedIn Video Downloader ของตัวเองขึ้นมา! -
แนวคิดก็คือ... ฉันไม่คิดว่าฉันจะพบลิงก์ (src หรือ href) ไปยังวิดีโอบางรายการในแหล่งที่มา 1 ของรูปแบบบางประเภท (mp4, webm, vid mkv, avi, mov และอื่นๆ) แต่ฉันคิดว่าฉันจะพบสิ่งที่เกี่ยวข้องกับการสตรีมวิดีโอ... แต่ไม่ใช่ในแหล่งที่ มา 1 ในระดับเครือข่ายอย่างแน่นอน
ดังนั้นฉันจึงเปิด Chrome และแถบ DevTools เลือกแผงเครือข่าย จากนั้นฉันพิมพ์ (วาง) URL กิจกรรมวิดีโอ LinkedIn ของฉันลงในแถบที่อยู่และกด Enter!
และนั่นคือสิ่งที่ฉันได้รับ
ตอนนี้ฉันต้องค้นหาสิ่งที่ส่งเสียงกริ่งเกี่ยวกับวิดีโอ/สตรีม/ชิ้นข้อมูล/ไบนารี/อะไรก็ตาม... ดังนั้นฉันจึงเริ่มเลื่อนดูแผงเครือข่าย และหลังจากเลื่อนไม่กี่ครั้งฉันก็ได้ยินเสียงระฆังแรก! -
ดูดีกว่าในม้วนเดียวกันและฉันก็พบข้อมูลอื่นด้วย -
ใช่ ข้อมูลเมตา แต่ฉันรู้ว่าเรากำลังไปถึงจุดนั้นแล้ว! แต่มาดูกันว่าเราได้อะไรมาบ้าง:
ตอนนี้เราต้องการชิ้นส่วนเหล่านั้น
เลื่อนลงไปอีกหน่อยก็ถึงส่วนแรกแล้ว -
ในที่สุดก็มีรูปแบบไบนารี่! จะต้องเป็นส่วนหนึ่งของภาพยนตร์
เช็คด่วนด้วย Curl...
เปิดเทอร์มินัล คัดลอกและวาง...
foogaro@MBP-di-Luigi tmp % curl ' https://streamweu-livectorprodmedia17-euwe.licdn.com/44eefc72-771d-4bfd-8985-aede1310be0f/L4E609f69d951866001-livemanifest.ism/QualityLevels(3200000)/Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und) ' --compressed
Warning: Binary output can mess up your terminal. Use " --output - " to tell
Warning: curl to output it to your terminal anyway, or consider " --output
Warning: <FILE> " to save to a file.
foogaro@MBP-di-Luigi tmp % curl ' https://streamweu-livectorprodmedia17-euwe.licdn.com/44eefc72-771d-4bfd-8985-aede1310be0f/L4E609f69d951866001-livemanifest.ism/QualityLevels(3200000)/Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und) ' --compressed -O
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 158k 100 158k 0 0 868k 0 --:--:-- --:--:-- --:--:-- 924k
foogaro@MBP-di-Luigi tmp % ll
total 320
drwxr-xr-x 3 foogaro staff 96 24 Ago 22:37 .
drwxr-xr-x 6 foogaro staff 192 24 Ago 22:37 ..
-rw-r--r-- 1 foogaro staff 162808 24 Ago 22:37 Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und)
foogaro@MBP-di-Luigi tmp % file Fragments ( video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und )
Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und): MPEG transport stream data
foogaro@MBP-di-Luigi tmp % curl ' https://streamweu-livectorprodmedia17-euwe.licdn.com/44eefc72-771d-4bfd-8985-aede1310be0f/L4E609f69d951866001-livemanifest.ism/QualityLevels(3200000)/Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und) ' --compressed -o video.mpeg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 158k 100 158k 0 0 926k 0 --:--:-- --:--:-- --:--:-- 981k
foogaro@MBP-di-Luigi tmp % ll
total 640
drwxr-xr-x 4 foogaro staff 128 24 Ago 22:39 .
drwxr-xr-x 6 foogaro staff 192 24 Ago 22:37 ..
-rw-r--r-- 1 foogaro staff 162808 24 Ago 22:37 Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und)
-rw-r--r-- 1 foogaro staff 162808 24 Ago 22:39 video.mpeg
foogaro@MBP-di-Luigi tmp %
มาดูกันว่าจะเป็นวิดีโอจริงหรือไม่...
มันเป็นวิดีโอจริง และมีความยาวประมาณ 2 วินาที ซึ่งตรงกับ TARGETDURATION ที่เราพบในรายการส่วนย่อยทั้งหมด -
เลื่อนต่อไปและนี่คือ
ชิ้นส่วน ฉันเห็นชิ้นส่วนทุกที่
ฉันจะไม่อธิบายโค้ดนี้ คุณสามารถดูได้ด้วยตัวเอง แต่ฉันสามารถบอกคุณได้ว่าอะไรคือสิ่งที่จำเป็น:
การใช้งานจะต้องได้รับการพิจารณาอย่างดีที่สุด ซึ่งหมายความว่าใช้งานได้บนคอมพิวเตอร์ของฉัน!
ส่วนสุดท้ายของการใช้งานการดาวน์โหลด / สตรีมไฟล์กลับมานั้นเป็นไปได้ด้วย @swathisprasad (Swathi Prasad) และ repo ของเธอ https://github.com/swathisprasad/download-using-streaming-response-body
ที่เหลือต้องขอบคุณ StackOverflow อย่างแน่นอน
ลองใช้นักเทียบท่าหากคุณต้องการ:
foogaro@MBP-di-Luigi linkedin-video-downloader % docker run -it --rm=true -p 8080:8080 foogaro/linkedin-video-downloader
. ____ _ __ _ _
/ \ / ___ ' _ __ _ _(_)_ __ __ _
( ( )___ | ' _ | ' _| | ' _ / _ ` |
\ / ___) | | _) | | | | | || (_ | | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.0)
2022-08-24 22:57:01.107 INFO 1 --- [ main] c.foogaro.data.LinkedInVideoApplication : Starting LinkedInVideoApplication v1.0.0 using Java 11.0.16.1 on c543811fe9f3 with PID 1 (/app/app.jar started by root in /app)
2022-08-24 22:57:01.121 INFO 1 --- [ main] c.foogaro.data.LinkedInVideoApplication : No active profile set, falling back to 1 default profile: "default"
2022-08-24 22:57:03.037 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-08-24 22:57:03.060 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-08-24 22:57:03.060 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
2022-08-24 22:57:03.171 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-08-24 22:57:03.171 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1969 ms
2022-08-24 22:57:03.900 INFO 1 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2022-08-24 22:57:04.286 INFO 1 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path ' /actuator '
2022-08-24 22:57:04.363 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ' '
2022-08-24 22:57:04.391 INFO 1 --- [ main] c.foogaro.data.LinkedInVideoApplication : Started LinkedInVideoApplication in 3.931 seconds (JVM running for 4.532)
2022-08-24 22:57:05.282 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet ' dispatcherServlet '
2022-08-24 22:57:05.283 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet ' dispatcherServlet '
2022-08-24 22:57:05.289 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms
2022-08-24 22:57:21.779 INFO 1 --- [nio-8080-exec-7] c.f.d.c.LinkedInVideoController : Steaming video download as: linkedin-video-1661421441774.zip
2022-08-24 22:57:21.800 INFO 1 --- [ taskExecutor-1] c.f.d.c.LinkedInVideoController : Video ID: c50f2327-7fa7-4cc8-8a2c-35711eb5296d/L4E60a4445e9d065000
2022-08-24 22:57:21.800 INFO 1 --- [ taskExecutor-1] c.f.d.c.LinkedInVideoController : Quality Level: 3200000
2022-08-24 22:57:21.991 INFO 1 --- [ taskExecutor-1] c.f.d.c.LinkedInVideoController : Number of video fragments: 2154
ขอบคุณสำหรับการอ่านจนถึงตอนนี้!
หากคุณชอบหรือเห็นว่ามีประโยชน์ ให้ดาวฉันด้วย!
ยินดีต้อนรับ PR ทั้งในส่วนหน้าและส่วนหลัง! -
ฉันโกหก ฉันมองหาลิงก์ของวิดีโอในแหล่งที่มาของหน้าแล้ว! - ↩ ↩ 2