2018年10月29日月曜日

ストリーム動画をダウンロードする その2.ソースから必要なアドレスを見つける


Fiddlerに関するその他の記事も確認してみてください

前回Fiddlerで直接アドレスを調べましたが、毎回、Fiddlerでアドレスを調べるのは大変です。
ダウンロードアプリを作成するのであれば、先ほどのアドレスをどのように取得する必要があるか調べることになります。

私の試した例では
https://r1---sn-oguelnlz.googlevideo.com/videoplayback?なんとかかんとか
というサイトから動画がダウンロードされていました。

複数の動画を比較すればわかるかと思いますが、アドレスの緑色の部分は動画によって変わってきます。
紫の部分はクエリパラメータと呼ばれる部分ですね。動画のIDなどが指定されています。

最初にアクセスしたyoutubeのサイトから、探してみましょう。

各行で取得されたレスポンスはFiddlerの右下の部分に表示されます。
図のように「Response is encoded. Click to decode」と表示されている場合、クリックすることでレスポンスを展開できます。


TextViewタブで最初のYoutubeの動画ページで取得されたソースを表示しました。


今回の場合、最初のアドレスに関連するURLが含まれているようです。
検索用のTextBoxにアドレスを入れると、ソレっぽい場所が見つかりました。



取得したソースから、ソースを抜き出してみましょう。
ソースを文字列として取得するには以下のように書けば良いです。

public static string GetSource(string targetUrl)
{
 HttpClient client = new HttpClient();
 var res = client.GetStringAsync(targetUrl);
 res.Wait();
 string src = res.Result;

 return src;
}

実行すると、Fiddlerの結果のような文字列を取得できます。
この文字列から必要なアドレスを抜き出すことになります。
文字列から特定の部分を抜き出すには正規表現を使うことが多いです。
(JsonなどのXMLならロジックも変わるかと思います)

タグやアドレスをキーにして、必要なアドレスを抽出しましょう。
ソースを見た感じだと、決まったタグ部分を抽出すれば良いみたいです。
また、画質によってアドレスも異なっているようです。

個人的には自分のためのアプリ開発であれば、完全なソース解析をする必要はないと思います。
それっぽい部分を画面に表示して、手動でコピペすれば開発は簡単になります。
正規表現がわからないなら、ソース全部を画面に表示して目視で探しても良いのです。

いきなり完全なものを目指すと、時間もかかるし本筋ではないところで挫折してしまうこともあります。

ですので、『まずは動くものをつくる』ことを目標にすることをオススメします。

その後に、より理想に近いものを目指していくと挫折は減るかなと思います。
たとえば、手作業が含まれると、操作の手間が増えてストレス溜まるようなら、自動化を目指すとか・・・?
リアルタイム配信の場合も手動では対応できないので、ソース解析の自動化が必要になるかな