3 votes

Impossible de faire fonctionner l'exemple PhantomJS.

Je tente d'écrire un script PhantomJS qui automatisera la soumission d'applications Android sur l'Amazon App Store. Je base mon script sur cet exemple : http://code-epicenter.com/how-to-login-amazon-using-phantomjs-working-example/. J'ai modifié cet exemple pour fonctionner avec https://developer.amazon.com/home.html au lieu de l'URL utilisée dans l'exemple.

Voici ce que j'ai essayé:

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

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

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 == 'inconnu' ) {
        console.log('Veuillez spécifier le nom d\'utilisateur et le mot de passe');
        phantom.exit();
}
if ( password == 'inconnu' ) {
        console.log('Veuillez spécifier le nom d\'utilisateur et le mot de passe');
        phantom.exit();
}

console.log('Tous les réglages sont chargés, commençons l'exécution');
page.onConsoleMessage = function(msg) {
    console.log(msg);
};
/**********DÉFINIR LES ÉTAPES QUE FANTOM DOIT EFFECTUER***********************/
steps = [

        /*
         * Étape 1 - Ouvrir la page d'accueil d'Amazon
         */
        function(){
                console.log('Étape 1 - Ouvrir la page d\'accueil d\'Amazon');
                page.open("https://developer.amazon.com/home.html", function(status) {
                        console.log('Le statut est '+ status );
                });
        },

                /*
     * Étape 2 - Remplir et soumettre le formulaire de connexion
     */
    function(username,password){
            console.log('Étape 2 - Remplir et soumettre le formulaire de connexion');
            // var appActionToken = page.evaluate(function() { return $('input[name="appActionToken"]').attr('value'); });
            // console.log( 'appActionToken is ' + appActionToken );
            console.log( 'nom d\'utilisateur est ' + username );
            page.evaluate(function(username,password){
                    console.log( '  nom d\'utilisateur est ' + username );
                    document.getElementById("ap_email").value=username;
                    document.getElementById("ap_password").value=password;
                    document.getElementById("ap_signin_form").submit();
            },username, password);
    },

        /*
         * Étape 3 - Attendre qu'Amazon connecte l'utilisateur. Après la connexion réussie de l'utilisateur,
         * l'utilisateur est redirigé vers la page d'accueil. Le contenu de la page d'accueil est enregistré dans AmazonLoggedIn.html.
         * Vous pouvez trouver ce fichier où se trouve le fichier phantomjs.exe. Vous pouvez ouvrir ce fichier avec Chrome pour vous assurer que vous êtes connecté.
         */
        function(){
                console.log("Étape 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');
        },
];

/**********FIN DES ÉTAPES QUE FANTOM DOIT EFFECTUER***********************/

//Exécuter les étapes une par une
interval = setInterval(executeRequestsStepByStep,50);

function executeRequestsStepByStep(){
    if (loadInProgress == false && typeof steps[testindex] == "function") {
        console.log("testindex est " + testindex );
        if ( testindex == 1 ) {
                console.log( "nom d'utilisateur est " + username );
            steps[testindex](username, password);
        } else {
            steps[testindex]();
        }
        testindex++;
    }
    if (typeof steps[testindex] != "function") {
        console.log("test complet !");
        phantom.exit();
    }
}

/**
 * Ces auditeurs sont très importants pour que Phantom fonctionne correctement.
 * En utilisant ces auditeurs, nous contrôlons le marqueur loadInProgress qui contrôle si une page est entièrement chargée.
 * Sans cela, nous obtiendrons le contenu de la page, même si une page n'est pas encore entièrement chargée.
 */
page.onLoadStarted = function() {
    loadInProgress = true;
    console.log('Chargement démarré');
};
page.onLoadFinished = function() {
    loadInProgress = false;
    console.log('Chargement terminé');
};
page.onConsoleMessage = function(msg) {
    console.log(msg);
};

Lorsque j'exécute le script, la sortie est écrite dans le fichier AmazonLoggedIn.html mais le contenu indique que la connexion a échoué. Je suis assez sûr d'utiliser les identifiants corrects. Voici à quoi ressemble le AmazonLoggedIn.html résultant:

entrer la description de l'image ici

2voto

Il semble que le login normal soit impossible, j'ai essayé avec phantom/casperjs et cela ne fonctionne pas. Ne fonctionne qu'avec les cookies (et fonctionne parfaitement).

/*********PARAMÈTRES*********************/
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');
/*********PARAMÈTRES FIN*****************/
console.log('Tous les paramètres chargés, commencer l'exécution');

page.onLoadStarted = function() { console.log('Chargement commencé') };
page.onLoadFinished =function() { console.log('Chargement terminé') };
page.onConsoleMessage = function(msg) { console.log(msg) };

// dans ces variables, vous devez avoir les valeurs de vos 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='DBSZwuolSC12SSlS36cN7VhwXIg770zKumtGLK9THJji?XszMxT4xe?0FNT@MMfQ';

phantom.cookies = [{// un tableau d'objets
  'name'     : 'at-main',   
  'value'    :  at_main,
  'domain'   : '.amazon.com',
  'path'     : '/',
  'httponly' : false,
  'secure'   : true,
  'expires'  : (new Date()).getTime() + (1000 * 60 * 60 * 43800) }, //5 ans // fin de 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) }, // fin de 2
{ 'name'     : 'session-id',
  'value'    :  session_id,
  'domain'   : '.amazon.com',
  'path'     : '/',
  'httponly' : false,
  'secure'   : true,
  'expires'  : (new Date()).getTime() + (1000 * 60 * 60 * 43800) }, // fin de 3
{ 'name'     : 'ubid-main',   
  'value'    :  ubid_main,
  'domain'   : '.amazon.com',
  'path'     : '/',
  'httponly' : false,
  'secure'   : true,
  'expires'  : (new Date()).getTime() + (1000 * 60 * 60 * 43800) }, // fin de 4
{ 'name'     : 'x-main',
  'value'    :  x_main,
  'domain'   : '.amazon.com',
  'path'     : '/',
  'httponly' : false,
  'secure'   : true,
  'expires'  : (new Date()).getTime() + (1000 * 60 * 60 * 43800) } // fin de 5
]

//Exécuter les étapes une par une
page.open("https://developer.amazon.com/home.html", function(status){
console.log('Étape 1');
                     page.render('step1.png');
                                             setTimeout(step2,3000);
function step2(){
console.log("Étape 2");
                     page.render('step2.png');
                                            var result=page.evaluate(function(){return document.documentElement.outerHTML});
                                                                     fs.write('AmazonLoggedIn.html',result,'w'); phantom.exit();
}
});

step1.png

// dans ces variables, vous devez avoir les valeurs de vos cookies:

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

enter image description here

Vous devez probablement également définir la case à cocher Rester connecté: enter image description here

Mise à jour:
Pour éviter ce casse-tête avec la connexion, vous pouvez utiliser l'option --cookies-file!
Après la deuxième tentative, votre script fonctionne comme un charme !!

./phantomjs --cookies-file=./cookies_2.txt am.js luxadm1@gmail.com pass >/dev/stdout

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X