26

PhantomJS で HTTP 認証が必要な Web ページを開こうとしています。私のスクリプトは、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 セッションをトレースしたところ、特定の URL への GET 要求で認証ヘッダーが送信されていないことがわかりました。

ここで何が間違っていますか?私は PhantomJS を使い始めたばかりですが、一晩中検索していて、遠くまでは行きませんでした...

4

2 に答える 2

34

PhantomJS (少なくとも 1.9.0 の時点) には認証に関するバグがあります。認証ヘッダーなしでリクエストを送信し、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で説明し、PhantomJS メーリング リストで Igor Semenko から回避策を学びました。)

于 2013-04-11T03:43:22.477 に答える