답변:
라는 매우 인기있는 오픈 소스 명령 줄 다운로더 youtube-dl
가 있습니다. 특정 YouTube 링크 또는 Yahoo! Vimeo와 같은 인기있는 웹 비디오 사이트에서 실제 비디오 및 오디오 파일 링크를 가져옵니다. 비디오, uStream 등
어떻게되는지 확인하려면 YouTube 추출기를 살펴보세요 . 여기에 표시하기에는 너무 많습니다. 더 간단한 사이트를위한 다른 추출기가 존재 합니다 . Steven Penny는 YouTube를위한 간단한 JavaScript 다운로더도 가지고 있습니다.
그러나 기본적으로 Flash 비디오 플레이어의 경우 일부 JavaScript를 통해 초기화하고 구성해야합니다. 간단히 말해 Flash 객체의 플레이어는로드 할 비디오 스트림의 URL을받습니다.
비디오 스트림을 찾으려면 비디오 페이지의 HTML 및 JS 코드를 구문 분석하여 관련 초기화 코드를 찾은 다음 실제 MP4 파일에 대한 링크를 찾아보십시오. 일반 텍스트로 표시 될 수도 있지만 특정 다운로드 토큰을 사용하여 즉시 생성 될 수도 있습니다. 종종, 자바 스크립트는 재 설계하기 어렵게하기 위해 난독 화되기도합니다. 또는 비디오 정보가 JS에 의해 비동기식으로로드되는 XML 파일에 포함될 수 있습니다.
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 또는 애플의 HTTP 라이브 스트리밍 (HLS)와 같은, 당신은 실제 비디오 스트림을 얻을 수있는 메타 정보 파일을 구문 분석해야합니다. 메타 파일 ( .mpd
예 : DASH 및 .m3u8
HLS 용)에는 비디오 및 오디오 세그먼트에 대한 링크가 포함되며 나중에 재생 가능한 파일을 얻기 위해 결합해야합니다.
이에 대한 일반적인 해결책은 없습니다. 대상 사이트를 신중하게 검사하고 디버깅해야합니다.
이것이 내가 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 확인 유형 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
자바 스크립트를에서 다운로드 할 수 있습니다 www.youtube.com
. 물론 그들은 이것을하지 않습니다. 이 해결 방법의 해결 방법은 CORS 프록시를 사용하는 것입니다. 이것은 모든 요청에 다음 헤더로 응답하는 프록시입니다.
Access-Control-Allow-Origin: *
이제 JS 파일을 프록시하고 서명을 스크램블하는 함수를 사용 했으므로 querystring에서이를 사용하여 비디오를 다운로드 할 수 있습니다.
s
유형 비디오 및 RTMPE
유형 비디오 의 예를 들어 줄 수 있습니까 ?
내 대답 : 2019 년 1 월 22 일부터 사용자 정보를 연결하지 않고 우회하려고하면 이러한 방법을 사용할 수 있습니다.
왜? 이 플랫폼을 처음 사용하는 사용자이므로 @ Daniel-B에 지정된 규칙에 대해서는 언급 할 수 없습니다 . 6.1 달러 미만의 YouTube에 대한 새로운 ToS (독일에있는 독일어로 번역 해주세요)에 따르면 다음과 같습니다.
귀하는 자동화 된 시스템 (로봇, 스파이더 또는 오프라인 리더를 포함하되 이에 국한되지 않음)이 웹 사이트에 액세스하여 YouTube가 지정된 시간 내에 서버에 더 많은 요청을하여 공개적으로 이용 가능한 수정되지 않은 표준 웹 브라우저를 사용하여 동일한 기간 내에 인간;
이제 각 요청에 대한 시간을 파악하고 위반 여부를 추적 할 수 있습니다. 이 시나리오와 VPN을 사용하여 사용자의 세부 정보를 서비스에 연결하지 않고 자신을 보호하더라도 외부 IP 주소를 알면 어떻게 될 수 있습니까?