Передача механизированного браузера в подпрограмму (Perl с WWW :: Mechanized) - PullRequest
3 голосов
/ 21 мая 2011

Я все еще изучаю Perl, поэтому извиняюсь за отсутствие технических знаний и общего новичка.

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

Это то, что у меня пока и не работает:

use strict;
use WWW::Mechanize;

login();
my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $browser = WWW::Mechanize->new();

my $response = login ($username,$password,$url,$browser);
print $response->content;

sub login {
    my ($user,$pass,$url,$browser) = @_;
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
    return $browser;
}

Это говорит о том, что я не могу "вызвать метод 'get' для неопределенного значения" на $browser -> get($url);. Поэтому я предполагаю, что инициализация браузера в основном коде не сработала (так как он не был передан подпрограмме) Да / Нет ??

Хорошо, круто, тогда я попытался сделать это в самой подпрограмме следующим образом:

use strict;
use WWW::Mechanize;

login();
my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $response = login ($username,$password,$url,$browser);
print $response->content;

sub login {
    my ($user,$pass,$url) = @_;
    my $browser = WWW::Mechanize->new();
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
    return $browser;
}

На этот раз я получаю следующее сообщение об ошибке: «Отсутствует базовый аргумент в C: /Perl64/lib/HTTP/Response.pm line 93»

Итак, я удалил строки в подпрограмме, пока она не заработала, и обнаружил, что она компилируется, когда выглядит следующим образом:

use strict;
use WWW::Mechanize;

login();
my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $response = login ($username,$password,$url,$browser);
print $response->content;

sub login {
    my ($user,$pass,$url) = @_;
    my $browser = WWW::Mechanize->new();
#   $browser -> get($url);
#   $browser -> form_name('theform');
#   $browser -> field ('username' => $user);
#   $browser -> field ('password' => $pass);
#   $browser -> click ('log in');
    return $browser;
}

но он, очевидно, просто возвращает мусор.

Я думаю, что проблема, как я уже сказал, заключается в попытке передать объект браузера в подпрограмму, поскольку я не думаю, что это просто скаляр (потому что я могу получить из него такие вещи, как "контент"), но я ' м на самом деле действительно не уверен. Я также смущен, потому что, когда я инициализирую это в подпрограмме, я все еще получаю проблему !! ????? Я также пытался сделать $ browser глобальной переменной, но я получаю одинаковые ошибки в обоих кодах. Очевидно, я что-то здесь упускаю.

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

1 Ответ

4 голосов
/ 21 мая 2011

Ваш первый вызов для входа в систему не обеспечивает браузер, имя пользователя и т. Д.

Если вам нужен только один экземпляр Mechanize (и будет входить в систему с тем же пользователем) по всему сценарию, вы можете положиться на глобальные переменные.

use strict;
use WWW::Mechanize;

my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $browser = WWW::Mechanize->new();

login();
print $browser->$response->content;

sub login {
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
}

Или, что лучше, каждый раз передавайте данные для входа в систему:

use strict;
use WWW::Mechanize;

my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $browser = WWW::Mechanize->new();

login ($username,$password,$url);
print $browser->$response->content;

sub login {
    my ($user,$pass,$url) = @_;
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
}

Если вы хотите каждый раз создавать новый экземпляр Mechanize, введите его в логин и верните его.

...