2016-12-30 6 views
3

Я пытаюсь написать сценарий PhantomJS, который будет автоматизировать отправку приложений Android в магазин приложений Amazon. Я основываю свой скрипт на этом примере: http://code-epicenter.com/how-to-login-amazon-using-phantomjs-working-example/. Я изменил этот пример для работы с https://developer.amazon.com/home.html вместо URL-адреса, используемого в примере.Не удалось получить пример PhantomJS для работы

Вот что я пробовал:

var steps=[]; 
var testindex = 0; 
var loadInProgress = false;//This is set to true when a page is still loading 

/*********SETTINGS*********************/ 
var username = 'unknown'; 
var password = 'unknown'; 

var webPage = require('webpage'); 
var page = webPage.create(); 
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'; 
page.settings.javascriptEnabled = true; 
page.settings.loadImages = false;//Script is much faster with this field set to false 
phantom.cookiesEnabled = true; 
phantom.javascriptEnabled = true; 
/*********SETTINGS END*****************/ 


/* Get command line args user password*/ 
var system = require('system'); 
var args = system.args; 

if (args.length === 1) { 
    console.log('Try to pass some arguments when invoking this script!'); 
} else { 
    args.forEach(function(arg, i) { 
    console.log(i + ': ' + arg); 
    if (i === 1) { username = arg; } 
    if (i === 2) { password = arg; } 
    }); 
} 

if (username == 'unknown') { 
     console.log('Please specify username and password'); 
     phantom.exit(); 
} 
if (password == 'unknown') { 
     console.log('Please specify username and password'); 
     phantom.exit(); 
} 


console.log('All settings loaded, start with execution'); 
page.onConsoleMessage = function(msg) { 
    console.log(msg); 
}; 
/**********DEFINE STEPS THAT FANTOM SHOULD DO***********************/ 
steps = [ 

     /* 
     * Step 1 - Open Amazon home page 
     */ 
     function(){ 
       console.log('Step 1 - Open Amazon home page'); 
       page.open("https://developer.amazon.com/home.html", function(status) { 
         console.log('status is '+ status); 
       }); 
     }, 

       /* 
    * Step 2 - Populate and submit the login form 
    */ 
    function(username,password){ 
      console.log('Step 2 - Populate and submit the login form'); 
      // var appActionToken = page.evaluate(function() { return $('input[name="appActionToken"]').attr('value'); }); 
      // console.log('appActionToken is ' + appActionToken); 
      console.log('username is ' + username); 
      page.evaluate(function(username,password){ 
        console.log(' username is ' + username); 
        document.getElementById("ap_email").value=username; 
        document.getElementById("ap_password").value=password; 
        document.getElementById("ap_signin_form").submit(); 
      },username, password); 
    }, 


     /* 
     * Step 3 - Wait Amazon to login user. After user is successfully logged in, 
     * user is redirected to home page. Content of the home page is saved to AmazonLoggedIn.html. 
     * You can find this file where phantomjs.exe file is. You can open this file using Chrome to ensure that you are logged in. 
     */ 
     function(){ 
       console.log("Step 3 - blah blah blah"); 
       var fs = require('fs'); 
       var result = page.evaluate(function() { 
         return document.querySelectorAll("html")[0].outerHTML; 
       }); 
       fs.write('AmazonLoggedIn.html',result,'w'); 
     }, 
]; 

/**********END STEPS THAT FANTOM SHOULD DO***********************/ 

//Execute steps one by one 
interval = setInterval(executeRequestsStepByStep,50); 

function executeRequestsStepByStep(){ 
    if (loadInProgress == false && typeof steps[testindex] == "function") { 
     console.log("testindex is " + testindex); 
     if (testindex == 1) { 
       console.log("username is " + username); 
      steps[testindex](username, password); 
     } else { 
      steps[testindex](); 
     } 
     testindex++; 
    } 
    if (typeof steps[testindex] != "function") { 
     console.log("test complete!"); 
     phantom.exit(); 
    } 
} 

/** 
* These listeners are very important in order to phantom work properly. 
* Using these listeners, we control loadInProgress marker which controls, weather a page is fully loaded. 
* Without this, we will get content of the page, even a page is not fully loaded. 
*/ 
page.onLoadStarted = function() { 
    loadInProgress = true; 
    console.log('Loading started'); 
}; 
page.onLoadFinished = function() { 
    loadInProgress = false; 
    console.log('Loading finished'); 
}; 
page.onConsoleMessage = function(msg) { 
    console.log(msg); 
}; 

При запуске выходной скрипт делает пишутся в файл AmazonLoggedIn.html но содержимое указывает, что не удалось Войти. Я вполне уверен, что использую правильные учетные данные. Вот как выглядит полученный AmazonLoggedIn.html как:

enter image description here

ответ

2

Похоже равнину Логин невозможно, я попытался с фантомным/casperjs и - не работает. Работает только с Cookie (и отлично работает).

