Як працюють усі ці служби "Зберегти відео з YouTube"?


62

Я маю на увазі, як вони взагалі працюють? Як вони отримують посилання на сам відеопотік (а не лише на сторінку, що містить Flash-плеєр)?

Я здійснив пошук в Інтернеті, але не зміг знайти нічого корисного (усі посилання вказують на такі сервіси, але жодна з них не говорить про те, як вони реально реалізовані).

Відповіді:


51

Існує дуже популярний завантажувач командного рядка з відкритим кодом youtube-dl, який називається саме цим. Він захоплює фактичні посилання на відео та аудіо з певного посилання на YouTube - або з будь-якого іншого популярного веб-сайту, наприклад Vimeo, Yahoo! Відео, uStream тощо.

Щоб побачити, як це робиться, загляньте в витяжку YouTube . Це просто занадто багато, щоб показати тут. Інші витяжки існують для більш простих сайтів . Стівен Пенні також має простий завантажувач JavaScript для YouTube, що трохи простіше .

Але, по суті, для відеоплеєра Flash його потрібно ініціалізувати та налаштувати через деякий JavaScript. Простіше кажучи, програвач об’єкта Flash отримає URL-адресу відеопотоку для завантаження.

Щоб знайти відеопотік, вам доведеться проаналізувати HTML та JS-код сторінки відео, щоб знайти відповідний код ініціалізації, а потім звідти спробувати знайти посилання на фактичний файл MP4. Він може бути там у простому тексті, але він також може бути згенерований на льоту за допомогою певних маркерів для завантаження. Часто JavaScript заплутаний, щоб ускладнити його перепроектування. Або інформація про відео може міститися у файлі XML, завантажений асинхронно JS.

Для відео з прогресивним завантаженням HTML5 зазвичай фактичний вихідний файл згадується безпосередньо в sourceдочірньому videoтезі, тож якщо ви шукаєте сторінку mp4або подібну. Наприклад, у німецькому новинному шоу Tagesschau 100 , ви знайдете:

<source src="http://media.tagesschau.de/video/2014/0626/TV-20140626-1649-5801.webl.h264.mp4" type="video/mp4">

Для більш досконалих технологій відтворення, таких як MPEG DASH або Apple HTTP Live Streaming (HLS) Apple, вам потрібно проаналізувати файл метаінформації, щоб отримати фактичний відеопотік. Мета-файл ( .mpdнаприклад, у DASH та .m3u8HLS) міститиме посилання на сегменти відео та аудіо, які згодом вам доведеться об’єднати, щоб отримати відтворюваний файл.

Загального рішення для цього немає. Це вимагає ретельного огляду та налагодження цільової ділянки.


3
Одне питання, що таке політика Youtube / Google щодо цього? Вони в порядку з цим, чи не так багато?
JMK

31
Умови використання YouTube у §5.1.L забороняють споживання їх вмісту будь-яким іншим способом, крім потокового, тому теоретично це заборонено. На практиці вони не зможуть цього застосувати. Будь-який завантажувач може більш-менш імітувати, що це просто потокове передавання.
slhck

2
@StevenPenny Чи є у вас якісь не змінені версії?
TankorSmash

5
@slhck Flash також може робити запити HTTP самостійно. Натомість він використовує HTTP-механізм браузера. Якби Flash сам робив запити, вони не були "видимими" для браузера. Звичайно, було б чудово для рекламодавців. ;)
Даніель Б

3
@slhck вони не можуть це застосувати програмно , але якщо вони отримали свою адвокатську команду, чи могли б вони це застосувати на законних підставах ?
Cruncher

35

Закладка YouTube

Ось як я це зробив за допомогою JavaScript

Почніть з ytplayer.config.argsоб’єкта. Тут містяться всі URL-адреси відео. Він розпадається на

url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts              // DASH: contains video or audio stream

Кожен із них є масивом, розділеним комами, того, що я б назвав "об'єктами потоку". Кожен "потоковий об'єкт" буде містити такі значення

url  // direct HTTP link to a video
itag // code specifying the quality
s    // signature, security measure to counter downloading

Кожна URL-адреса буде закодована, тому вам потрібно буде їх розшифрувати. Тепер хитра частина.

