Jak działają wszystkie te usługi „Zapisz wideo z YouTube”?

62

Mam na myśli, jak one ogólnie działają? W jaki sposób otrzymują link do samego strumienia wideo (nie tylko strony zawierającej odtwarzacz Flash)?

Przeprowadziłem wyszukiwanie w Internecie, ale nie znalazłem nic przydatnego (wszystkie linki wskazują na takie usługi, ale żadne z nich nie mówi, w jaki sposób są one faktycznie realizowane).

PaulD
źródło

Odpowiedzi:

51

Istnieje bardzo popularny program do pobierania wiersza poleceń o otwartym kodzie źródłowym youtube-dl, który właśnie to robi. Pobiera rzeczywiste łącza plików wideo i audio z danego łącza YouTube - lub dowolnej innej popularnej witryny wideo, takiej jak Vimeo, Yahoo! Wideo, uStream itp.

Aby zobaczyć, jak to się robi, zajrzyj do ekstraktora YouTube . To po prostu zbyt wiele do pokazania tutaj. Istnieją inne ekstraktory dla prostszych stron . Steven Penny ma również prosty downloader JavaScript na YouTube, który jest nieco prostszy.

Ale w zasadzie, w przypadku odtwarzacza wideo Flash, należy go zainicjować i skonfigurować za pomocą JavaScript. Mówiąc wprost, odtwarzacz obiektu Flash otrzyma adres URL strumienia wideo do załadowania.

Aby znaleźć strumień wideo, musisz przeanalizować kod HTML i JS strony wideo, aby znaleźć odpowiedni kod inicjujący, a następnie spróbuj znaleźć link do rzeczywistego pliku MP4. Może występować w postaci zwykłego tekstu, ale można go również generować w locie za pomocą określonych tokenów do pobrania. JavaScript jest często zaciemniany, aby utrudnić jego ponowne zaprojektowanie. Lub informacje o filmie mogą być zawarte w pliku XML ładowanym asynchronicznie przez JS.

W przypadku wideo HTML5 z progresywnym pobieraniem rzeczywisty plik źródłowy jest zwykle wymieniany bezpośrednio w sourceelemencie potomnym videoznacznika, więc jeśli przeszukasz stronę mp4lub coś podobnego. Na przykład w niemieckim programie informacyjnym Tagesschau 100 znajdziesz:

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

W przypadku bardziej zaawansowanych technologii odtwarzania, takich jak MPEG DASH lub HTTP Live Streaming firmy Apple (HLS), musisz przeanalizować plik meta-informacji, aby uzyskać rzeczywisty strumień wideo. Plik meta ( .mpdna przykład w DASH i .m3u8HLS) będzie zawierał łącza do segmentów wideo i audio, które później będziesz musiał połączyć, aby uzyskać plik do odtworzenia.

Nie ma na to ogólnego rozwiązania. Wymaga starannej kontroli i debugowania strony docelowej.

slhck
źródło
3
Jedno pytanie, jakie są zasady Youtube / Google w tym zakresie? Czy są z tym w porządku, czy nie tak bardzo?
JMK
31
Warunki korzystania z usługi YouTube w §5.1.L zabraniają korzystania z ich treści w jakikolwiek inny sposób niż streaming, więc teoretycznie jest to niedozwolone. W praktyce jednak nie będą w stanie tego egzekwować. Każdy program do pobierania może mniej więcej symulować, że jest to po prostu streaming.
slhck
2
@StevenPenny czy masz jakąś nie zminimalizowaną wersję tego?
TankorSmash
5
@slhck Flash może również samodzielnie wysyłać żądania HTTP. Zamiast tego wykorzystuje silnik HTTP przeglądarki. Jeśli sam Flash wysyła żądania, nie będą one „widoczne” dla przeglądarki. Na pewno byłby świetny dla reklamodawców. ;)
Daniel B
3
@slhck nie mogą tego egzekwować programowo , ale jeśli wyciągną zespół prawników, czy mogą go egzekwować zgodnie z prawem ?
Cruncher
35

YouTube Bookmarklet

Tak właśnie zrobiłem z JavaScript

Zacznij od ytplayer.config.argsobiektu. Zawiera wszystkie adresy URL filmu. Jest podzielony na

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

Każdy z nich jest tablicą oddzieloną przecinkami tego, co nazwałbym „obiektami strumieniowymi”. Każdy „obiekt strumienia” będzie zawierał takie wartości

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

Każdy adres URL zostanie zakodowany, więc będziesz musiał go odkodować. Teraz trudna część.

