使用XMLHttpRequest后不存在Cookies

问题描述:

更新:它看起来像在收到403响应后,xmlhttprequest只是挂在那里,所以document.location代码永远不会执行,关于如何解决这个问题的任何想法?使用XMLHttpRequest后不存在Cookies

我想制作一个小书签从YouTube下载视频,但我碰到过一个小问题。

为了检测可用的最高质量视频,我使用了一种蛮力方法,在该方法中,我使用XMLHttpRequest对象发出请求,直到不返回404(我不能这样做直到返回200 OK因为如果视频可用,YouTube会重定向到其他服务器,并且跨域策略不允许我访问任何数据)。

一旦找到了工作URL,我只需将window.location设置为URL,下载应该开始了,对吧?错误。提出了一项请求,但由于我未知的原因,Cookie被剥离,YouTube返回403访问被拒绝。如果XML请求没有在它之前创建,也就是说,如果我只是将window.location设置为URL,那么一切正常,这是在我执行不发送cookie的XMLHttpRequest时,不会发生这种情况。

很难使这里解释的脚本:

var formats = ["37", "22", "35", "34", "18", ""]; 
var url = "/get_video?video_id=" + yt.getConfig('SWF_ARGS')['video_id'] + "&t=" + (unescape(yt.getConfig('SWF_ARGS')['t'])) + "&fmt="; 
for (var i = 0; i < formats.length; i++) { 
    xmlhttp = new XMLHttpRequest; 
xmlhttp.open("HEAD", url + formats[i], false); 
    xmlhttp.send(null); 
    if (xmlhttp.status != 404) { 
     document.location = url + formats[i]; 
     break 
    } 
} 

设置document.location后,该脚本不发送的cookie,从而无法正常工作。但是,干脆这样做:

 

document.location = "/get_video?video_id=" + yt.getConfig('SWF_ARGS')['video_id'] + "&t=" + (unescape(yt.getConfig('SWF_ARGS')['t'])) 
 

确实发送cookie与请求一起工作。唯一的缺点是我无法自动检测到最高质量,我只需手动尝试每个“fmt”参数,直到我找到正确的。

所以我的问题是:为什么XMLHttpRequest对象从后续请求中删除cookie?

这是我第一次在JS上做过任何事情,所以请你轻松点我。 ;)

更新:它看起来像收到403响应后,xmlhttprequest只是挂在那里,所以document.location代码永远不会执行,有关如何解决这个问题的任何想法?

这似乎不太可能是移除cookie(这将是一个浏览器错误)的AJAX请求,更有可能是YouTube通过移除cookie来吊销会话(由cookie标识)。我注意到两个请求是不同的 - 这会起作用

document.location = “?/ get_video VIDEO_ID =” + yt.getConfig( 'SWF_ARGS')[ 'VIDEO_ID'] + “&吨= “+ (UNESCAPE(yt.getConfig( 'SWF_ARGS') 'T'])) +” & FMT = 37"

也可以尝试只测试了两种不同的格式 - YouTube上可能会认为你是试图暴力破解,或者只是不允许通过XMLhttp从请求中删除Cookie来尝试API混搭...

+0

是的,我现在已经明白了。 我误解了document.location请求的实际XMLHttpRequest,这就解释了为什么cookie不存在。 document.location = url + formats [i];因为请求只是挂起,所以行永远不会执行。 – 2010-03-14 19:11:37

+0

这是一个有用的代理调试萤火虫不告诉你的东西http://www.fiddler2.com/fiddler2/ – Andy 2010-03-14 19:26:03

+0

你也可以使用WireShark这样的事情。我想现在,但不幸的是,我正在对付的服务器只有HTTPS,所以我只看到加密流量:( – 2010-05-21 13:36:05

德鲁, 它也许晚了,也许你已经知道了!但是,如果您有权访问服务器的私钥,那么您可以在Wireshark中轻松解密流量。http://support.citrix.com/article/CTX116557/