1

我正在尝试将YoutubeFisher库与 ASP.NET 一起使用。我制作了一个 HttpWebRequest 来抓取 html 内容,处理比赛以提取视频链接并在网页上显示链接。我设法使它在本地主机上工作。我可以检索视频链接并在 locahost 上下载视频。但是当我将它推送到服务器时,它只有在我从同一服务器发送请求时才有效。如果客户端浏览器访问该页面,客户端可以正常看到链接,但是当单击链接时,客户端会收到 HTTP 错误 403,每次客户端单击链接时,即使链接是正确的。

我的分析是,当服务器使 HttpWebRequest 抓取 HTML 内容时,它也会发送 HTTP 标头。我认为,从 YouTube 服务器发回的 HTML 内容(指向视频文件的链接)只会响应与从服务器发送的 HTTP 标头匹配的请求。因此,当客户端单击链接时,它会使用不同的 HTTP 标头向 YouTube 服务器发送请求。

因此,我正在考虑从客户端获取 HTTP 标头,然后在发出 HttpWebRequest 之前修改服务器 HTTP 标头以包含客户端的 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

在过去,我只是假设 youtube 对这些链接进行了编码,以便它们仅适用于原始请求 IP。如果是这样的话,那就更难了。我不知道是否是这种情况,请在沿着这条路线前进之前尝试转发所有标题元素......

想到的唯一可能性是您必须使用 javascript 请求将页面下载到客户端的浏览器,然后将其上传到您的服务器进行处理,或者在 javascript 中进行处理。

或者你可以让客户端通过你的服务器下载视频流,这样你的服务器就会传递数据。这显然会占用大量带宽。

于 2012-08-09T19:20:14.220 回答
0

使用诸如 Charles、Fiddler 甚至 Firebug 之类的 http 监视器来找出在成功案例中从浏览器发送了哪些额外的标头。我怀疑您需要复制一个或多个accept,user-agentreferer.

于 2012-08-09T18:20:43.980 回答