1

有人可以帮我解决这个问题吗?我花了相当多的时间设置 PhantomJS 来保存特定网页的 JPG,它工作得非常好,直到我将它部署在通过代理访问网络的机器上。现在,无论我尝试什么,我都无法获得正确的身份验证?有没有人设法做到这一点?

我正在使用命令行参数:--proxy=xx.xx.xx.xx:8080 --proxy-type=http --proxyAuth=myusername:mypassword

我检查了代理(TMG),它仍然坚持我的用户名是匿名的,而不是我使用命令行发送的用户名。

从 --debug 中,我可以看到代理、proxyType 和 proxyAuth 都已正确填充,因此 PhantomJS 正在理解命令行,但是当它运行时,它仍然返回“代理需要身份验证”

我哪里错了?

感谢您阅读本文,并希望能帮助我

顺便说一句 - 我使用的是 Windows 7 - 64 位

4

2 回答 2

1

好的,所以我已经完成了大量的挖掘工作并让它工作。所以我想我会发布我发现的内容,以防它可能对其他人有所帮助。

我在四处搜索时发现的一件事是,有一些关于在用于驱动 PhantomJS 的 JS 提交的标头中包含以下内容的讨论:

page.customHeaders={'Authorization': 'Basic '+btoa('username:password')};

而不是使用

page.settings.userName = 'username';
page.settings.password = 'password';

这是行不通的。请参考之前的讨论

如果您在代理上使用基本级别的身份验证,这很好。如果您使用集成身份验证,它将不起作用,因为这仍然需要 NTLM/Kerberos 或其他任何东西。

解决此问题的方法是更改​​客户端上的设置。

您需要允许客户端在不通过代理路由的情况下访问外部世界。当然,在 TMG 中,这是通过更改适用于安装在客户端硬件上的客户端网络软件的设置来完成的。

通过允许 PhantomJS Executable 绕过代理,您将克服我和许多其他人遇到的问题,但您仍然会遇到一些问题,因为您刚刚破坏了系统安全性,因此请注意并希望有一个处理 NTLM/Kerberos 的新版本 PhantomJS。

或者,将您的代理更改为使用基本身份验证,这将允许使用 customHeaders 解决方案按上述方式工作,但这可能比允许客户端绕过代理对您的安全性风险更大。

于 2013-09-16T09:23:29.830 回答
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);
    }
});
于 2013-10-07T09:34:35.890 回答