I've been struggling with the the greater part of the day. In a nutshell, I'm trying to log into Amazon with PhantomJS via a Node.js module. The short version of my problem is that Amazon is giving me a message saying that cookies are required to use the site.
Here are my current resources...
Working example of logging into Amazon using PhantomJS
SO question addressing persistent cookies in PhantomJS
Another SO question about cookies set by Javascript
This last question is particularly interesting because the first answer addresses the user agent (I've tried at least 3 or 4 with identical results), while the second answer points to what I believe may be my problem. In short, Amazon may be trying to set a test cookie via javascript, and then checking if that cookie was set successfully to determine if the user allows cookies. I can successfully confirm that my cookie file is being created, and that Amazon has set cookies in the file, but these apparently don't seem to suffice when submitting the login form because on the next page I get blocked by the cookie warning. This leads me to believe the user in this last question has it right - my page's Javascript is not firing, in spite of trying to ensure it is.
In the end, my page.render shows an Amazon message saying I need to enable cookies to continue. Here is my code...
'use strict';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
phantom = require('phantom'),
// Admin = mongoose.model('Admin'),
Item = mongoose.model('Item'),
config = require('../config/config');
/*
* Check function.
*/
module.exports.check= function() {
var loadInProgress = false,
interval = '',
testindex = 0,
cookiePath = __dirname + 'cookies.txt',
url = 'https://www.amazon.com/ap/signin?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Faffiliate%2Dprogram.amazon.com%2Fhome',
tag = config.defaultAffiliateTag,
periodType = 'preSelected',
preSelectedPeriod = 'yesterday',
// url2 is for order data
url2 = 'https://affiliate-program.amazon.com/home/reports/table.json?query%5Btype%5D=orders&query%5Bstart_date%5D=2016-05-28&query%5Bend_date%5D=2016-06-26&query%5Btag_id%5D=189318233&query%5Bdevice_type%5D=all&query%5Blast_accessed_row_index%5D=0&query%5Bcolumns%5D=title%2Casin%2Ccategory%2Cclicks%2Cconversion%2Cseller%2Cdqty%2Cnqty%2Cqty&query%5Bskip%5D=0&query%5Bsort%5D=asin&query%5Blimit%5D=25&store_id=XXXX',
// url3 is for earnings data
url3 = 'https://affiliate-program.amazon.com/home/reports/table.json?query%5Btype%5D=earnings&query%5Bstart_date%5D=2016-05-28&query%5Bend_date%5D=2016-06-26&query%5Btag_id%5D=189318233&query%5Bdevice_type%5D=all&query%5Blast_accessed_row_index%5D=0&query%5Bcolumns%5D=title%2Casin%2Cseller%2Cprice%2Crate%2Cqty%2Crevenue%2Cearnings%2Cdevicetype&query%5Bskip%5D=0&query%5Bsort%5D=asin&query%5Blimit%5D=25&store_id=XXXX';
phantom.create([/* '--debug=true', */ '--ignore-ssl-errors=true', '--ssl-protocol=any', '--web-security=false', '--cookies-file=' + cookiePath]).then(function(ph) {
ph.createPage().then(function(page) {
page.on('onLoadStarted', function() {
loadInProgress = true;
});
page.on('onLoadFinished', function(response) {
if (response === 'success') {
loadInProgress = false;
} else {
console.log('Phantom page failed to load.');
}
});
page.on('onError', function(msg, trace) {
var msgStack = ['ERROR: ' + msg];
if (trace && trace.length) {
msgStack.push('TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
});
}
console.error(msgStack.join('\n'));
});
page.on('onResourceError', function(resourceError) {
console.log('= onResourceError()');
console.log(' - unable to load url: "' + resourceError.url + '"');
console.log(' - error code: ' + resourceError.errorCode + ', description: ' + resourceError.errorString);
loadInProgress = false;
});
var steps = [
// Step 1
function() {
// Load the initial login page.
console.log('--- JAVASCRIPT ---')
// This is where I try to ensure my page has Javascript Enabled.
// val outputs true here.
page.setting('javascriptEnabled').then(function(val) {
console.log('val: ' + val);
page.setting('settings.userAgent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36');
loadInProgress = true;
page.open(url);
})
},
// Step 2
function() {
// Update username/password.
page.evaluate(function() {
document.getElementById('ap_email').value = 'XXXX';
document.getElementById('ap_password').value = 'XXXX';
});
},
// Step 3
function() {
// Login.
loadInProgress = true;
page.evaluate(function() {
document.forms['signIn'].submit();
});
},
// Step 4
function() {
loadInProgress = true;
page.open(url2);
}
];
var interval = setInterval(function() {
if (!loadInProgress && typeof steps[testindex] === 'function') {
steps[testindex]();
console.log('Test Index: ' + (testindex + 1));
page.render('config/images/step' + (testindex + 1) + '.png');
testindex++;
}
if (typeof steps[testindex] !== 'function') {
clearInterval(interval);
setTimeout(function() {
ph.exit();
}, 5000);
}
}, 50);
});
});
};
What I get as a result of this is the following output:
--- JAVASCRIPT ---
Test Index: 1
val: true
Test Index: 2
Test Index: 3
Test Index: 4
= onResourceError()
- unable to load url: "https://sentry.amazon.com/SSO/redirect?response_typ
e=id_token&client_id=affiliate-program.amazon.com%3A443&redirect_uri=https%3A%2F
%2Faffiliate-program.amazon.com%3A443%2Fhome%2Freports%2Ftable.json%3Fquery%255B
type%255D%3Dorders%26query%255Bstart_date%255D%3D2016-05-28%26query%255Bend_date
%255D%3D2016-06-26%26query%255Btag_id%255D%3D189318233%26query%255Bdevice_type%2
55D%3Dall%26query%255Blast_accessed_row_index%255D%3D0%26query%255Bcolumns%255D%
3Dtitle%252Casin%252Ccategory%252Cclicks%252Cconversion%252Cseller%252Cdqty%252C
nqty%252Cqty%26query%255Bskip%255D%3D0%26query%255Bsort%255D%3Dasin%26query%255B
limit%255D%3D25%26store_id%3XXXX&scope=openid&nonce=5d8a3f10bb3746c799
a05a927b0204f3c0629d5c8c5646bb49ccdcd93f07247e&sentry_handler_version=TomcatSSOF
ilter-1.1-1"
- error code: 5, description: Operation canceled
Phantom page failed to load.
Can anyone enlighten me with what I may be missing?