2012-04-11 2 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(); 
    }); 
} 

Я могу видеть из оказанной page.jpg, что я получаю 401 каждый раз. Я также прослеживал сеанс HTTP с помощью Wireshark, который показывает, что в запросе GET ни один URL-адрес проверки подлинности не отправляется на указанный URL.

Что я здесь делаю неправильно? Я только начинаю работу с PhantomJS, но я все время искал и не получил далеко ...

+0

Какой браузер? Chrome 19 просто не позволяет вам назначить XHR имя пользователя и пароль. Это было вызвано, когда они запретили имя пользователя: пароль @ доля URL-адресов. HTTP Auth против другого веб-сайта - сложный бизнес. Думаю, я напишу блог об этой теме в ближайшие выходные или около того. – panzi

+0

Не делать этого напрямую, но хочу отметить, что с PhantomJS 1.9.2 и SlimerJS 0.8.4 ваша информация аутентификации (независимо от того, выполняются ли они с 'page.settings' или' page.customHeaders'), отправляется на все сторонние серверы, указанные на этой странице. (Например, если страница, в которую вы входите, использует CDN для своего jQuery, тогда сервер CDN получает ваше имя пользователя и пароль, аналогично для серверов объявлений.) SlimerJS, по крайней мере, работает над решением. –

ответ

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

(I просто просмотрел это в сообщении в блоге: http://darrendev.blogspot.jp/2013/04/phantomjs-post-auth-and-timeouts.html, и узнал об этом обходном пути в списке рассылки PhantomJS от Игоря Семенко.)

+0

PhantomsJS 1.9.1 не нуждался в обходном пути на моей машине. –

+0

PhantomJS 1.9.2 на моей машине ведет себя беспорядочно. 'page.settings.userName' и' password' иногда работают, иногда нет. Вероятно, это не связано с отсутствующим этапом 401, потому что я все время работаю с одним и тем же удаленным сервером. С customHeader - кажется, работает всегда. – quetzalcoatl

+0

Этот вопрос настолько стар, что я понятия не имею, какую версию phantomJS я использовал, но предположительно это имело некоторые вариации в этой ошибке. –

7

Я не думаю, что с скриптом вы используете или phantomjs (по крайней мере, в версии 1.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

Срок авторизации успешна.

Смежные вопросы