Войти на сайт с перенаправлением используя WWW :: Mechanize - PullRequest
2 голосов
/ 28 декабря 2011

Я знаю, что это звучит как вопрос, который уже задавался на форуме, однако я считаю, что у меня здесь немного другой сценарий ..

Я пытаюсь использовать Perl для входа на веб-сайт, который требуетаутентификация.Я уже понял, что наиболее удобный инструмент для решения этой задачи - использовать модуль WWW :: Mechanize, где довольно легко заполнять формы и отправлять их.

В моем случае я сталкиваюсь со следующими трудностями:

  1. кажется, что нет "формы", связанной с полями, которые я хочу заполнить.Вместо этого поля заключены в таблицу <table></table>.
  2. Кажется, что сама кнопка запускает некоторый JavaScript, который, как я знаю, не поддерживается модулем Mechanize.Тем не менее, просто чтобы проверить поведение этой страницы, я отключил JavaScript в своем браузере Chrome и все же смог нажать кнопку и войти на сайт.Поэтому я предполагаю, что javascript здесь не обязателен.
  3. Я использую следующий код, и кажется, что не важно, какие данные (пользователь / пароль) я ввожу, по какой-то причине я всегда следуюсценарий «Успешно» и получите «Вход успешно!»:

    my $mech = WWW::Mechanize->new(
     cookie_jar      => {},
     autocheck       => 1,
     onerror         => \&Carp::croak,);
    
    # Login Form
    my $response = $mech->get($url);
    if (!$response->is_success) {
        die "Login page unreachable $url: ",  $response->status_line, "\n";
    }
    
    $mech->field('Email', $Email);
    $mech->field('Password', $Password);
    $response = $mech->click();
    if ($response->is_success) {
        print "Login Successful!\n";
    } else {
        die "Login failed: ",  $response->status_line, "\n";
    }
    

В результате выполнение сценария кажется успешным, однако, когда я предполагаю, что я уже вошел в системуи попытаться получить какие-либо данные с сайта, я вижу (в сниффере), что меня постоянно перенаправляют на страницу «Регистрация».

Любая помощь будет очень признательна!

Спасибозаранее!

Ответы [ 4 ]

2 голосов
/ 02 января 2012

Кажется, я понял, как решить эту проблему. Я использовал анализатор Wireshark, чтобы проанализировать разницу между заголовками HTTP, отправляемыми при использовании браузера, и заголовками, созданными объектом механизации. Я обнаружил, что механизированный сгенерированный заголовок «Connection» включает значение «TE, close», в то время как браузер выдает заголовок «Connection» со значением «keep-alive». Кроме того, запрос, сгенерированный браузером, включал дополнительный заголовок «Keep-Alive: 115». Я вручную добавил эти заголовки к своему механическому объекту следующим образом:

  $mech->add_header(
  "Connection" => "keep-alive",
  "Keep-Alive" => "115");

Это решило проблему, и я смог успешно войти в систему!

Спасибо всем за ваш вклад и помощь! Это очень ценится!

1 голос
/ 29 декабря 2011

Когда вы проверяете $response->is_success, вы просто проверяете, что целевой сайт отвечает без каких-либо ошибок HTTP.Но вместо этого вам нужно проверить, содержит ли страница ответа какой-либо текст .Например, «ОШИБКА АУТ!»и т. д.

Если целевой сайт работает с отключенным JavaScript, это не проблема.

Попробуйте добавить x и y (координаты указателя мыши) к данным, представленным в форме (некоторые сайты проверяют эту информацию).

Вы можете использовать инструмент мониторинга трафика HTTP, чтобы проверить, какие данные ваш браузер отправляет на целевой сайт (для этого я использую расширение HTTPFox Firefox) и сделать такой же запрос через WWW ::Механизация.

Кроме того, WWW :: Mechanize не нуждается в cookie_jar.Он обрабатывает куки по умолчанию.

Попробуйте этот код:

$mech->get($url);
$mech->submit_form(
    form_name => 'aspnetForm',
    fields => {
        'ctl00$cph1$lg1$txtEmail' => $login,
        'ctl00$cph1$lg1$txtPassword' => $password,
    },
    button => 'ctl00$cph1$lg1$btnLogin',
);
1 голос
/ 29 декабря 2011

Предлагаю взглянуть на WWW :: Scripter.Это написано поверх WWW :: Mechanize с поддержкой javascript и ajax.

WWW :: Scripter https://metacpan.org/pod/WWW::Scripter

Используя этот модуль, вы можете напрямую вызывать функцию javascript и делать гораздо больше.

1 голос
/ 28 декабря 2011

Если это не тег формы, то где-то есть кнопка отправки, которая использует запрос GET для отправки всех переменных на один и тот же (наиболее вероятный) URL.

Почему вы пытаетесь эмулировать использование браузера для нажатия кнопки аутентификации, есть ли какое-то другое скрытое поле или что-то, к чему вам нужен доступ?

На мой взгляд, лучший способ - это найти страницу, которая фактически аутентифицирует пользователя и пароль, и использовать запрос SSL POST к этой странице.

Если на странице есть что-то вроде:

<input type="text" name="user" />
<input type="password" name="pass" />

Отправка HTTP-запроса POST на любую страницу входа (скорее всего, на ту же страницу, если не определено ). Переменными POST будут user = $ value и pass = $ other_value.

...