it-swarm.com.de

Übergeben von Cookies in NodeJs http-Anforderung

Ich bin eine Art Neuling in NodeJs. Ich versuche, eine http-Anfrage zu stellen und ein Cookie zu übergeben. Ich habe alle Threads auf Stackoverflow darüber gelesen und einen Code erstellt, der theoretisch funktionieren sollte. Aber das tut es nicht.

Was ich versuche, ist, einen Cookie mit dem Shop-Code an einen Online-Shop zu senden, der mir die Informationen zu diesem Shop anzeigt. Wenn kein Cookie vorhanden ist, wird die Standardvariable div angezeigt, die die Auswahl eines Shops fordert.

Hier ist mein 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);

Ich gehe davon aus, dass der Cookie mit meiner Anfrage gesendet und akzeptiert wird. Dies ist jedoch nicht der Fall. Ich habe auch jar ausprobiert. Ich habe es im Code kommentiert. Aber es scheint auch für mich nicht zu funktionieren. Wenn ich console.log(resp.headers) mache, sehe ich die ursprünglichen Cookies, aber nicht meine. Kann mir jemand einen Tipp geben? 

Die Cookie-Struktur ist korrekt. Wenn ich document.cookie=cookie; in der Google Chrome-Konsole ausführte, wird dies erfolgreich ersetzt.

19
Jevgeni Jostin

Versuchen Sie, den cookieString direkt in Ihre Header einzufügen 

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

Ich hatte das gleiche Problem, @Ricardo hat mir geholfen herauszufinden, ... Ich habe den jar - Schlüssel aus dem Header entfernt

//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)});
    }
});

Dies ist eine Art Mischung zwischen Ihren Cookie-Daten und meiner AnfrageFunktion.

12
Pini Cheyni

Leider haben beide Antworten für mich nicht funktioniert. Ich möchte noch einmal wiederholen, dass das Ziel darin bestand, eine http-Anfrage mit dem Passieren eines Cookies zu erstellen, der den Geschäftscode enthält. Um die HTML-Seiten für diesen Zweig zu erhalten, nicht die Standardseite, in der ich gebeten wurde, eine auszuwählen. Nachdem ich beide Optionen ausprobiert hatte, bekam ich keine Fehlermeldung, aber auch das Cookie wurde nicht an die Website weitergegeben. Vielen Dank an Subject für die Bereitstellung der Funktionen. Ich hatte die Idee, diese und den angebotenen Header mit einem JSDOM zu verwenden. Also hier ist der Code, der für mich funktioniert hat:

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());
    }
});

Der Cookie wurde erfolgreich gesetzt, und ich bekam den Quellcode der Webseite für diesen Zweig, den ich wollte ... Vielen Dank für die Antworten und hoffe, er würde jemand anderem helfen.

3
Jevgeni Jostin

Ihre Variable cookieString ist ein Set-Cookie Header. Es ist ein Serverheader, den der Server an den Client sendet, jedoch kein Cookie, das der Client an den Server sendet.

Set-Cookie Header:

 MC_STORE_ID=66860; expires=1234;

Der Client sendet in Cookie Header folgendes:

 MC_STORE_ID=66860;

Probieren Sie diese Funktionen aus:

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

So starten Sie das:

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 gibt ein Objekt zurück.

Dann können Sie es in Ihrem Header setzen:

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

So konvertieren Sie ein Array von Cookies (das aus dem Set-Cookie-Header einer Antwort stammt) in ein Anforderungs-Cookie:

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