有人可以帮我解决这个问题吗? 我花了相当多的时间来设置PhantomJS以保存特定网页的JPG,并且在我通过代理访问网络的机器上进行部署之前,它的工作原理非常好。 现在,无论我尝试什么,我都无法获得正确的身份验证? 有没有人设法做到这一点?
我正在使用命令行参数: --proxy = XX.XX.XX.XX:8080 --proxy型= HTTP --proxyAuth =名为myUsername:输入mypassword
我已经检查了代理(TMG),它仍然坚持我的用户名是匿名的,而不是我使用命令行发送的用户名。
从--debug,我能够看到代理,proxyType和proxyAuth都已正确填充,所以PhantomJS正在理解命令行,但是当它运行时,它仍然返回'代理需要身份验证'
我哪里错了?
感谢您阅读本文,希望能帮助我
BTW - 我使用的是Windows 7 - 64位
答案 0 :(得分:1)
好的,所以我已经完成了大量的工作,并且已经开始工作了。所以我想我会发布我发现的东西,以防它可能帮助别人。
我在搜索时发现的一件事是,有一些关于在JS提交的标题中包含以下内容的讨论,用于驱动PhantomJS:
page.customHeaders={'Authorization': 'Basic '+btoa('username:password')};
而不是使用
page.settings.userName = 'username';
page.settings.password = 'password';
哪个不行。请参阅Previous Discussion
如果您在代理上使用基本级别的身份验证,则可以。如果您使用集成验证,它将无法工作,因为这仍然需要NTLM / Kerberos或其他。
解决这个问题的方法是更改客户端上的设置。
您需要允许客户端访问外部世界而不通过代理进行路由。当然,在TMG中,可以通过更改适用于客户端硬件上安装的客户端网络软件的设置来完成此操作。
通过允许PhantomJS可执行文件绕过代理,您将克服我和许多其他人遇到的问题,但您仍然会遇到一些问题因为您刚刚破坏了系统安全性所以请注意并希望有一个新版本的PhantomJS可以处理NTLM / Kerberos。
或者,更改您的代理以使用基本身份验证,这将允许使用customHeaders解决方案如上所述工作,但这可能比允许客户端绕过代理服务器更大的安全风险。
答案 1 :(得分:0)
var page = require('webpage').create(),
system = require('system'),
fs = require('fs'),
fileName = 'phantomjs',
extension = 'log',
file = fs.open(fileName + '.' + extension, 'w'),
address,
output,
delay,
version = phantom.version.major + '.'
+ phantom.version.minor + '.'
+ phantom.version.patch ;
if (system.args.length === 1){
console.log('Usage: example.js <some URL> delay');
phantom.exit();
}
// Handle the command line arguments
address = system.args[1];
output = system.args[2];
delay = system.args[3];
// Write the Headers into the log file
file.writeLine("PhantomJS version: " + version);
file.writeLine("Opening page: " + address);
file.writeLine("Writing image to: " + output);
file.writeLine("Applying a delay of: " + delay + " milliseconds");
function quit(reason, value) {
console.log("Quit: " + reason);
file.writeLine("Quit: " + reason);
file.close();
if (value !== 1){
// If there has been an error reported, stick a datetime stamp on the log to retain it
var d = new Date();
var dateString = d.getFullYear().toString() +
((d.getMonth() + 1) <= 9 ? '0' : '') + (d.getMonth() + 1).toString() +
(d.getDate() <= 9 ? '0' : '') + d.getDate().toString() +
(d.getHours() <= 9 ? '0' : '') + d.getHours().toString() +
(d.getMinutes() <= 9 ? '0' : '') + d.getMinutes().toString() +
(d.getSeconds() <= 9 ? '0' : '') + d.getSeconds().toString();
fs.move(fileName + '.' + extension, fileName + '_' + dateString + '.' + extension);
}
phantom.exit(value);
}
page.onResourceError = function(resourceError) {
page.reason = resourceError.errorString;
page.reason_url = resourceError.url;
};
page.onError = function (msg, trace) {
console.log(msg);
file.writeLine(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
//file.writeLine(' ', item.file, ':', item.line);
})
quit("Failed", 0);
}
page.onResourceRequested = function (request) {
file.writeLine('Request: ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function (response) {
file.writeLine('Receive: ' + JSON.stringify(response, undefined, 4));
};
// Set a user agent - if required
//page.settings.userAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322)';
// And open the page
page.open(address, function (status) {
if (status !== 'success') {
console.log('Unable to load the address: \"' + page.reason_url + '\": ' + page.reason);
file.writeLine('Unable to load the address: \"' + page.reason_url + '\": ' + page.reason);
quit("Failed", 0);
}
else {
window.setTimeout(function() {
console.log('Saving the page!');
file.writeLine('Saving the page!');
page.render(output);
quit("Finished", 1);
}, delay);
}
});