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
的查询参数传递。
然后还有另外两个参数 el
和 ps
,我不知道它们的作用,但不知何故它们也会影响响应。我只是将它们设置为预定义的值。
最后,查询字符串如下所示:
"https://www.youtube.com/get_video_info?video_id={videoId}&sts={sts}&el=info&ps=default&hl={language}"
我正在使用网络请求通过 URL http://youtube.com/get_video_info?video_id={ID HERE}
当我使用浏览器访问 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
的查询参数传递。
然后还有另外两个参数 el
和 ps
,我不知道它们的作用,但不知何故它们也会影响响应。我只是将它们设置为预定义的值。
最后,查询字符串如下所示:
"https://www.youtube.com/get_video_info?video_id={videoId}&sts={sts}&el=info&ps=default&hl={language}"