我正在尝试实现一个解决方案,通过使用PhantomJS,Web位置被打开评估,输出被保存到文件进行处理.特别是扫描恶意脚本.我已经能够使用运行一次的PhantomJS来实现该解决方案.例如,这完美地工作......
var system = require('system'); var page = require('webpage').create(); var lastReceived = new Date().getTime(); var requestCount = 0; var responseCount = 0; var requestIds = []; var fileSystem = require('fs'); var startTime = new Date().getTime(); page.onResourceReceived = function (response) { if(requestIds.indexOf(response.id) !== -1) { lastReceived = new Date().getTime(); responseCount++; requestIds[requestIds.indexOf(response.id)] = null; } }; page.onResourceRequested = function (request) { if(requestIds.indexOf(request.id) === -1) { requestIds.push(request.id); requestCount++; } }; page.open('http://adserver.example.com/adserve/;ID=164857;size=300x250;setID=162909;type=iframe', function () {}); var checkComplete = function () { // We don't allow it to take longer than 5 seconds but // don't return until all requests are finished if((new Date().getTime() - lastReceived > 300 && requestCount === responseCount) || new Date().getTime() - startTime > 5000) { clearInterval(checkCompleteInterval); console.log(page.content); phantom.exit(); } } var checkCompleteInterval = setInterval(checkComplete, 1);
但是,我在创建和自动化系统时遇到了巨大的困难,不需要PhantomJS不断重启,这有很大的开销.我尝试使用命名管道进行读取然后尝试打开传递的URL,但由于某种原因它无法正常打开.我很乐意并非常感谢任何关于此的指导.
值得一提的是,PhantomJS在HTTP通信方面表现优异.这就是为什么对于高级功能和更好的性能,我总是使用资源池模式+ webserver模块.这个模块仍然被标记为实验,但直到现在我总是发现它非常稳定.
因此,我认为在您的情况下最好通过HTTP进行通信比通过文件IO进行通信更好.
这是一个非常基本的例子:
var page = require('webpage').create(); var server = require('webserver').create(); var system = require('system'); var host, port; if (system.args.length !== 2) { console.log('Usage: server.js <some port>'); phantom.exit(1); } else { port = system.args[1]; var listening = server.listen(port, function (request, response) { var page=require('webpage').create(); page.open(request.post.target, function(status){ response.write("Hello "+page.title); response.close(); }); }); if (!listening) { console.log("could not create web server listening on port " + port); phantom.exit(); } //test only var url = "http://localhost:" + port + "/"; console.log("SENDING REQUEST TO:"); console.log(url); var data='target=http://stackoverflow.com/'; page.open(url,'post', data, function (status) { if (status !== 'success') { console.log('FAIL to load the address'); } else { console.log("GOT REPLY FROM SERVER:"); console.log(page.content); } phantom.exit(); }); }