Это программное обеспечение предназначено для моего личного использования, и я не несу ответственности за то, как вы собираетесь его использовать. Так что избегайте неприятностей, делайте баночки, а не войны!
Одна из моих должностей заключается в распространении информации о Redis, включая видео и живые вебинары. В последнее время я провожу прямые эфиры в LinkedIn, веду прямые трансляции из Zoom, и не всегда помню, что нажимаю кнопку «Запись».
Однако, к счастью, LinkedIn сохраняет запись моего выступления как «Ранее записанное выступление», чтобы его можно было посмотреть позже. Я понятия не имею о сроках хранения, которые LinkedIn обеспечивает для этих видео, но я уверен, что LinkedIn не предоставляет возможности загружать такие видео.
Итак, я погуглил и не нашел ничего серьезного. Загрузка YouTube, загрузчик Pinterest, загрузчик Facebook, но все загрузчики, связанные с LinkedIn, были просто фейками.
Итак, мне нужно создать свой собственный загрузчик видео LinkedIn! ?
Итак, идея была... Не думаю, что найду ссылку (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 (Свати Прасад) и ее репозиторию 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
Спасибо, что дочитали до сих пор!
Если вам понравилось или было полезно, поставьте мне звезду!
Пиар более чем приветствуется, как на фронтенде, так и на бэкенде! ?
Я соврал, я ведь искал ссылку на видео в исходнике страницы! ? ↩ ↩ 2