YouTube ma co najmniej 3 poziomy bezpieczeństwa dla swoich filmów

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

Filmy RTMPE są zwykle używane w oficjalnych pełnometrażowych filmach i są chronione za pomocą SWF Verification Type 2. Jest to od 2011 roku i nie zostało jeszcze poddane inżynierii wstecznej.

Filmy typu „s” są najtrudniejsze do pobrania. Zazwyczaj zobaczysz je na filmach VEVO i podobnych. Zaczynają od podpisu, takiego jak

AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5

Następnie podpis jest kodowany za pomocą takiej funkcji

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("")
}

Ta funkcja jest dynamiczna i zazwyczaj zmienia się każdego dnia. Aby utrudnić, funkcja jest hostowana pod adresem URL takim jak

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

wprowadza to problem polityki tego samego pochodzenia . Zasadniczo nie można pobrać tego pliku, www.youtube.componieważ są to różne domeny. Obejściem tego problemu jest CORS . W przypadku CORS s.ytimg.commożna dodać ten nagłówek

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

i pozwoliłoby na pobieranie JavaScript z www.youtube.com. Oczywiście, że tego nie robią. Obejściem tego obejścia jest użycie serwera proxy CORS. Jest to serwer proxy, który odpowiada na wszystkie żądania następującym nagłówkiem

Access-Control-Allow-Origin: *

Więc teraz, gdy masz już proxy swojego pliku JS i użyłeś funkcji do szyfrowania podpisu, możesz użyć tego w zapytaniu, aby pobrać wideo.

Steven Penny
źródło
1
Czy zdarzyło Ci się wiedzieć (w przypadku odtwarzania DASH), w jaki sposób odtwarzacz YouTube określa zakresy bajtów, które należy żądać od reprezentacji medialnej? Plik MPD zawiera tylko segmenty.
slhck
2
Nie do końca .. Istnieje jeden plik wideo i audio, ale YouTube żąda ich według zakresów bajtów, w kilku porcjach. Jeśli przełączysz się na inną jakość, zmieni to także zakres bajtów. Zastanawiam się tylko, skąd gracz wie, która sekunda odpowiada przesunięciu bajtów.
slhck
1
Czy możesz podać przykład stypu wideo i RTMPEtypu wideo?
Chloe
@ SurajJain tutaj jest nowa strona - przepiszę tę odpowiedź, ponieważ teraz używam innej metody github.com/svnpenn/umber/blob/master/bmklet/youtube/download.js
Steven Penny
Link daje mi 404. Czy usunąłeś repo?
darksoulsong
1

Moja odpowiedź: od 22 stycznia 2019 r. Przyłapanie tych metod może zostać przyłapane, jeśli spróbujesz ominąć również nie łącząc informacji o użytkowniku.

Dlaczego? ponieważ jestem nowym użytkownikiem tej platformy, nie mogę komentować reguły określonej przez @ Daniel-B . Zgodnie z nowym Regulaminem (w języku niemieckim, tak jak ja w Niemczech; proszę tłumaczyć) dla YouTube poniżej 6,1 USD:

Zgadzasz się, aby każdy zautomatyzowany system (w tym - ale nie tylko - dowolny robot, pająk lub czytnik offline) korzystał z niego na stronie internetowej w taki sposób, że więcej żądań do serwera w określonym czasie, które YouTube polecił, jest w stanie racjonalnie wyprodukować człowiek w tym samym okresie czasu, korzystając z publicznie dostępnej, niezmodyfikowanej standardowej przeglądarki internetowej;

Teraz mogą dowiedzieć się, jaki jest czas trwania każdego żądania i mogą śledzić, czy naruszasz. Jak to jest teraz możliwe, biorąc pod uwagę ten scenariusz, a Twój zewnętrzny adres IP będzie znany, nawet jeśli korzystasz z VPN, aby się zabezpieczyć bez łączenia danych użytkownika z jakąkolwiek usługą.

użytkownik103720
źródło
1
Witaj podróżniku z przyszłości ... Nie jest jasne, w jaki sposób odpowiada to pytanie autora
Ramhound,
Jeśli chcesz ostrzec autora w odniesieniu do konkretnej odpowiedzi, powinieneś przesłać komentarz i zanegować każdą odpowiedź, która według ciebie nie była pomocna z powodu możliwych problemów prawnych, które mogą wystąpić. Ta odpowiedź brzmi bardziej jak to, co można znaleźć w poście na forum dyskusyjnym, a Super Użytkownik nie jest forum dyskusyjnym
Ramhound