2016-05-26 3 views
0

Ich versuche, alert von der Website zu sammeln, indem Sie die Methode überschreiben verwenden. Ich suchte auf Google und fand wappalyzer, eine Chrome/Firefox-Erweiterung, um Software auf der Website zu erkennen. Es injiziert ein Skript inject.js beim Laden und Sammeln von Informationen. Meine Methode ist ähnlich. Ich mache eine lokale Website und teste sie. Wenn ich overwrite_alert.js manuell injiziere, dann funktioniert es.Wie kann ich JS injizieren und eine Warnmeldung von der Website sammeln?

Aber ich möchte es dynamisch tun und auf andere Website anwenden. Also benutze ich Headless Browser wie PhantomJS. Der folgende Code, den ich in PhantomJS ausprobiert habe, funktioniert aber nicht.

Ich versuche, ein JavaScript auf Phantom JS zu injizieren. Wie dieser Code:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test alert</title> 

    <!-- !!! Inject here !!! <script src="overwrite_alert.js"></script> --> 

    <script type="text/javascript" src="other_script.js"> </script> 
    <script type="text/javascript"> 
     alert("Alert content"); 
    </script> 
</head> 
<body> 
<h1>website content</h1> 
</body> 
</html> 

overwrite_alert.js Datei von this question:

(function() { 
    var _alert = window.alert;     // <-- Reference 
    window.alert = function(str) { 
     // do something additional 
     if(console) console.log(str); 
     //return _alert.apply(this, arguments); // <-- The universal method 
     _alert(str);        // Suits for this case 
    }; 
})(); 

Ich habe versucht, mit onLoadStarted Ereignis und My PhantomJS Code:

var webPage = require('webpage'); 
var page = webPage.create(); 

var url = "https://localhost:5000/alert.html"; 


page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('CONSOLE> ' + msg); 
}; 

page.onLoadStarted = function() { 
    if (page.injectJs('do.js')) { 
     var title = page.evaluate(function() { 
      // returnTitle is a function loaded from our do.js file - see below 
      console.log("evaluate completed"); 
     }); 
     console.log(title); 
    } 
} 


page.open(url, function(status) { 
    if (status === "success") { 
     if (page.injectJs('do.js')) { 
      var title = page.evaluate(function() { 
       // returnTitle is a function loaded from our do.js file - see below 
       console.log("evaluate completed"); 
      }); 
      console.log(title); 
      phantom.exit(); 
     } 


     page.render("onOpen.png"); 
    } 
}); 

Ergebnis:

$ phantomjs test_inject.js 
CONSOLE> from onLoadStarted completed 
null 
CONSOLE> from page.open 
null 

Antwort

0

Da der page.open Callback nach eine Seite geladen wird, wäre es einfach zu spät, die Implementierung von window.alert zu ändern. Sie müßten frühere Veranstaltungen verwenden wie page.onInitialized, page.onLoadStarted usw.

Da Sie in der Benachrichtigung interessiert sind, Sie nicht, dass überhaupt tun müssen, weil PhantomJS ein Ereignis für das lautet: page.onAlert

+0

'page.onInitialized' und' page.onLoadStarted' funktionieren nicht. Ich möchte die Methode überschreiben, weil ich in Zukunft nicht nur eine "Alarm" -Funktion, sondern auch eine andere Funktion implementieren werde. –

+0

Ich kann Ihr Problem nicht reproduzieren. Es funktioniert für mich: https://gist.github.com/artjomb/3867677bf4a9a97966879d49e6594943 –

+0

Es funktioniert wie ein Charme. Vielen Dank. –

Verwandte Themen