回答:
非常に人気のあるオープンソースのコマンドラインダウンローダーがありyoutube-dl
、まさにそれを実行します。指定されたYouTubeリンクから、またはVimeo、Yahoo!ビデオ、uStreamなど。
それがどのように行われるかを確認するには、YouTubeエクストラクタをご覧ください。ここで示すには多すぎます。より簡単なサイトには他のエクストラクターが存在します。Steven PennyにはYouTube用のシンプルなJavaScriptダウンローダーもありますが、これはもう少し簡単です。
ただし、基本的に、Flashビデオプレーヤーの場合は、JavaScriptを使用して初期化し、構成する必要があります。簡単に言えば、Flashオブジェクトのプレーヤーは、ロードするビデオストリームのURLを受け取ります。
ビデオストリームを見つけるには、ビデオページのHTMLおよびJSコードを解析して関連する初期化コードを見つけ、そこから実際のMP4ファイルへのリンクを見つけなければなりません。プレーンテキストである場合もありますが、特定のダウンロードトークンを使用してオンザフライで生成することもできます。多くの場合、JavaScriptは難読化されて、再設計が難しくなります。または、ビデオ情報は、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やAppleの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
これにより、Same-originポリシーの問題が発生し
ます。基本的に、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ファイルをプロキシし、関数を使用して署名をスクランブルしたので、クエリ文字列でそれを使用してビデオをダウンロードできます。
s
タイプビデオとRTMPE
タイプビデオの例を挙げることができますか?
私の答え:2019年1月22日から、ユーザー情報もリンクせずにバイパスしようとすると、これらのメソッドを使用するとキャッチされる可能性があります。
どうして?私はこのプラットフォームの新規ユーザーなので、@ Daniel-Bで指定されたルールにコメントすることはできません。YouTubeの新しいToS(私はドイツにいるのでドイツ語。翻訳してください)によると、$ 6.1 G $ 未満の場合:
自動化システム(ロボット、スパイダー、オフラインリーダーを含むがこれらに限定されない)を使用して、YouTubeが合理的に同じ期間内に公開されており、変更されていない標準のWebブラウザを使用している人間。
これで、各リクエストの期間を確認し、違反しているかどうかを追跡できます。VPNを使用してユーザーの詳細をサービスにリンクせずに自分自身を保護する場合でも、このシナリオと外部IPアドレスがわかれば、どのように可能になりますか。