2017-07-17 7 views
0
私はブラウザでURLにアクセスすると、URL http://youtube.com/get_video_info?video_id={ID HERE}

YouTube動画の情報は

を使用してYouTubeでのオフにビデオデータを取得するためにwebrequestsを使用しています

、それは、応答ファイルのすべてをダウンロード必要なデータが存在します。しかし、HttpWebRequestを使用して適切なUserAgentで応答をダウンロードすると、多くのデータが失われます。

ほとんどのデータには、ロケール情報、ブラウザのバージョン情報(適切なUserAgent文字列が付いていると思いますが、そうではないと思われます)、およびリクエストから作成されたイベントを参照するIDがあります。

私の質問は、WebRequestと比較して、このデータがブラウザのダウンロード版に表示されるのはなぜですか?私の作成したリクエストとは異なるブラウザの送信内容を確認するにはどうすればよいですか?

は、ここで私は現在、C#でデータを要求しています方法は次のとおりです。

 var url = string.Format("http://youtube.com/get_video_info?video_id={0}", videoId); 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     request.UserAgent = userAgent; 
     var response = request.GetResponse(); 

     string contents; 
     using (var sr = new StreamReader(response.GetResponseStream())) 
      contents = sr.ReadToEnd(); 
+0

あなたは[フィドラー](HTTPなどのツールを使用して、ブラウザやアプリケーションからの要求/応答を表示することができます。 //www.telerik.com/fiddler)。 – Poosh

答えて

1

標準WebRequestクラスとブラウザ要求異なるヘッダを送信します。同じHTTPリクエストを行うには、WebRequestを適切に準備する必要があります(正しいヘッダーとCookieを設定してください)。

違いを確認するには、Fiddlerをダウンロードし、ブラウザーで同じURLを開き、次にVisual Studioで両方の要求を生テキストモードで比較します。 WebRequestには多くのヘッダーがありません。

0

お客様のブラウザは通常、ロケールとstsと呼ばれる何らかの種類のセッション識別子を含むget_video_infoに長いクエリを送信します。

sts私は時計または埋め込みページでjson設定を探して、 "sts"というプロパティを検索します。 あなたはそれを見つけるために、この正規表現を使用することができます。

var sts = Regex.Match(html, @"""sts""\s*:\s*(\d+)").Groups[1].Value; 

ロケール/言語がhlと呼ばれるクエリパラメータを使用して渡されます。

elpsの2つのパラメータがありますが、どのようなことが起こっているか分かりませんが、どういうわけかレスポンスにも影響します。私はそれらをあらかじめ定義された値に設定しました。

最後に、クエリ文字列が好き、このように見える:

"https://www.youtube.com/get_video_info?video_id={videoId}&sts={sts}&el=info&ps=default&hl={language}" 

ここから撮影:https://github.com/Tyrrrz/YoutubeExplode/blob/f24c5b0040ffdded6922fc1b853c3d7155812f0b/YoutubeExplode/YoutubeClient.cs#L200

関連する問題