node.js を使用して 10 の異なる Web サイトからメッセージと通知を収集し、それらを自分のメール アカウント (日報のようなもの) に送信します。私は 5 つの異なる Web サイトでこの仕事をしましたが、現在 Amazon で問題が発生しています。
Amazon で行う必要があるのは、資格情報を使用してログインし、データを解析することです。
いくつかの実装とさまざまなアプローチの後、Cookie がサポートされていないため、Amazon がログインを拒否していることに最終的に気付きましたが、それは真実ではありません。
その証拠に、node.js を使用して Amazon ログイン ページを開き、応答を .html ファイルに保存しました。この保存された html ファイルを開くと、Amazon が Cookie を有効にするよう要求していることがわかります。スクリーンショットは次のとおりです。
これが私のnode.jsクリップです:
var request = require("request");
request = request.defaults({jar: true});//Send cookies on every subsequent requests. This is really important
var requestHeaders = new DRequestHeaders();
var cheerio = require('cheerio');
var fs = require('fs');
var user = new DUser('test','test');
//First open start site: http://amazon.com
request.get({headers:requestHeaders.getHeaders(), uri: user.getUrl('startSeite'), followRedirect: true, maxRedirects: 10,}, function(err, res, body) {
if(err) {
console.log('GET request failed here is error');
console.log(res);
}
//Get login link
$=cheerio.load(body);
user.setNewUrl('login',$('#nav-link-yourAccount').attr('href'));
console.log(user.getUrl('login'));
//Go to the login link
request.get({headers:requestHeaders.getHeaders(), uri: user.getUrl('login'), followRedirect: true, maxRedirects: 10,}, function(err, res, body) {
if(err) {
console.log('GET request failed here is error');
console.log(res);
}
//Now we are at login page. We want to prepare for form submittion
//Get hidden input fields
$ = cheerio.load(body);
var inputsFields = $('#ap_signin_form :input');//Get all inputs
user.setNewUrl('form-submit',$('#ap_signin_form').attr('action'));
var formSubmitData = {};
inputsFields.each(function() {
formSubmitData[this.attribs['name']]=this.attribs['value'];//Get attribute name and value
});
//Set username and password, and now everything is ready for form submission
formSubmitData['email'] = user.getUsername();
formSubmitData['password'] = user.getPassword();
//This is just for demonstration. I save response from amazon so I can clearly see the message that cookies are not supported
fs.writeFile("amazon.html", body, function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
});
});
応答オブジェクトを出力し、元の要求を見つけると、node.js がいくつかの Cookie を送信したことがはっきりとわかりますが、なぜ Amazon はそれらを拒否しているのでしょうか?
GET /ap/signin/278-4773600-2469922?_encoding=in HTTP/1.1\r\n
Accept: text/html\r\n
Accept-Language: en-US\r\n
Cache-Control: max-age=0\r\n
Connection: keep-alive\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36\r\n
Cookie: x-wl-uid=1VIRmGEpmmFvZeJXhczJzp7Uv4qmAA6yIt40QrU9OMMLth6j0vSM0j7lKYDYo=; session-id-time=2082751l; session-id=944-4770-24922\r\n
content-type: application/x-www-form-urlencoded\r\n
host: www.amazon.com