Вход через WWW :: Mechanize - PullRequest
       4

Вход через WWW :: Mechanize

3 голосов
/ 08 июля 2020

Я собираюсь войти на https://imputationserver.sph.umich.edu/index.html#! Pages / login со следующим:

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';
use WWW::Mechanize;
use DDP;

my $mech = WWW::Mechanize->new();
$mech->get( 'https://imputationserver.sph.umich.edu/index.html#!pages/login' );
my $username = '';
my $password = '';
#$mech->set_visible( $username, $password );
#$mech -> field('Username:', $username);
#$mech -> field('Password:', $password);

my %data;
@{ $data{links} } = $mech -> find_all_links();
@{ $data{inputs}    } = $mech -> find_all_inputs();
@{ $data{submits} } = $mech ->find_all_submits();
@{ $data{forms} } = $mech -> forms();
p %data;

#$mech->set_fields('Username' => $username, 'Password' => $password);

, но, похоже, нет никакой полезной информации, которая отображается путем печати:

{
    forms     [],
    inputs    [],
    links     [
        [0] WWW::Mechanize::Link  {
            public methods (9) : attrs, base, name, new, tag, text, URI, url, url_abs
            private methods (0)
            internals: [
                [0] "favicon.ico",
                [1] undef,
                [2] undef,
                [3] "link",
                [4] URI::https,
                [5] {
                    href   "favicon.ico",
                    rel    "icon"
                }
            ]
        },
        [1] WWW::Mechanize::Link  {
            public methods (9) : attrs, base, name, new, tag, text, URI, url, url_abs
            private methods (0)
            internals: [
                [0] "assets/css/loader.css",
                [1] undef,
                [2] undef,
                [3] "link",
                [4] var{links}[0][4],
                [5] {
                    href   "assets/css/loader.css",
                    rel    "stylesheet"
                }
            ]
        }
    ],
    submits   []
}

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

Я пробовал

$mech -> submit_form(
    form_number => 0,
    fields      => { username => $username, password => $password },
);

, но потом получаю No form defined

Что касается ссылок, входных данных, полей, я их не вижу и Я не знаю, как двигаться дальше.

Я не вижу ничего на https://metacpan.org/pod/WWW :: Mechanize :: Examples , что помогло бы мне в этой ситуации.

Как мне войти на эту страницу, используя WWW :: Mechanize Perl?

Ответы [ 4 ]

6 голосов
/ 09 июля 2020

Как говорит Дэйв, многие современные веб-сайты будут обрабатывать вход в систему через управляемый Javascript (частный) API. Вам нужно будет открыть вкладку «Сеть» в своем браузере, выполнить вход вручную, как обычно, и посмотреть последовательность GET, PUT, POST и т. Д. c. чтобы увидеть, какое взаимодействие необходимо для завершения входа в систему, а затем выполнить эту последовательность самостоятельно с помощью Mech или LWP.

Возможно, что Javascript на странице будет создавать JSON или даже JWT для взаимодействия; вам придется продублировать это в своем коде, чтобы он заработал.

В частности, проверьте заголовки на наличие файлов cookie, а также аутентификации и установленных токенов CSRF; вам нужно будет захватить их и повторно отправить с запросами (для запросов POST потребуются токены CSRF). Это может потребовать большего количества взаимодействий с сайтом, чтобы зафиксировать последовательность операций и дублировать их. HTTP::Cookies должен обрабатывать файлы cookie автоматически, но более сложное использование заголовков потребует от вас использования HTTP::Headers для извлечения данных и, возможно, повторной отправки их таким образом.

По сути, все процессы довольно просты ; это просто вопрос их точного копирования, чтобы вы могли их автоматизировать.

Вы должны проверить, есть ли на сайте уже программный API, и использовать его, если так; такой API почти всегда предоставит вам более простые, прямые интерфейсы для функций сайта и более простые в использовании форматы возвращаемых данных. Если сайт очень динамичный c, как сайт с тяжелым React, возможно, что другие страницы сайта загрузят скелетную HTML страницу, а затем используют Javascript, чтобы заполнить ее; по мере развития страницы ваш код также должен будет измениться. Если вы используете API определенного программиста, вы, вероятно, сможете зависеть от взаимодействий и возвращаемых данных, которые останутся такими же, пока версия API не изменится.

Последнее примечание: вам следует проверить что вы не нарушаете свое пользовательское соглашение, используя автоматизацию. Некоторые сайты явно запрещают использование автоматических методов входа в систему.

5 голосов
/ 08 июля 2020

Интересная часть источника с этой страницы:

<body class="bg-light">

  <div id="main">
    <div class="spinner">
        <div class="bounce1"></div>
      <div class="bounce2"></div>
      <div class="bounce3"></div>
    </div>
  </div>

  <script src="./dist/bundles/cloudgene/index.js"></script>


</body>

Итак, в HTML, составляющем эту страницу, нет формы входа в систему. Это объясняет, почему WWW :: Mechanize ничего не видит - там нечего видеть.

Кажется, что вся страница построена этим Javascript файлом - index.js.

Теперь вы можете часами читать эту JS и работать над тем, как работает страница. Но это будет тяжелая работа, и есть более простой способ.

Независимо от того, как работает клиент (браузер или ваш код), фактический вход в систему должен осуществляться с помощью HTTP-запроса и ответа. Клиент отправляет запрос, сервер отвечает, а клиент действует в соответствии с этим ответом. Вам просто нужно решить, как выглядят запрос и ответ, а затем воспроизвести это в своем коде.

И вы можете исследовать HTTP-запросы и ответы, используя инструменты, которые почти наверняка встроены в ваш браузер (в Chrome, это точечное меню -> дополнительные инструменты -> инструменты разработчика). Это позволит вам точно увидеть, как выглядит HTTP-запрос.

Сделав это, вам «просто» нужно создать аналогичный ответ, используя ваш Perl код. Вероятно, вам будет проще использовать LWP :: UserAgent и связанные с ним модули, а не WWW :: Mechanize.

3 голосов
/ 08 июля 2020

WWW :: Mechanize - это веб-клиент с некоторыми возможностями парсинга HTML. Но, как указал Дэйв Кросс, желаемой формы нет в запрошенном вами документе HTML. Генерируется каким-то кодом JavaScript. Для того, чтобы делать то, что делает браузер, потребуется движок JavaScript, которого нет в WWW :: Mechanize.

Самый простой способ добиться этого - удаленно управлять веб-браузером (например, используя Selenium :: Chrome).

Другой - вручную создать запрос на вход без получения и заполнения формы.

1 голос
/ 10 июля 2020

Глядя на ваш код, я вижу следующий URL:

https://imputationserver.sph.umich.edu/index.html#!pages/login

Именно эта часть особенно привлекла мое внимание: #!pages/login

Это вероятно, означает, что форма входа в систему отсутствует на странице, когда она загружена, а вместо этого добавляется на страницу с JavaScript после загрузки страницы.

Однако ваш скрипт не знает этого и выглядит для формы входа и ее элементов сразу после загрузки страницы.

Самый простой способ решить эту проблему - установить жестко запрограммированный тайм-аут, скажем, 5 секунд между загрузкой страницы и попыткой входа в систему.

Более «правильный» способ справиться с этим - дождаться появления формы входа, проверив ее элементы управления, а затем продолжить процесс входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...