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セッションをトレースしたところ、GETリクエストで指定のURLに認証ヘッダーが送信されていないことがわかりました。
ここで何が悪いのですか?私はPhantomJSを使い始めたばかりですが、私は一晩中探していましたが、遠くはありませんでした...
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 、そしてPhantomJSでその回避策を学びましたIgor Semenkoからのメーリングリスト。)
私が使用しているスクリプトまたは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
認証は成功しました。