2016-09-01 5 views
0

Situation: Ich möchte ein Multithread-Skript erstellen, wo ich eine Liste von IPs + Kontoinformationen mit einer CSV laden. Ich lade die Daten und rufe eine Funktion auf, wo ich Elektronen öffne und mein Albtraumskript in Kombination mit Vo abspiele. Innerhalb des Skripts gehe ich auf eine Website, durchsuche eine Liste von Links und überprüfe, ob jemand in Australien lebt. Wenn ein Fehler auftritt, z. B. Timeout, funktioniert der Browser nicht mehr. Fehler Beispiel ->Elektron Prozess in Multithread nicht nach Fehler

{ message: 'navigation error', 
    code: -7, 
    details: 'Navigation timed out after 30000 ms', 
    url: 'https://facebook.com/login' } 

Hier ist mein Code

var fs = require('fs'); 
var csv = require('fast-csv'); 
var vo = require('vo'); 
var Nightmare = require('nightmare'); 

    var count = 0; 
    var urls = fs.readFileSync('uniqueIds.csv').toString().split("\n"); 

    var arrayUrls = Object.keys(urls).map(function (key) {return urls[key]}); 

    var bloqNumber = 0; 
    function *run(proxy, user, pass, urlsID) { 
     var nightmare = new Nightmare({ 
      webPreferences: { partition: 'your-custom-partition'}, 
      switches:{ 
      'proxy-server': proxy, 
      'ignore-certificate-errors': true 
     }, show: true }); 

     yield nightmare 
     .goto('https://facebook.com/login') 
     .wait(".inputtext._55r1.inputtext._1kbt.inputtext._1kbt") 
     .type('input[name="email"]', user) 
     .type('input[name="pass"]', pass) 
     .click('button[name=login]') 
     .wait(29000); 

     var range = urlsID * 2000; 
     var rangeStart = range - 2000; 
     var urlsarray = arrayUrls.slice(rangeStart, range); 
     for (var i = 0; i < urlsarray.length; i++) { 
       count++; 
       console.log(count + " -> " + proxy); 
       if (count > 150){ 
        yield nightmare.end(); 
       } 
       yield nightmare 
       .goto("https://www.facebook.com/profile.php?id=" + urlsarray[i] + "&sk=about&section=living&pnref=about") 
       .wait(1000); 
       var seqCheck = yield nightmare.exists(".captcha_interstitial"); 
       var bloqCheck = yield nightmare.exists(".mvl.ptm.uiInterstitial.uiInterstitialLarge.uiBoxWhite"); 
       if (seqCheck == true) { 
        console.log("Seqcheck"); 
        yield nightmare.wait(29000); 
       } 
       if (bloqCheck == true) { 
        console.log("Blocked for a week" + user + proxy); 
        bloqNumber++; 
        console.log(bloqNumber); 
       if (bloqNumber > 6) { 
        yield nightmare.end(); 
       } 
        continue; 
       } 

       var location = yield nightmare.exists("._3pw9._2pi4._2ge8"); 
       bloqNumber = 0; 
       console.log(location); 
       if (location == true) { 
        var getLocation = yield nightmare.evaluate(function() { 
            var jsonObject = new Array(); 
            var links = document.getElementsByClassName('_3pw9 _2pi4 _2ge8'); 
            var numProfiles = links.length; 
            for(var i = 0; i< numProfiles; i++){ 
            var elem; 
            try { 
            elem = links[0].querySelector("._50f5._50f7 a").text; 
             } catch (err) { 
             var arrr = new Array('Hello', 'world'); 
             return arrr; 
             } 
            jsonObject.push(elem); 
            } 
            return jsonObject; 
           }); 
       var locationString = getLocation.join(" + "); 
       console.log(locationString + " -> " + urlsarray[i]); 
        if (locationString.indexOf("Australia") !== -1 || 
         locationString.indexOf("Queensland") !== -1 || 
         locationString.indexOf("New South Wales") !== -1 || 
         locationString.indexOf("Victoria") !== -1 || 
         locationString.indexOf("Northern Territory") !== -1 || 
         locationString.indexOf("South Australia") !== -1|| 
         locationString.indexOf("Tasmania") !== -1 || 
         locationString.indexOf("Sydney") !== -1 || 
         locationString.indexOf("Adelaide") !== -1 || 
         locationString.indexOf("Cairns") !== -1 || 
         locationString.indexOf("Perth") !== -1 || 
         locationString.indexOf("Melbourne") !== -1 || 
         locationString.indexOf("Brisbane") !== -1 || 
         locationString.indexOf("Bundaberg") !== -1 || 
         locationString.indexOf("Canberra") !== -1 || 
         locationString.indexOf("Newcastle") !== -1 || 
         locationString.indexOf("Western Australia") !== -1) { 
        console.log("Im in australia"); 

       var stringToPrint = urlsarray[i] + ", " + locationString + "\n"; 
        fs.appendFile('pages.csv', stringToPrint.replace(/(\r\n|\n|\r)/gm,"") + "\n", function (err) { 
         console.log("a new entry"); 
         }); 
        } 
        } else { 
         console.log("It was false"); 
        } 

       } 
       yield nightmare.end(); 
     } 

fs.createReadStream('proxies.csv') 
    .pipe(csv()) 
    .on('data', function (data) { 
     var proxy = data[0]; 
     var user = data[1]; 
     var pass = data[2]; 
     var urlsID = data[3]; 
     console.log(urlsID); 
     console.log(user); 
     console.log(pass); 
     vo(run(proxy, user, pass, urlsID)).then(out => console.log('out', out)).catch(error => console.log(error)); 
    }).on('end', function (data) { 
    console.log('CSV reading finished.') 
}); 

Gewünschtes Ergebnis: Ich möchte jedes Mal, wenn ich irgendeine Art von Fehler angezeigt wird, dass mein Thread geschlossen wird.

Antwort

0

Gelöst. Hängen Sie einfach .catch wie im folgenden Beispiel an.

yield nightmare 
.goto('https://facebook.com/login') 
.wait(".inputtext._55r1.inputtext._1kbt.inputtext._1kbt") 
.type('input[name="email"]', user) 
.type('input[name="pass"]', pass) 
.click('button[name=login]') 
.wait(29000).catch(function(err){ 
        console.dir(err); 
        nightmare.end(); 
       }); 
+1

Haben Sie herausgefunden, was die tatsächliche Zeitüberschreitung verursacht hat? Oder irgendeinen Weg, um es zu verhindern? – otajor