3

私はまだPerlを学んでいるので、専門用語の知識がなく、一般的な初心者であることをお詫びします。

コース ワークス アカウントにログインしてすべてのファイルをダウンロードするスクリプトを作成しようとしています。再ログインするまで約1時間しか滞在できないので、サブルーチンでログイン作業を行い、時間に応じてそれを呼び出してログインし直して続行できるようにしたいクロール。私の問題は、サブルーチンとメインコードの間でブラウザーをやり取りできるようにしたいことです (? 用語については、以下の例を参照してください)。

これは私がこれまでに持っているものであり、機能しません:

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);。したがって、メイン コードでのブラウザの初期化が機能しなかったと推測しています (サブルーチンに渡されなかったため) Y/N??

わかりましたので、次のようにサブルーチン自体でそれを実行しようとしました:

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;
}

今度は、次のエラー メッセージが表示されます。「Missing base argument at 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 もグローバル変数にしようとしましたが、両方のコードで同じエラーが発生します。明らかに、ここで何かが欠けています。

それを乗り越えてくれたすべての人に前もって感謝します。私の経験不足にぶつかる、おそらく本当に単純な答えのために、それは少し長ったらしいことを知っています。

4

1 に答える 1

4

ログインへの最初の呼び出しでは、ブラウザ、ユーザー名などは提供されません。

スクリプト全体で Mechanize のインスタンスが 1 つだけ必要な場合 (および同じユーザーでログインする場合) は、グローバル変数を利用できます。

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 インスタンスが必要な場合は、ログインでインスタンス化して返します。

于 2011-05-21T08:55:34.867 に答える