2016-12-21 3 views
0

J'essaie d'apprendre la mise au rebut en utilisant nodejs et nightmarejs. Je voulais créer un bot qui peut se connecter à mon compte linkedin, puis chercher une technologie, comme javascript par exemple, puis ajouter le lien de chaque profil dans la feuille dans un tableau, et avec ce tableau, je voulais utiliser une boucle avec "pour" cliquer sur chaque lien. A la fin, j'envoie une invitation pour chaque profil sur la feuille.linkedin bot en ajoutant des gens automatiquement

Voici mon code:

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }) 

var langage = process.argv[2]; 

var urls = []; 
nightmare 
    .viewport(1000, 720) 
    .goto('https://www.linkedin.com/') 
    .type('#login-email', '**********@gmail.com') 
    .type('#login-password', '*********') 
    .click('#login-submit') 
    .wait(3000) 
    .type('#main-search-box', langage) 
    .wait(3000) 
    .click('.search-button') 
    .wait(2000) 
    .click('a[data-li-vertical-type="people"]') 
    .wait() 
    .evaluate(function() { 
var link = []; 
    $('.primary-action-button.label').each(function(i, item) { 
    link.push($(item).attr('href')); 
    urls = link; 
}) 

    } 
}) 

.run(function (err, nightmare) { 
if (err) return console.log(err); 
console.log('Done!'); 


for (var i = 0; i< urls.length; i++) { 
nightmare 
    .goto(urls[i]) 
    .click('#IF-reason-iweReconnect') 
    .wait() 
    .click('.btn-primary') 
}  


    }); 

Je me Type du jquery 'script.js de nœud dans la console et il a dit que 'urls n'est pas défini', et je n'undestand pas où est mon erreur. Si vous pouvez me aider, ce serait vraiment utile :) Merci,

Kev

+0

Quelqu'un pour m'aider? :) –

Répondre

0

Vous frappez deux pièges avec Nightmare. Premièrement, la levée de variable - comme vous essayez de le faire avec le tableau urls - ne fonctionne pas comme vous pourriez le penser. Les variables de la portée englobante ne sont pas disponibles pour une étendue à l'intérieur d'un .evaluate() en raison de la façon dont la fonction .evaluate() d est transmise à Electron. Corriger ceci est raisonnablement facile: renvoyer le tableau de la fonction évaluée et avoir un appel intermédiaire à .then(). Quelque chose comme (édité par souci de concision):

.evaluate(function() { 
    var link = []; 
    $('.primary-action-button.label').each(function(i, item) { 
     link.push($(item).attr('href')); 
    }) 
    return link; 
}) 
.then(function(urls){ 
    nightmare.goto(urls[0]) ... 
}) 

Pour une explication plus approfondie, vous pouvez lire Variable Lifting and .evaluate().

Le deuxième problème que vous allez presque immédiatement toucher est de boucler quelque chose et d'utiliser une instance de Nightmare pour exécuter une commande. De par sa conception, Nightmare est asynchrone et, en tant que tel, il ne fonctionnera pas. Vous voudrez probablement donner une lecture à Async Operations and Loops. Exemple JS Vanilla pertinent soulevé à partir de là:

var urls = ['http://example1.com', 'http://example2.com', 'http://example3.com']; 
urls.reduce(function(accumulator, url) { 
    return accumulator.then(function(results) { 
    return nightmare.goto(url) 
     .wait('body') 
     .title() 
     .then(function(result){ 
     results.push(result); 
     return results; 
     }); 
    }); 
}, Promise.resolve([])).then(function(results){ 
    console.dir(results); 
});