web-dev-qa-db-fra.com

Comment puis-je utiliser des cookies persistants à partir d'un fichier utilisant phantomjs

J'ai une authentification requise pour atteindre une URL particulière. Dans le navigateur, je n'ai besoin de me connecter qu'une seule fois, car pour les autres URL associées qui peuvent utiliser l'identifiant de session du cookie, il n'est pas nécessaire de se rendre sur la page de connexion. De même, puis-je utiliser le cookie généré dans le fichier cookie à l'aide de --cookies-file=cookies.txt dans la ligne de commande de phantomjs pour ouvrir une autre page qui nécessite le même détail de cookie.

Veuillez suggérer.

24
Arun

Phantom JS et cookies

--cookies-file=cookies.txt ne stockera que les cookies hors session dans le bac à cookies. La connexion et l'authentification sont généralement basées sur des cookies de session.

Qu'en est-il des cookies de session?

Pour les enregistrer, c'est assez simple, mais vous devez considérer qu'ils expireront probablement rapidement.

Vous devez écrire la logique de votre programme pour en tenir compte. Par exemple

  1. Charger les cookies depuis le cookiejar
  2. Frappez une URL pour vérifier si l'utilisateur est connecté
  3. Si non connecté

    Connectez-vous, enregistrez les cookies dans cookiejar

  4. poursuivre le traitement

Exemple

var fs = require('fs');
var CookieJar = "cookiejar.json";
var pageResponses = {};
page.onResourceReceived = function(response) {
    pageResponses[response.url] = response.status;
    fs.write(CookieJar, JSON.stringify(phantom.cookies), "w");
};
if(fs.isFile(CookieJar))
    Array.prototype.forEach.call(JSON.parse(fs.read(CookieJar)), function(x){
        phantom.addCookie(x);
    });

page.open(LoginCheckURL, function(status){
 // this assumes that when you are not logged in, the server replies with a 303
 if(pageResponses[LoginCheckURL] == 303)
 {  
    //attempt login
    //assuming a resourceRequested event is fired the cookies will be written to the jar and on your next load of the script they will be found and used
 }


});
28
Jason

Le fichier créé par l'option --cookies-file=cookies.txt est sérialisé à partir de CookieJar: il y a des caractères supplémentaires et il est parfois difficile d'analyser.

Cela peut ressembler à:

[General]
cookies="@Variant(\0\0\0\x7f\0\0\0\x16QList<QNetworkCookie>\0\0\0\0\x1\0\0\0\v\0\0\0{__cfduid=da7fda1ef6dd8b38450c6ad5632...

J'ai utilisé dans le passé phantom.cookies . Ce tableau sera pré-rempli par toutes les données de cookie existantes stockées dans le fichier de cookie spécifié dans les options de configuration/ligne de commande de démarrage de PhantomJS, le cas échéant. Mais vous pouvez également ajouter un cookie dynamique en utilisant phantom.addCookie .

Un exemple de base est

phantom.addCookie({
    'name':     'Valid-Cookie-Name',   /* required property */
    'value':    'Valid-Cookie-Value',  /* required property */
    'domain':   'localhost',           /* required property */
    'path':     '/foo',
    'httponly': true,
    'secure':   false,
    'expires':  (new Date()).getTime() + (1000 * 60 * 60)   /* <-- expires in 1 hour */
});

Avec ces méthodes, il n'est pas si difficile d'implémenter votre propre logique de gestion des cookies.

9
Cybermaxs