web-dev-qa-db-fra.com

Passer des cookies dans la requête http de NodeJs

Je suis un peu un débutant dans NodeJs. J'essaie de faire une requête http et de transmettre un cookie. J'ai lu toutes les discussions sur stackoverflow à ce sujet et ai créé un morceau de code qui devrait théoriquement fonctionner. Mais ce n'est pas le cas.

Ce que j'essaie de faire est d'envoyer un cookie avec le code du magasin à un magasin en ligne qui me montrera les informations sur ce magasin. S'il n'y a pas de cookie, la variable div par défaut vous demandant de choisir un magasin est affichée.

Voici mon code: 

var request = require('request'),
    http = require('follow-redirects').http,
    request = request.defaults({
        jar: true
    });

var cookieString = 'MC_STORE_ID=66860; expires=' + new Date(new Date().getTime() + 86409000);
var str = '';
//var uri = 'example.de';

//var j = request.jar();
var cookie = request.cookie(cookieString);
j.setCookie(cookie, uri);

var options = {
    hostname: 'example.de',
    path: '/pathexample',
    method: 'GET',
    headers: {
        'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Cookie': cookie,
            'Accept': '/',
            'Connection': 'keep-alive'
    }
    //,jar: j
};

http.request(options, function (resp) {
    resp.setEncoding('utf8');
    console.log(resp.headers);
    if (resp.statusCode) {
        resp.on('data', function (part) {
            str += part;
        });
        resp.on('end', function (part) {
            console.log(str);
        });

        resp.on('error', function (e) {
            console.log('Problem with request: ' + e.message);
        });
    }
}).end(str);

Je suppose que le cookie sera envoyé et accepté avec ma demande, mais ce n’est pas le cas. J'ai aussi essayé jar. Je l'ai commenté dans le code. Mais cela ne semble pas fonctionner pour moi non plus. Quand je fais console.log(resp.headers) je vois les cookies originaux, mais pas les miens. Quelqu'un peut-il me donner un indice? 

La structure du cookie est correcte. Lorsque je lance document.cookie=cookie; dans la console Google Chrome, il est remplacé avec succès.

19
Jevgeni Jostin

Dans vos en-têtes, essayez de mettre directement le cookieString 

headers: {
    'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
    'Cookie': cookieString,
    'Accept': '/',
    'Connection': 'keep-alive'
}
15
Riccardo

J'ai eu le même problème, @Ricardo m'a aidé à comprendre ... J'ai enlevé la clé jar de l'en-tête

//Set the cookie instead of setting into header
var cookie = request.cookie('MC_STORE_ID=66860');


// Set the headers for the request
var headers = {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(post_data),
    'Cookie': cookie
};
// Configure the request
var options = {
    url: requestObj["URL"],
    method: 'POST',
    headers: headers
};

// Start the request
request(options, function (error, response, body) {
    if (!error && response.statusCode === 200) {
        // Print out the response body
        cb(null, {status: 0, statusDsc: "success", data: body});
    } else {
        cb(error, {status: 2, statusDsc: JSON.stringify(error)});
    }
});

Il s’agit d’un mélange entre vos données de cookie et ma fonction request.

12
Pini Cheyni

Malheureusement, les deux réponses n'ont pas fonctionné pour moi. Je vais répéter que l'objectif était de faire une requête http en passant un cookie contenant le code du magasin. Pour obtenir les pages HTML de cette branche, et non la page standard qui me demande de choisir l'une des options . Après avoir essayé les deux options, aucune erreur ne s'est produite, mais le cookie n'a pas été transmis au site Web. Mais merci beaucoup à Subject de m'avoir fourni les fonctions. Cela m'a donné une idée d'utiliser ceux-ci et l'en-tête proposé avec un JSDOM. Alors voici le code qui a fonctionné pour moi:

var jsdom = require('jsdom');

var stores = ["68357"];

function dataCookieToString(dataCookie) {
    var t = "";
    for (var x = 0; x < dataCookie.length; x++) {
        t += ((t !== "") ? "; " : "") + dataCookie[x].key + "=" + dataCookie[x].value;
    }
    return t;
}

function mkdataCookie(cookie) {
    var t, j;
    cookie = cookie.toString().replace(/,([^ ])/g, ",[12],$1").split(",[12],");
    for (var x = 0; x < cookie.length; x++) {
        cookie[x] = cookie[x].split("; ");
        j = cookie[x][0].split("=");
        t = {
            key: j[0],
            value: j[1]
        };
        for (var i = 1; i < cookie[x].length; i++) {
            j = cookie[x][i].split("=");
            t[j[0]] = j[1];
        }
        cookie[x] = t;
    }
    return cookie;
}

var dataCookie = mkdataCookie('MC_STORE_ID=' + stores[0] + '; Expires=' + new Date(new Date().getTime() + 86409000));

jsdom.env({
    url: 'http://www.example.de',
    headers: {
        'User-Agent': "NodeJS/1.0",
            'Cookie': dataCookieToString(dataCookie)
    },
    scripts: ['http://code.jquery.com/jquery-1.5.min.js'],
    done: function (err, window) {
        var $ = window.jQuery;
        console.log($('body').html());
    }
});

Le cookie a été installé avec succès et j'ai obtenu le code source des pages Web de cette branche que je voulais .. Je vous remercie pour vos réponses et espère que cela aiderait quelqu'un d'autre.

3
Jevgeni Jostin

Votre variable cookieString est un en-tête Set-Cookie . C'est un en-tête de serveur que le serveur envoie au client, mais pas un cookie que le client envoie au serveur.

Set-Cookie header:

 MC_STORE_ID=66860; expires=1234;

Le client envoie dans Cookie En-tête ceci:

 MC_STORE_ID=66860;

Essayez ces fonctions:

function dataCookieToString(dataCookie) {
    var t = "";
    for (var x = 0; x < dataCookie.length; x++) {
        t += ((t != "") ? "; " : "") + dataCookie[x].key + "=" + dataCookie[x].value;
    }
    return t;
}

function mkdataCookie(cookie) {
    var t, j;
    cookie = cookie.toString().replace(/,([^ ])/g, ",[12],$1").split(",[12],");
    for (var x = 0; x < cookie.length; x++) {
        cookie[x] = cookie[x].split("; ");
        j = cookie[x][0].split("=");
        t = {
            key: j[0],
            value: j[1]
        };
        for (var i = 1; i < cookie[x].length; i++) {
            j = cookie[x][i].split("=");
            t[j[0]] = j[1];
        }
        cookie[x] = t;
    }

    return cookie;
}

Pour commencer, utilisez ceci:

dataCookie = mkdataCookie('MC_STORE_ID=66860; expires=' + new Date(new Date().getTime() + 86409000));
// or mkdataCookie(resp.headers["set-cookie"]) in your `http.request.end()` function.

mkdataCookie renvoie un objet.

Ensuite, vous pouvez le définir dans votre en-tête:

headers: {
    "User-Agent": "NodeJS/1.0",
    "Cookie": dataCookieToString(dataCookie)
}
2
A-312

Pour convertir un tableau de cookies (provenant de l'en-tête set-cookie de la réponse) en un cookie de requête:

    headers: {
     'cookie':cookies.map(c=>c.substr(0, c.indexOf(";"))).reduce((a, b) => a + "; " + b)
}
0
Baris