2012-04-11 41 views
25

我試圖打開一個網頁需要的HTTP認證,在PhantomJS。 我的腳本是基於關閉loadspeed.js例如:PhantomJS不發送認證頭

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(); 
    }); 
} 

我可以從我得到每次401渲染page.jpg看到。 我也使用Wireshark來跟蹤HTTP會話,它揭示了GET請求中沒有向給定的URL發送認證頭。

我在這裏做錯了什麼?我剛剛開始使用PhantomJS,但我一直在搜索整個晚上,並沒有得到很遠......

+0

什麼瀏覽器? Chrome 19並不允許你設置XHR的用戶名和密碼。這是因爲他們不允許使用用戶名:密碼@比例的網址。針對不同網站的HTTP認證是一件棘手的事情。我想我會在下週末寫一篇關於這個話題的博客。 – panzi 2012-05-29 00:18:37

+0

不要與這個問題直接做的,但我想指出的是,作爲PhantomJS 1.9.2和0.8.4 SlimerJS的,(是否帶'page.settings'或'page.customHeaders'完成)的認證信息被髮送到該頁面上引用的所有第三方服務器。 (例如,如果您登錄的頁面爲其jQuery使用CDN,那麼該CDN服務器將獲取您的用戶名和密碼;對於廣告服務器也是如此)。至少,SlimerJS正在研究解決方案。 – 2013-10-31 00:57:48

回答

31

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從伊戈爾Semenko郵件列表是解決方法)

+0

PhantomsJS 1.9.1在我的機器上不需要解決方法。 – 2013-08-25 22:15:01

+0

我的機器上的PhantomJS 1.9.2行爲不正常。 'page.settings.userName'和'password'有時有效,有時不會。這可能與缺少401階段無關,因爲我一直在使用同一臺遠程服務器工作。用customHeader - 似乎總是工作。 – quetzalcoatl 2014-04-01 12:08:48

+0

這個問題太古老了,我不知道我使用的是哪個phantomJS版本,但推測它在這個bug上有一些變化。 – 2014-08-21 08:15:43

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

中的驗證是成功的。