WWW :: Mechanize Perl логин работает только после перезапуска - PullRequest
3 голосов
/ 27 марта 2010

Я пытаюсь автоматически войти на веб-сайте, используя Perl с WWW :: Mechanize .

Что я делаю:

$bot = WWW::Mechanize->new();
$bot->cookie_jar(
        HTTP::Cookies->new(
            file           => "cookies.txt",
            autosave       => 1,
            ignore_discard => 1,
        )
);

$response = $bot->get( 'http://blah.foo/login' );

$bot->form_number(1);

$bot->field( usern => 'user' );
$bot->field( pass => 'pass' );
$response =$bot->click();

print $response->content();

$response = $bot->get( 'http://blah.foo' );

print $response->content();

Логин работает, но когда я загружаю страницу, он говорит мне, что я не подключен.

Вы видите, что я храню куки в файле. Теперь, если я перезапущу скрипт без части входа в систему, он говорит, что я подключен ...

Кто-нибудь понимает это странное поведение?

Редактировать : На самом деле я заметил, что проблема возникает и с в некоторых веб-браузерах на определенной платформе . На странице написано "Не авторизован". Тем не менее, достаточно перезагрузить страницу для входа в систему.

В сценарии я попытался выполнить двойной переход, но он не работает лучше. Единственный способ - запустить его дважды.

Он работал с curl , когда я делал последний запрос дважды.

1 Ответ

2 голосов
/ 05 апреля 2010

Некоторые веб-сайты, которые я видел, неправильно устанавливают или обрабатывают свои сеансовые файлы cookie на каждой странице, поэтому они перестают работать, если вы открываете их страницы в «неожиданном» порядке. Например, на странице входа в систему, странице входа в систему или на странице с некоторым всплывающим содержимым может ожидаться, что файл cookie сеанса уже установлен обычной страницей сайта.

Это звучит как ваша проблема, потому что он работает во второй раз, когда cookie уже установлен, когда вы выбираете страницу.

Я обошел проблему такого рода, имитируя более типичную активность пользовательского сеанса браузера в моем скрипте, извлекая некоторые «нормальные» страницы перед переходом к фактической части входа в систему:

$www->get('http://www.example.com');         # Homepage
$www->get('http://www.example.com/account'); # Authenticated section front page
# Now everything is set up, proceed with account login...
...