Обновление: Похоже, что после получения ответа 403 xmlhttprequest просто зависает там, и поэтому код document.location никогда не выполняется, есть идеи, как это обойти?
Я пытаюсь создать букмарклет для загрузки видео с 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 никогда не выполняется, есть идеи, как это обойти?