2010-03-14 2 views
1

Mise à jour: Il semble qu'après avoir reçu une réponse 403, le xmlhttprequest se bloque juste là, et donc le code document.location n'est jamais exécuté, des idées sur comment contourner cela? J'essaie de créer un bookmarklet pour télécharger des vidéos sur YouTube, mais j'ai rencontré un petit problème. J'utilise une sorte de méthode de force brute, dans laquelle je fais des demandes en utilisant l'objet XMLHttpRequest jusqu'à ce qu'un 404 ne soit pas retourné (je ne peux pas le faire jusqu'à ce qu'un 200 ok soit retourné parce que YouTube redirige vers un serveur différent si la vidéo est disponible, et la politique inter-domaines ne me permettra pas d'accéder à l'une de ces données).Les cookies ne sont pas présents après l'utilisation de XMLHttpRequest

Une fois qu'une URL de travail est trouvée, je place simplement window.location à l'URL et le téléchargement devrait commencer, non? Faux. Une demande est faite, mais pour des raisons que je ne connais pas, les cookies sont supprimés et YouTube renvoie un accès refusé 403. Cela ne se produit pas si les requêtes XML ne sont pas faites avant, c'est-à-dire si je mets juste window.location à l'URL, tout fonctionne bien, c'est quand je fais le XMLHttpRequest que les cookies ne sont pas envoyés.

Il est difficile d'expliquer voici donc le script:

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 
    } 
} 

Ce script n'envoie pas les cookies après le réglage de la document.location et donc ne fonctionne pas. Cependant, simplement en faisant ceci:

 

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

FAIT envoyer les biscuits avec la demande, et fonctionne. Le seul inconvénient est que je ne peux pas détecter automatiquement la qualité la plus élevée, je dois juste essayer chaque paramètre "fmt" manuellement jusqu'à ce que je le fasse correctement. Donc, ma question est la suivante: pourquoi l'objet XMLHttpRequest supprime-t-il les cookies des demandes suivantes?

C'est la première fois que je fais quelque chose dans JS, alors s'il vous plaît, allez-y doucement. Mise à jour: Il semble qu'après avoir reçu une réponse 403, le xmlhttprequest se bloque juste là, et donc le code document.location n'est jamais exécuté, des idées sur la façon de contourner cela?

Répondre

1

Il semble peu probable que la requête AJAX supprime le cookie (ce qui serait un bug de navigateur) et plus probablement que YouTube révoque la session (identifiée par le cookie) en supprimant le cookie. Je remarque les deux demandes sont différentes - fait ce travail

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

essayez également tester uniquement pour deux formats différents - YouTube pourrait penser que vous êtes essayer de force brute, ou tout simplement ne pas autoriser les mashups API tentées en révoquant les cookies de la requête sur XMLhttp ...

+0

Oui j'ai compris maintenant. Je confondais XMLHttpRequest pour la requête document.location, ce qui explique pourquoi les cookies n'étaient pas présents. Le document.location = url + formats [i]; La ligne n'est jamais exécutée car la requête est bloquée. –

+0

Ceci est un proxy utile pour déboguer des choses que firebug ne vous dit pas http://www.fiddler2.com/fiddler2/ – Andy

+0

Vous pouvez également utiliser WireShark pour des choses comme ça. J'essaye maintenant, mais malheureusement le serveur que je travaille est HTTPS seulement, ainsi je vois seulement le trafic crypté :( –

1

Drew, Il est peut-être tard et peut-être vous le savez déjà! Mais si vous avez accès à la clé privée du serveur, vous pouvez décrypter le trafic assez facilement dans Wireshark.http://support.citrix.com/article/CTX116557/