YouTube має принаймні 3 рівні безпеки своїх відео

unsecured // as expected, you can download these with just the unencoded URL
s         // see below
RTMPE     // uses "rtmpe://" protocol, no known method for these

Відео RTMPE, як правило, використовується в офіційних повнометражних фільмах і захищено SWF Verification Type 2. Це існувало з 2011 року і ще не має бути розроблене на зворотному рівні.

Відео типу "s" - найскладніші, які фактично можна завантажити. Типово їх ви побачите на відео VEVO тощо. Вони починаються з підпису типу

AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5

Тоді підпис зашифровується з такою функцією

function mo(a) {
  a = a.split("");
  a = lo.rw(a, 1);
  a = lo.rw(a, 32);
  a = lo.IC(a, 1);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 44);
  return a.join("")
}

Ця функція динамічна, вона зазвичай змінюється щодня. Щоб ускладнити функцію, розміщується за такою URL-адресою, як

http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js

це вводить проблему політики однакового походження . По суті, ви не можете завантажити цей файл з, www.youtube.comоскільки це різні домени. Вирішення цієї проблеми - CORS . За допомогою CORS s.ytimg.comможна додати цей заголовок

Access-Control-Allow-Origin: http://www.youtube.com

і це дозволить завантажити JavaScript з www.youtube.com. Звичайно, вони цього не роблять. Вирішення цього способу полягає у використанні проксі-сервера CORS. Це проксі-сервер, який відповідає наступним заголовком на всі запити

Access-Control-Allow-Origin: *

Отже, тепер, коли ви проксирували файл JS і використовували функцію для скремтування підпису, ви можете використовувати це в рядку запитів для завантаження відео.


1
Чи знаєте ви (для відтворення DASH), як плеєр YouTube визначає діапазони байтів, які потрібно запитувати від представлення медіа? Файл MPD містить лише сегменти.
slhck

2
Не зовсім так. Є єдиний файл для відео та аудіо, але YouTube запитує їх за байтовими діапазонами, в декілька фрагментів. Якщо ви перейдете на іншу якість, це також змінить діапазон байтів. Цікаво, як гравець знає, яка секунда відповідає якому байтовому зміщенню.
slhck

1
Чи можете ви навести приклад sтипу відео та RTMPEтипу відео?
Хлоя

@SurajJain тут нова сторінка - я буду переписувати цю відповідь, коли я використовую інший метод зараз github.com/svnpenn/umber/blob/master/bmklet/youtube/download.js
Стівен Пенні

Посилання дає мені 404. Ви видалили репо?
darksoulsong

1

Моя відповідь: з 22 січня 2019 року за допомогою цих методів можна потрапити, якщо спробувати обійти, не пов'язуючи також свою інформацію користувача.

Чому? оскільки я новий користувач цієї платформи, я не можу коментувати правило, визначене @ Daniel-B . Відповідно до нового ToS (німецькою мовою, як і я в Німеччині; будь ласка, перекладіть) для YouTube за 6,1 G $:

Ви погоджуєтесь будь-якою автоматизованою системою (включаючи - але не обмежуючись цим - будь-якого робота, павука чи офлайн-читача) використовувати її на веб-сайті таким чином, що більше запитів до сервера протягом визначеного часу, направлених YouTube, здатні розумно виробляти як людина протягом того ж періоду часу, що використовує загальнодоступний, немодифікований стандартний веб-браузер;

Тепер вони можуть з’ясувати тривалість часу для кожного запиту та відстежувати, чи порушуєте ви. Як це можливо, враховуючи цей сценарій та вашу зовнішню IP-адресу, буде відомо, навіть якщо ви використовуєте VPN, щоб захистити себе, не пов'язуючи інформацію про користувача з якою-небудь службою.


1
Ласкаво просимо мандрівника з майбутнього ... Не ясно, як це відповідає на запитання автора
Рамхаунд

Якщо ви хочете попередити автора, стосовно конкретної відповіді, ви мали б надіслати коментар та скасувати будь-яку відповідь, яку ви не вважали корисною через можливі юридичні проблеми, які могли б випливати. Ця відповідь читає більше, як те, що ви знайдете в дописі на дискусійному форумі, і Super User, це не дискусійний форум
Ramhound
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.