私はNodeJの初心者です。 HTTPリクエストを作成し、Cookieを渡そうとしています。それについてstackoverflowのすべてのスレッドを読み、理論的に機能するはずのコードを作成しました。しかし、そうではありません。
私がやろうとしているのは、ストアコードを含むCookieを1つのオンラインショップに送信して、このショップに関する情報を表示することです。 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は表示されません。誰かが私にヒントを与えることができますか?
Cookieの構造は正しいです。 Googleで_document.cookie=cookie;
_を実行すると、chrome consoleが正常に置き換えられます。
あなたのヘッダーに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'
}
私は同じ問題を抱えていました。@ Ricardoが私を理解するのを助けてくれました。ヘッダーから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データと私のrequest関数の一種です。
残念ながら、両方の答えは私にとってうまくいきませんでした。繰り返しになりますが、目的はストアコードを含むCookieを渡すことでhttpリクエストを行うことでした。このブランチのページHTMLを取得するために、1つを選択するように要求する標準ページではありません。両方のオプションを試した後、エラーは発生しませんでしたが、CookieをWebサイトに渡しませんでした。しかし、機能を提供してくれたSubjectに感謝します。それらと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は正常に設定され、この非常に重要なブランチのWebページのソースコードを取得しました。答えてくれてありがとう、そしてそれが他の誰かを助けることを願っています。
変数cookieStringはSet-Cookieヘッダーです。サーバーがクライアントに送信するサーバーヘッダーですが、クライアントがサーバーに送信するCookieではありません。
Set-Cookieヘッダー:
MC_STORE_ID=66860; expires=1234;
クライアントはCookie Header thisを送信します:
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)
}
Cookieの配列(応答のset-cookieヘッダーから取得)を要求cookieに変換するには:
headers: {
'cookie':cookies.map(c=>c.substr(0, c.indexOf(";"))).reduce((a, b) => a + "; " + b)
}