如何注入 JS 并从网站收集警报消息?

Posted

技术标签:

【中文标题】如何注入 JS 并从网站收集警报消息?【英文标题】:How can I inject JS and collect alert message from website? 【发布时间】:2016-05-26 04:05:50 【问题描述】:

我正在尝试使用覆盖方法从网站收集alert。我在 google 上搜索并找到了wappalyzer,这是一个用于检测网站上的软件的 Chrome/Firefox 扩展程序。它在页面加载和收集信息时注入脚本inject.js。我的方法类似。我制作了一个本地网站并对其进行了测试。当我手动注入overwrite_alert.js 时,它就可以工作了。

但我想动态执行并应用于其他网站。所以我使用像 PhantomJS 这样的无头浏览器。以下代码我在 PhantomJS 中尝试过,但它不起作用。

我正在尝试在 phantom JS 上注入 javascript。喜欢这段代码:

<!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 来自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
    ;
)();

我尝试使用 onLoadStarted 事件和 My PhantomJS 代码:

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");
    
);

结果:

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

【问题讨论】:

【参考方案1】:

因为page.open 回调是在页面加载后调用的,所以更改window.alert 的实现为时已晚。您需要使用较早的事件,例如 page.onInitializedpage.onLoadStarted 等。

由于您对警报感兴趣,因此您根本不需要这样做,因为 PhantomJS 为此提供了一个事件:page.onAlert

【讨论】:

page.onInitializedpage.onLoadStarted 不起作用。我想做覆盖方法,因为将来我不仅要实现alert函数,还要实现另一个函数。 我无法重现您的问题。它对我有用:gist.github.com/artjomb/3867677bf4a9a97966879d49e6594943

以上是关于如何注入 JS 并从网站收集警报消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有警报消息(iOS)的情况下在 webview 中获得地理定位许可?

收集分数并显示消息

如何停止音频警报?

如何取消并从UIAlertView调用用户操作

IOS警报消息

如何在按钮单击 React.js 时运行警报