web-dev-qa-db-ja.com

これらの「YouTubeからビデオを保存」サービスはどのように機能しますか?

つまり、それらは一般的にどのように機能するのでしょうか。どのようにしてビデオストリーム自体へのリンクを受け取るのですか(Flashプレーヤーを含むページだけではありません)。

私はウェブで検索しましたが、何も便利なものを見つけることができませんでした(すべてのリンクはそのようなサービスを指していますが、それらのどれもそれらが実際にどのように実装されるかを教えません)。

60
PaulD

youtube-dl という、非常に人気のあるオープンソースのコマンドラインダウンローダーがあります。それは与えられたYouTubeリンク - あるいはVimeo、Yahoo!のような他の人気のあるウェブビデオサイトから実際のビデオとオーディオファイルのリンクをつかみます。ビデオ、uStreamなど.

これがどのように行われるかを見るためには、 YouTube extractor を調べてください。ここに表示するには多すぎます。他の抽出子が存在します より単純なサイト用 。 Steven PennyはYouTubeでも 単純なJavaScriptダウンローダー を持っています。これはもう少し簡単です。

しかし、基本的には、Flashビデオプレーヤーの場合は、JavaScriptを使用して初期化および構成する必要があります。簡単に言えば、FlashオブジェクトのプレーヤはロードするビデオストリームのURLを受け取ります。

ビデオストリームを見つけるには、ビデオページのHTMLコードとJSコードを解析して関連する初期化コードを見つけ、そこから実際のMP4ファイルへのリンクを見つける必要があります。それは平文でそこにあるかもしれませんが、それはまたいくつかの特定のダウンロードトークンでその場で生成されるかもしれません。多くの場合、JavaScriptはそれを再設計することを難しくするために難読化されています。あるいは、ビデオ情報は、JSによって非同期的にロードされるXMLファイルに含まれているかもしれません。

HTML5プログレッシブダウンロードビデオの場合、実際のソースファイルは通常sourceタグのvideo子に直接記載されているので、mp4などでページを検索するとします。たとえば、ドイツのニュース番組 Tagesschau 1 では、次のようになります。

<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)のようなより多くの 高度な再生技術 については、実際のビデオストリームを得るためにメタ情報ファイルを解析しなければなりません。メタファイル(DASHの場合は.mpd、HLSの場合は.m3u8)には、ビデオとオーディオのセグメントへのリンクが含まれます。これらは後で再生可能なファイルにするために結合する必要があります。

これに対する一般的な解決策はありません。ターゲットサイトの慎重な検査とデバッグが必要です。

50
slhck

YouTubeブックマークレット

これが私が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 policy の問題を引き起こします。基本的に、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ファイルをプロキシし、署名をスクランブルする関数を使用したので、動画をダウンロードするためにクエリ文字列でそれを使用できます。

33
Steven Penny

私の答え:2019年1月22日から、ユーザー情報をリンクせずに迂回しようとすると、これらの方法を使用することに巻き込まれる可能性があります。

どうして?私はこのプラットフォームの新規ユーザーなので、 @ Daniel-B で指定された規則についてコメントすることはできません。 YouTube用の新しい ToS (ドイツ語です。翻訳してください)によると$6.1 G$:

あなたは自動化されたシステム(ロボット、スパイダー、オフラインリーダーを含むがこれらに限定されない)が、YouTubeが指定された時間内にサーバーへのより多くの要求が公に入手可能な、変更されていない標準のWebブラウザを使用している同じ期間内の人間。

これで、各リクエストの所要時間を調べて、違反しているかどうかを追跡できます。このシナリオと、ユーザーの詳細を他のサービスにリンクせずに自分自身を保護するためにVPNを使用している場合でも、自分の外部IPアドレスがわかるようになった場合、どうすればそれが可能になりますか。

0
user103720