我正在尝试在ASP.NET中使用YoutubeFisher库。我制作一个HttpWebRequest来获取html内容,处理比赛以提取视频链接并在网页上显示链接。我设法使它在localhost上工作。我可以检索视频链接并在locahost上下载视频。但是当我将它推送到服务器时,它只有在我从同一服务器发送请求时才有效。如果客户端浏览器访问该页面,则客户端可以正确查看链接,但是当单击链接时,客户端会在每次客户端单击链接时获取HTTP错误403,即使链接正确。
我的分析是,当服务器使HttpWebRequest获取HTML上下文时,它也会发送HTTP头。我认为,从YouTube服务器发回的HTML内容(指向视频文件的链接)将仅响应与服务器发送的HTTP标头匹配的请求。因此,当客户点击该链接时,它会向具有不同HTTP标头的YouTube服务器发送请求。
所以,我正在考虑从客户端获取HTTP头,然后在进行HttpWebRequest之前修改Server HTTP头以包含客户端的HTTP头信息。我不太确定这是否有效。据我所知,HTTP heaer无法修改。
以下是从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呢?我对这个问题的分析是否正确?
感谢您的投入。
答案 0 :(得分:0)
使用诸如Charles,Fiddler甚至Firebug之类的http监视器来查找成功案例中从浏览器发送的其他标头。我怀疑您需要复制accept
,user-agent
或referer
中的一个或多个。
答案 1 :(得分:0)
在过去,我只是假设youtube对这些链接进行了编码,以便它们仅适用于原始请求IP。如果是这样的话会更加困难。我不知道是否是这种情况,尝试转发所有的标题元素,然后再沿着这条路线前进......
唯一可能的想法是,你必须使用javascript请求将页面下载到客户端的浏览器,然后将其上传到服务器进行处理,或者在javascript中进行处理。
或者您可以让客户端通过您的服务器下载视频流,这样您的服务器就会传递数据。这显然会占用大量的带宽。