Как работают все эти сервисы «Сохранить видео с 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), вам необходимо проанализировать файл метаинформации для получения реального видеопотока. Метафайл ( .mpdнапример, в DASH и .m3u8для HLS) будет содержать ссылки на сегменты видео и аудио, которые вам позже придется объединить, чтобы получить воспроизводимый файл.

Там нет общего решения для этого. Требуется тщательный осмотр и отладка целевого сайта.


3
Один вопрос, какова политика Youtube / Google по этому поводу? Они в порядке с этим, или не так много?
JMK

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

2
@ StevenPenny у вас есть какая-нибудь не минимизированная версия этого?
TankorSmash

5
@slhck Flash также может самостоятельно отправлять HTTP-запросы. Вместо этого он использует HTTP-движок браузера. Если бы Flash сам делал запросы, они не были бы «видны» браузеру. Конечно, было бы здорово для рекламодателей. ;)
Даниэль Б

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

35

YouTube Bookmarklet

Вот как я это сделал с помощью 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 млрд:

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

Теперь они могут узнать продолжительность каждого запроса и отследить, нарушаете ли вы. Как это возможно сейчас, учитывая этот сценарий и ваш внешний IP-адрес будет известен, даже если вы используете VPN, чтобы защитить себя, не связывая данные пользователя с какой-либо службой.


1
Добро пожаловать путешественник из будущего ... Непонятно, как это отвечает на вопрос автора
Ramhound

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