26

我正在尝试在 PhantomJS 中打开一个需要 HTTP 身份验证的网页。我的脚本基于 loadspeed.js 示例:

var page = require('webpage').create(),
    t, address;
page.settings.userName = "user";
page.settings.password = "password";
if (phantom.args.length === 0) {
  console.log('Usage: loadspeed.js <some URL>');
  phantom.exit();
} else {
  t = Date.now();
  address = phantom.args[0];
  page.open(address, function (status) {
      if (status !== 'success') {
          console.log('FAIL to load the address');
      } else {
          t = Date.now() - t;
          console.log('Loading time ' + t + ' msec');
          page.render('page.jpg');
      }
      phantom.exit();
  });
}

我可以从渲染的 page.jpg 中看到我每次都得到 401。我还使用 Wireshark 跟踪了 HTTP 会话,这表明在 GET 请求中没有向给定 URL 发送任何身份验证标头。

我在这里做错了什么?我刚开始使用 PhantomJS,但我整个晚上都在搜索,但没有走远......

4

2 回答 2

34

PhantomJS(至少从 1.9.0 开始)有一个关于 auth 的错误:它发送没有 auth 标头的请求,然后只有在它返回 401 后才会再次执行请求,但这次使用标头。(那是针对 GET 的;使用 POST 它根本不起作用。)

解决方法很简单,所以不要:

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

您可以使用:

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

(我刚刚在一篇博文中介绍了这一点:http: //darrendev.blogspot.jp/2013/04/phantomjs-post-auth-and-timeouts.html,并从 Igor Semenko 那里了解到 PhantomJS 邮件列表中的解决方法。)

于 2013-04-11T03:43:22.477 回答
7

我认为您使用的脚本或 phantomjs 没有任何问题(至少在 v1.5 中)。

如果您尝试此脚本:

var page = require('webpage').create(),
    system = require('system'),
    t, address;

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

if (system.args.length === 1) {
    console.log('Usage: loadspeed.js <some URL>');
    phantom.exit();
} else {
    t = Date.now();
    address = system.args[1];
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('FAIL to load the address');
        } else {
            t = Date.now() - t;
            console.log('Page title is ' + page.evaluate(function () {
                return document.title;
            }));
            console.log('Loading time ' + t + ' msec');
        }
        phantom.exit();
    });
}

phantomjs loadspeed.js http://browserspy.dk/password-ok.php

鉴权成功。

于 2012-05-23T09:20:59.257 回答