我正在使用网络请求使用网址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();
答案 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
的查询参数传递语言环境/语言。
然后还有另外两个参数el
和ps
,我不知道他们做了什么,但他们也以某种方式影响了响应。我只是将它们设置为预定义值。
最后,查询字符串看起来像这样:
"https://www.youtube.com/get_video_info?video_id={videoId}&sts={sts}&el=info&ps=default&hl={language}"