2010-03-14 1 views
1

Обновление: похоже, что после получения ответа 403 xmlhttprequest просто зависает там, и поэтому код document.location никогда не выполняется, никаких идей о том, как обойти это?Куки-файлы не присутствуют после использования XMLHttpRequest

Я пытаюсь сделать букмарклет для загрузки видео с YouTube, но я столкнулся с небольшой проблемой.

Чтобы обнаружить видео высокого качества, я использую своего рода метод грубой силы, в котором я делаю запросы с использованием объекта XMLHttpRequest до тех пор, пока 404 не будет возвращен (я не могу сделать это, пока не будет возвращено 200 ok потому что YouTube перенаправляется на другой сервер, если видео доступно, а междоменная политика не позволит мне получить доступ к каким-либо из этих данных).

Как только рабочий URL-адрес найден, я просто устанавливаю window.location на URL-адрес, и загрузка должна начинаться, верно? Неправильно. Запрос выполняется, но по неизвестным мне причинам файлы cookie удаляются, а YouTube возвращает 403 доступ. Этого не происходит, если XML-запросы не выполняются до него, т. Е. Если я просто устанавливаю window.location в URL-адрес, все работает нормально, это когда я делаю XMLHttpRequest, чтобы файлы cookie не отправлялись.

Это трудно объяснить, так вот скрипт:

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 и, таким образом, не работает. Тем не менее, просто это делается:

 

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

ОТПУСКАЕТ куки вместе с запросом и действительно работает. Единственным недостатком является то, что я не могу автоматически определить наивысшее качество, мне просто нужно попробовать каждый параметр «fmt» вручную, пока я не получу его правильно.

Итак, мой вопрос: почему объект XMLHttpRequest удаляет файлы cookie из последующих запросов?

Это первый раз, когда я когда-либо делал что-либо в JS, так что, пожалуйста, поймите меня легко. ;)

Обновление: похоже, что после получения ответа 403 xmlhttprequest просто висит там, и поэтому код document.location никогда не выполняется, никаких идей о том, как обойти это?

ответ

1

Похоже, что это запрос AJAX, удаляющий куки-файл (который был бы ошибкой браузера), и более вероятно, что YouTube отменяет сеанс (который идентифицируется файлом cookie), удаляя файл cookie. Я заметил, что два запроса различны - это работает

document.location = "?/Get_video video_id =" + yt.getConfig ('SWF_ARGS') [ 'video_id'] + "& т = "+ ((yt.getConfig экранирования в ('SWF_ARGS') [ 'т'])) +" & FMT = 37"

Также попробуйте только тестирование для двух разных форматов - YouTube может думать, что вы пытаясь перебрать команду или просто не разрешить попытки создания API-интерфейсов API, отменив куки-файлы из запроса по XMLhttp ...

+0

Да, я понял это сейчас. Я ошибся с фактическим XMLHttpRequest для запроса document.location, который объясняет, почему файлы cookie отсутствовали. Document.location = url + formats [i]; строка никогда не выполняется, потому что запрос просто зависает. –

+0

Это полезный прокси для отладки, который firebug не говорит вам http://www.fiddler2.com/fiddler2/ – Andy

+0

Вы также можете использовать WireShark для таких вещей. Я пытаюсь сейчас, но, к сожалению, сервер, с которым я работаю, является HTTPS, поэтому я вижу только зашифрованный трафик :( –

1

Drew, Возможно, возможно, и вы уже знаете это уже! Но если у вас есть доступ к секретному ключу сервера, вы можете легко расшифровать трафик в Wireshark.http://support.citrix.com/article/CTX116557/

 Смежные вопросы

  • Нет связанных вопросов^_^