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