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

YouTube Video Info returning different results with Browser and WebRequest C#

我正在使用网络请求通过 URL 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();

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

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

您的浏览器通常会向 get_video_info 发送更长的查询,其中包括语言环境和某种称为 sts 的会话标识符。

为了获得 sts,我在手表或嵌入页面上查找 json 配置,然后搜索名为 "sts" 的 属性。 您可以使用此正则表达式找到它:

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

locale/language 使用名为 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