YouTube视频信息使用浏览器和WebRequest C#返回不同的结果

时间:2017-07-17 00:40:47

标签: c# youtube webrequest

我正在使用网络请求使用网址http://youtube.com/get_video_info?video_id={ID HERE}

从YouTube上获取视频数据

当我使用浏览器访问URL时,它会下载响应文件并显示所有需要的数据。但是,当我使用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();

2 个答案:

答案 0 :(得分:1)

标准WebRequest和浏览器请求发送不同的标头。您必须正确准备WebRequest(设置正确的标头和cookie)以发出相同的HTTP请求。

要查看差异,请下载Fiddler并在浏览器中打开相同的URL,然后在Visual Studio中以原始文本模式比较两个请求。您会注意到WebRequest缺少很多标题。

答案 1 :(得分:0)

您的浏览器通常会向get_video_info发送较长的查询,其中包括区域设置和某种名为sts的会话标识符。

要获取sts我在watch或embed页面上查找json配置,然后搜索名为“sts”的属性。 您可以使用此正则表达式来查找它:

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

使用名为hl的查询参数传递语言环境/语言。

然后还有另外两个参数elps,我不知道他们做了什么,但他们也以某种方式影响了响应。我只是将它们设置为预定义值。

最后,查询字符串看起来像这样:

"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