Файлы cookie отсутствуют после использования XMLHttpRequest - PullRequest
1 голос
/ 14 марта 2010

Обновление: Похоже, что после получения ответа 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 никогда не выполняется, есть идеи, как это обойти?

Ответы [ 2 ]

1 голос
/ 07 июля 2012

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

1 голос
/ 14 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...