Передача файлов cookie в HTTP-запросе NodeJs

Я новичок в NodeJs. Я пытаюсь сделать http-запрос и передать файл cookie. Я прочитал все потоки в stackoverflow об этом и составил фрагмент кода, который должен теоретически работать. Но это не так.

То, что я пытаюсь сделать, - отправить куки файл с кодом магазина в один интернет-магазин, который покажет мне информацию об этом самом магазине. Если нет файла cookie, он показывает по умолчанию div запрос на выбор магазина.

Вот мой код:

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

Я предполагаю, что cookie будет отправлен и принят с моей просьбой, но это не так. Я также пробовал jar. Я прокомментировал это в коде. Но, похоже, для меня это тоже не работает. Когда я делаю console.log(resp.headers), я вижу оригинальные файлы cookie, но не мои. Может ли кто-нибудь дать мне подсказку?

Структура файла cookie верна. Когда я запускаю document.cookie=cookie; в консоли Google Chrome, он заменяется succsessfuly.

Ответы

Ответ 1

В ваших заголовках попробуйте поместить непосредственно файл 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'
}

Ответ 2

К сожалению, оба ответа не помогли мне. Я повторю, что целью было сделать http-запрос с передачей файла cookie, содержащего код магазина. Чтобы получить HTML-страницы для этой самой ветки, а не страницу стандартных страниц, просят меня выбрать ее. Попробовав оба варианта, я не получил никаких ошибок, но также не передал файлы cookie на сайт. Но большое спасибо Субъекту за предоставление мне функций. Это дало мне идею использовать те и предлагаемый заголовок с JSDOM. Итак, вот код, который работал у меня:

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

Файл cookie был установлен succsessfuly, и я получил исходный код веб-страниц для этой самой ветки, которую я хотел. Спасибо за ответы и надеюсь, что это поможет кому-то другому.

Ответ 3

Ваша переменная cookieString является заголовком Set-Cookie. Это заголовок сервера, который сервер отправляет клиенту, но не cookie, который клиент отправляет на сервер.

Заголовок Set-Cookie:

 MC_STORE_ID=66860; expires=1234;

Клиент отправляет в заголовке Cookie следующее:

 MC_STORE_ID=66860;

Попробуйте выполнить следующие функции:

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

Чтобы начать использовать это:

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 возвращает объект.

Затем вы можете установить его в своем заголовке:

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

Ответ 4

У меня была такая же проблема, @Рикардо помог мне разобраться. Я удалил ключ jar из заголовка

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

Это своего рода смесь между вашими файлами cookie и моей функцией запроса.