이 소프트웨어는 개인적인 용도로 사용되며 귀하가 사용하는 방식에 대해 책임을 지지 않습니다. 그러니 문제를 피하고, 전쟁이 아닌 항아리를 만드세요!
내 직업 활동 중 하나는 Redis에 대한 소문을 퍼뜨리는 것으로 구성되어 있으며 이는 비디오 및 라이브 웹 세미나와도 함께 진행됩니다. 최근에 저는 LinkedIn 라이브를 하고 있으며 Zoom에서 내 라이브를 방송하고 있는데 항상 "녹화" 버튼을 누르는 것을 기억하지 못합니다.
그런데 다행히 링크드인에서는 내 라이브 녹화를 '이전 녹화 라이브'로 보관해 나중에 시청할 수 있게 해준다. LinkedIn이 해당 동영상에 대해 제공하는 보존 기능에 대해 전혀 모르지만 그러한 동영상을 다운로드할 수 있는 방법을 제공하지 않는다는 것은 확실합니다.
그래서 주변을 검색해봤지만 심각한 내용은 찾을 수 없었습니다. 유튜브 다운로드, 핀터레스트 다운로더, 페이스북 다운로더, 링크드인 관련 다운로더는 모두 가짜였습니다.
따라서 나만의 LinkedIn 비디오 다운로더를 구축해야 합니다! ?
이제 아이디어는... 일종의 형식(mp4, webm, vid mkv, avi, mov 등)의 소스 1 에 대한 일부 비디오에 대한 링크(src 또는 href)를 찾을 수 없을 것 같습니다. , 하지만 비디오 스트리밍과 관련된 것을 찾을 수 있을 것 같지만... 소스 1 에서는 찾을 수 없지만 네트워크 수준에서는 확실합니다.
그래서 Chrome과 DevTools 바를 열고 네트워크 패널을 선택한 다음 주소 표시줄에 LinkedIn 비디오 이벤트 URL을 입력(붙여넣기)하고 Enter 키를 눌렀습니다!
그리고 그것이 내가 얻은 것입니다.
이제 비디오/스트림/청크/바이너리/무엇이든 나에게 종소리를 울리는 무언가를 찾아야 합니다. 그래서 네트워크 패널을 스크롤하기 시작했고 몇 번의 스크롤 후에 첫 번째 종소리가 들렸습니다! ?
같은 두루마리에서 더 잘 보이고, 다른 정보도 찾았습니다. ?
예, 메타데이터입니다. 하지만 우리가 거기에 도달하고 있다는 것을 알고 있습니다! 하지만 지금까지 얻은 내용을 살펴보겠습니다.
이제 우리는 그 조각들이 필요합니다.
조금 더 아래로 스크롤하면 여기에 첫 번째 조각이 있습니다. ?
마지막으로 바이너리 형식입니다! 영화의 일부여야 합니다.
컬을 이용한 빠른 확인...
터미널을 열고 복사하여 붙여넣으세요.
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 %
실제 영상인지 확인해 볼까요...
이것은 실제 비디오이며 전체 조각 목록에서 찾은 TARGETDURATION과 일치하는 약 2초 길이입니다. ?
계속 스크롤하면 여기에 있습니다.
조각, 나는 어디에서나 조각을 봅니다.
코드를 설명하지는 않겠습니다. 직접 살펴보실 수도 있지만 무엇이 필요했는지 말씀드릴 수 있습니다.
구현은 최선을 다해 고려해야 합니다. 즉, 내 컴퓨터에서 작동한다는 뜻입니다!
구현의 마지막 부분인 파일을 다시 다운로드/스트리밍하는 것은 @swathiprasad(Swathi Prasad) 및 그녀의 저장소 https://github.com/swathisprasad/download-using-streaming-response-body 덕분에 가능했습니다.
나머지는 물론 StackOverflow 덕분입니다.
원한다면 docker로 시도해 보세요:
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