1

Web ページ (単純な URL ベースのレポート) をスクレイピングし、HTML 応答を出力ファイルに送信するという単純な要件があります。ただし、URL は「フォームベース」認証 (javascript なし) の認証 (HTTPS ログイン) ページにリダイレクトされ、認証時に表示しようとしているレポートが$response(HTML として) に表示されるはずです。興味深いことに、私のコードは Windows マシンでは問題なく動作しますが、以下の同じコードは AIX マシンでは動作せず、click_button()関数呼び出しは何もしていないように見えます。click()、を試しsubmit()ましたが、何も機能していないため、実際のレポートを取得する代わりに、HTML 出力ファイルのログオン画面しか表示されません。何が間違っている可能性がありますか?

use WWW::Mechanize;
use strict;

my $username = "admin";
my $password = "welcome1";  
my $outpath  = "/home/data/output";
my $fromday = 7;
my $url  = "https://www.myreports.com/tax_report.php";
my $name = "tax_report";
my $outfile = "$outpath/$name.html";

my $mech = WWW::Mechanize->new(noproxy =>'0');  

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900; 
$mon++;     # since it will start from 0
$mday--;    # yesterdays date (to day)
$fromday = $mday - $days; #(from day)

#Create URL extension for generating report with previous date
my $dt_range = "?Y&dc_date1=$mon%2F$fromday%2F$year&dc_date2=$mon%2F$mday%2F$year"; 
my $url  = $url . $dt_range;

$mech->get($url);
$mech->field(login => "$username");
$mech->field(passwd => "$password");

$mech->add_handler("request_send",  sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });

$mech->click_button(value=>"Login now");

my $response = $mech->content();

print "Generating report: $name...\n";

open (OUT, ">>$outfile")|| die "Cannot create report file $outfile";
print OUT "$response";
close OUT;

両方のマシンの WWW::Mechanize のバージョンは同じ、つまり 1.54 ですが、Win マシンの perl バージョンは 5.10.1 で、AIX マシンの Perl バージョンは 5.8.8 です。

使用されるその他の代替手段 -

my $inputobject=$mech->current_form()->find_input( undef,'submit' );
print $inputobject->value . "\n";
$mech->click_button(input => $inputobject);
print $mech->status() . "\n";

$inputobject は、HTML ソースのように正しいボタン要素を示し、2 番目の出力は明らかに OK を表す 200 のステータスを返します。しかし、AIX マシンではまだ機能していません。

更新- 接続しようとしているサイトには、信頼されていない SSL 証明書があるようです。Windows PC、Mac、AIX の 3 つの異なるマシンでプログラムを試しました。Windows マシンではプログラムが動作し、ブラウザー (Chrome、Firefox、IE) から Web サイトにログインできました。ただし、Mac では、(ブラウザ経由で) ログインが機能せず、信頼されていない証明書エラー (または警告!) が表示されます。これはおそらく、プロキシ設定がセットアップされておらず、Perl プログラムも機能しないことを意味します。そして最後に、Perl が機能しない AIX も同様です。ここで、この信頼できない SSL 証明書の問題を回避する方法がわかりません。どんな助けでも大歓迎です。

更新 2:ログの詳細を表示するスクリプトのコード行の下に含まれており、IP がサーバーのファイアウォールによってフィルター処理されたため、リダイレクト (HTTP 302) されていることがわかりました。AIX IP がサーバーのファイアウォール例外に追加されると、スクリプトは完全に機能しました。以下の2行は命の恩人でした-

$mech->add_handler("request_send",  sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });
4

1 に答える 1

0

perl コードの前my $mech = WWW::Mechanize->new(noproxy =>'0');に次の行を使用して、もう一度試していただけますか?

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;
于 2012-07-11T06:23:22.530 に答える