59

Я имею в виду, как они вообще работают? Как они получают ссылку на сам видеопоток (а не только на страницу, содержащую Flash-плеер)?

Я сделал поиск в Интернете, но не смог найти ничего полезного (все ссылки указывают на такие сервисы, но ни одна из них не рассказывает, как они на самом деле реализованы).

3 ответа3

49

Существует очень популярный загрузчик командной строки с открытым исходным кодом, называемый 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) будет содержать ссылки на сегменты видео и аудио, которые позже вам нужно будет объединить, чтобы получить воспроизводимый файл.

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

32

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-файл и использовали функцию для шифрования подписи, вы можете использовать ее в строке запроса для загрузки видео.

0

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

Зачем? Поскольку я являюсь новым пользователем этой платформы, я не могу комментировать правило, указанное @ Daniel-B. Согласно новому ToS (на немецком языке, как я нахожусь в Германии; пожалуйста, переведите) для YouTube менее $ 6,1 G $:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .