Подтвердить что ты не робот

PhantomJS не отправляет заголовок аутентификации

Я пытаюсь открыть веб-страницу, которая требует HTTP-аутентификации, в PhantomJS. Мой script основан на примере loadpeed.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();
  });
}

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

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

4b9b3361

Ответ 1

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 от Игоря Семенко.)

Ответ 2

Я не думаю, что с script вашим использованием или phantomjs (по крайней мере, в версии 1.5) есть что-то не так.

Если вы попробуете этот script:

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 loadpeed.js http://browserspy.dk/password-ok.php

Успех завершен.