1

ASP.NET でYoutubeFisherライブラリを使用しようとしています。HttpWebRequest を作成して html コンテンツを取得し、コンテストを処理してビデオ リンクを抽出し、Web ページにリンクを表示します。ローカルホストで動作させることができました。ビデオ リンクを取得し、locahost でビデオをダウンロードできます。しかし、サーバーにプッシュすると、同じサーバーからリクエストを送信した場合にのみ機能します。そのページがクライアント ブラウザによってアクセスされた場合、クライアントはリンクを正しく表示できますが、リンクがクリックされると、クライアントがリンクをクリックするたびに、リンクが正しい場合でも HTTP エラー 403 が返されます。

私の分析では、サーバーが HttpWebRequest を作成して HTML コンテンツを取得するときに、HTTP ヘッダーも送信するということです。YouTube サーバーから返された HTML コンテンツ (動画ファイルへのリンク) は、サーバーから送信されたその HTTP ヘッダーに一致する要求のみに応答すると思います。そのため、クライアントがリンクをクリックすると、別の HTTP ヘッダーで YouTube サーバーにリクエストが送信されます。

したがって、クライアントから HTTP ヘッダーを取得し、サーバーの HTTP ヘッダーを変更して、HttpWebRequest を作成する前にクライアントの HTTP ヘッダー情報を含めることを考えています。これが機能するかどうかはよくわかりません。私の知る限り、HTTP heer は変更できません。

以下は、YouTubeFisher ライブラリから HttpWebRequest を作成するコードです。

public static YouTubeService Create(string youTubeVideoUrl)
        {
            YouTubeService service = new YouTubeService();
            service.videoUrl = youTubeVideoUrl;

            service.GetVideoPageHtmlSource();
            service.GetVideoTitle();
            service.GetDownloadUrl();

            return service;
        }

        private void GetVideoPageHtmlSource()
        {
            HttpWebRequest req = HttpWebRequest.Create(videoUrl) as HttpWebRequest;
            HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
            videoPageHtmlSource = new StreamReader(resp.GetResponseStream(), Encoding.UTF8).ReadToEnd();
            resp.Close();
        }

クライアントはページを閲覧しますが、リンクはありますが HTTP 403 を返します:

ここに画像の説明を入力

ここに画像の説明を入力

サーバー自体からページを参照すると、すべてが期待どおりに機能します。

ここに画像の説明を入力

クライアントに代わって HttpWebRequest を作成するにはどうすればよいですか? この問題の私の分析は正しいですか?

ご意見ありがとうございます。

4

2 に答える 2

0

Charles、Fiddler、さらにはFirebugなどのhttpモニターを使用して、成功した場合にブラウザーから送信されている追加のヘッダーを確認します。accept、、user-agentまたはの1つ以上を複製する必要があると思いますreferer

于 2012-08-09T18:20:43.980 に答える
0

過去に、YouTube にはこれらのリンクがエンコードされているため、元のリクエスト IP に対してのみ機能すると想定していました。もしそうなら、それははるかに難しいでしょう。これが当てはまるかどうかはわかりません。このルートに進む前に、できる限りすべてのヘッダー要素を転送してみてください...

頭に浮かぶ唯一の可能性は、JavaScript リクエストを使用してページをクライアントのブラウザーにダウンロードし、それをサーバーにアップロードして処理するか、JavaScript で処理する必要があるということです。

または、クライアントにサーバー経由でビデオ ストリームをダウンロードさせることもできます。これにより、サーバーはデータを通過します。これは明らかに帯域幅を大量に使用します。

于 2012-08-09T19:20:14.220 に答える