/*********SETTINGS*********************/ 
var page = require('webpage').create({viewportSize:{width: 1600,height: 900}, 
settings:{userAgent:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36', 
javascriptEnabled:'true', 
loadImages:'false' 
}}), fs = require('fs'); 
/*********SETTINGS END*****************/ 
console.log('All settings loaded, start with execution'); 

page.onLoadStarted = function() { console.log('Loading started') }; 
page.onLoadFinished =function() { console.log('Loading finished') }; 
page.onConsoleMessage = function(msg) { console.log(msg) }; 

// in these vars, you need to have the values of your cookies: 

var at_main='Atza|IwEBIDds270mDqc9pBDWo49OWmIG2UAKXp8N3eYPzCuYn3fFGojBcZXag7M3uZdGurgA28cZA49zToQaoJ0DkQ8ZiAzu6EypTNzrskJNRp-IBqmKPh78s4oSU7o5oBv-7sgmjT-E8_pyxS0oC-t0SYAXdjSYzUeJbXUTTdweOVj_astxNj6_H1uqWysZw59G6sYkwq3A5JhCN_NVZszHUpmQvU4JrhAzV5a8vZgAJmFG5lnK8xl3Nk3uZNTVG3pQYhQ_SLPirg9cdDWICCQFO-fljcnad4PoPRQqdPsUw6OpCHrXEmkEDhn0EC49RzSA63bFlUKTAUUfREuiv0EXoobi19l4Ae98cq_qz38CA4UKF4OHWyBDpAZwZtgUANlaj_l82xUbWwR6yUgZByB-7jICsIs0', 
sess_at_main='RDK4Kzj6ywmJnwhNdqkc37bjioL/FEX20dcHnjMMMUk=', 
session_id='166-7700254-1158037', 
ubid_main='157-9343046-5202510', 
x_main='[email protected]'; 

phantom.cookies = [{// an array of objects 
    'name'  : 'at-main', 
    'value' : at_main, 
    'domain' : '.amazon.com', 
    'path'  : '/', 
    'httponly' : false, 
    'secure' : true, 
    'expires' : (new Date()).getTime() + (1000 * 60 * 60 * 43800) }, //5 years // end of 1 
{ 'name'  : 'sess-at-main', 
    'value' : sess_at_main, 
    'domain' : '.amazon.com', 
    'path'  : '/', 
    'httponly' : false, 
    'secure' : true, 
    'expires' : (new Date()).getTime() + (1000 * 60 * 60 * 43800) }, // end of 2 
{ 'name'  : 'session-id', 
    'value' : session_id, 
    'domain' : '.amazon.com', 
    'path'  : '/', 
    'httponly' : false, 
    'secure' : true, 
    'expires' : (new Date()).getTime() + (1000 * 60 * 60 * 43800) }, // end of 3 
{ 'name'  : 'ubid-main', 
    'value' : ubid_main, 
    'domain' : '.amazon.com', 
    'path'  : '/', 
    'httponly' : false, 
    'secure' : true, 
    'expires' : (new Date()).getTime() + (1000 * 60 * 60 * 43800) }, // end of 4 
{ 'name'  : 'x-main', 
    'value' : x_main, 
    'domain' : '.amazon.com', 
    'path'  : '/', 
    'httponly' : false, 
    'secure' : true, 
    'expires' : (new Date()).getTime() + (1000 * 60 * 60 * 43800) } // end of 5 
] 

//Execute steps one by one 
page.open("https://developer.amazon.com/home.html", function(status){ 
console.log('Step 1'); 
        page.render('step1.png'); 
              setTimeout(step2,3000); 
function step2(){ 
console.log("Step 2"); 
        page.render('step2.png'); 
              var result=page.evaluate(function(){return document.documentElement.outerHTML}); 
                    fs.write('AmazonLoggedIn.html',result,'w'); phantom.exit(); 
} 
}); 

step1.png

// in these vars, you need to have the values of your cookies: 

var at_main=' ', 
sess_at_main=' ', 
session_id=' ', 
ubid_main=' ', 
x_main=' '; 

enter image description here

Вы, вероятно, также необходимо установить Keep me signed in чекбокса: enter image description here

Update:
T o избегайте этого ад с логином, вы можете использовать опцию --cookies-file!
После второй попытки ваш скрипт работает как шарм !!

./phantomjs --cookies-file=./cookies_2.txt am.js [email protected] pass >/dev/stdout 
+1

Удивительный. Спасибо, Игорь. Надеюсь, у меня будет время, чтобы опробовать ваше решение. Я предполагаю, что мне нужно получить значения для at_main, sess_at_main, session_id, ubid_main и x_main из моего браузера, не так ли? –

+1

Обновление: Чтобы избежать ад с логином, вы можете использовать опцию '--cookies-file'! После второй попытки ваш скрипт работает как шарм! './phantomjs --cookies-file =./Cookies_2.txt your_script.js email pass>/dev/stdout' –

+1

вы можете использовать свой оригинальный скрипт с опцией' --cookies-file', все будет работать, возможно после второй попытки, но будет !! –

Смежные вопросы