1

HTTPS経由でアクセスできるサイトをスクレイピングしています。ログインしてプロセスを開始できますが、新しいページ(URL)にアクセスするたびにCookieセッションIDが変更されます. ログインした Cookie セッション ID を保持するにはどうすればよいですか?

#!/usr/bin/perl -w
use strict;
use warnings;
use WWW::Mechanize;
use HTTP::Cookies;
use LWP::Debug qw(+);
use HTTP::Request;
use LWP::UserAgent;
use HTTP::Request::Common;

my $un = 'username';
my $pw = 'password';

my $url = 'https://subdomain.url.com/index.do';

my $agent = WWW::Mechanize->new(cookie_jar => {}, autocheck => 0);
$agent->{onerror}=\&WWW::Mechanize::_warn;
$agent->agent('Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100407 Ubuntu/9.10 (karmic) Firefox/3.6.3');
$agent->get($url);

$agent->form_name('form');
$agent->field(username => $un);
$agent->field(password => $pw);
$agent->click("Log In");

print "After Login Cookie: ";
print $agent->cookie_jar->as_string();
print "\n\n";

my $searchURL='https://subdomain.url.com/search.do';
$agent->get($searchURL);    

print "After Search Cookie: ";
print $agent->cookie_jar->as_string();
print "\n";

出力:

After Login Cookie: Set-Cookie3: JSESSIONID=367C6D; path="/thepath"; domain=subdomina.url.com; path_spec; secure; discard; version=0

After Search Cookie: Set-Cookie3: JSESSIONID=855402; path="/thepath"; domain=subdomain.com.com; path_spec; secure; discard; version=0

また、サイトにはCERTが必要だと思います(ブラウザではそうです)が、これを追加する正しい方法でしょうか?

$ENV{HTTPS_CERT_FILE} = 'SUBDOMAIN.URL.COM'; ## Insert this after the use HTTP::Request...

CERT についても、このリストの最初のオプションを使用する場合、これは正しいですか?

X.509 Certificate (PEM)
X.509 Certificate with chain (PEM)
X.509 Certificate (DER)
X.509 Certificate (PKCS#7)
X.509 Certificate with chain (PKCS#7)
4

3 に答える 3

1

ユーザーエージェントが実行すべきだと思うことを実行していないときは、その要求をインタラクティブブラウザの要求と比較します。Firefoxプラグインはこの種のものに便利です。

サーバーが期待するプロセスの一部が欠落している可能性があります。ログインしていないか、正しく対話していない可能性があります。これには、さまざまな理由が考えられます。たとえば、WWW::Mechanizeが処理していないJavaScriptがページにある可能性があります。

インタラクティブブラウザが行っていることとそうでないことを正確に特定できれば、スクリプトをどこで改善する必要があるかがわかります。

スクリプトでは、Mechが構築されているLWPでデバッグをオンにすることで、何が起こっているかを監視することもできます。

 use LWP::Debug qw(+); 

rjhはすでにあなたの質問の証明書の部分に答えています。

于 2010-04-27T19:10:11.020 に答える
0

セッション Cookie がページが読み込まれるたびに変更される場合は、正しくログインしていない可能性があります。ただし、リクエストごとに JSESSIONID を強制的に同じにすることもできます。独自のクッキー jar を作成し、WWW::Mechanize にそれを使用するように指示します。

my $cookie_jar = HTTP::Cookies->new(file => 'cookies', autosave => 1, ignore_discard => 1);
my $agent = WWW::Mechanize->new(cookie_jar => $cookie_jar, autocheck => 0);

これignore_discard => 1は、セッション Cookie もディスクに保存されることを意味します (通常は、セキュリティ上の理由から破棄されます)。

次に、ログインした後、次のように呼び出します。

$cookie_jar->save;

次に、各リクエストの後:

$cookie_jar->revert;  # re-loads the save

別の方法として、HTTP::Cookies をサブクラス化し、set_cookieメソッドをオーバーライドして、セッション Cookie が既に存在する場合はその再設定を拒否することもできます。


また、サイトにはCERTが必要だと思います(ブラウザではそうです)が、これを追加する正しい方法でしょうか?

一部のブラウザー (Internet Explorer など) では、セキュリティ証明書が必要ない場合でも、入力を求めるプロンプトが表示されます。エラーが発生しておらず、レスポンスの内容が良さそうな場合は、おそらく設定する必要はありません。

証明書ファイルがある場合、POD でCrypt::SSLeayを確認してください。証明書は PEM0 でエンコードされているため$ENV{HTTPS_CERT_FILE}、証明書のパスに設定する必要があります。$ENV{HTTPS_DEBUG} = 1何が起こっているかを確認するように設定することをお勧めします。

于 2010-04-27T18:10:01.200 に答える
-1

次のような Cookie jar をセットアップします。

my $cookie = HTTP::Cookies->new(file => 'cookie',autosave => 1,);
my $mech = WWW::Mechanize->new(cookie_jar => $cookie, ....);
于 2010-04-27T15:24:36.420 に答える