2010-03-14 72 views
1

更新:它看起來像在收到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代碼永遠不會執行,有關如何解決這個問題的任何想法?

回答

1

這似乎不太可能是移除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