Perl を使って http
にアクセス!するメモ(2002/11/14)
Perl で http アクセスを行う場合、いくつかの方法がありますが現実プログラムするとしたら、2つの方法があります。1つ目は、socket クラスを使う方法、2つ目は LWP(libwww-perl)を使う方法です。
socket クラスを使った場合、底辺のカラクリを熟知している必要があり、かつ1から作成しないといけません(細かい事もできるけど)。LWPライブラリを使用すると、http のプロトコルの流れを知っていなくとも簡単にかつ早くプログミングすることができます。実際、相手のURLの内容を取得するプログラムを書いたとすると数行で終わってしまいます。
参考 : LWPモジュール
参考 : LWP(libwww-perl)
参考 : LWP で SSL
1.CPAN からソースをもってきて、インストールします。
1.
% wget http://ftp.teledanmark.no/pub/perl/cpan/LWP/libwww-perl-5.65.tar.gz
% gzip -cd libwww-perl-5.65.tar.gz | tar xf -
% cd libwww-perl-5.65
% perl Makefile.PL
% make
% su
# make install
2.
% http://ftp.teledanmark.no/pub/perl/cpan/LWP/URI-1.19.tar.gz
% gzip -cd URI-1.19.tar.gz | tar xf -
% cd URI-1.19
% perl Makefile.PL
% make
% su
# make install
3.
% http://ftp.teledanmark.no/pub/perl/cpan/LWP/HTML-Parser-3.26.tar.gz
% gzip -cd HTML-Parser-3.26.tar.gz | tar xf -
% cd HTML-Parser-3.26
% perl Makefile.PL
% make
% su
# make install
こんな感じです。(lwpから)
use LWP::UserAgent;
$ua = new LWP::UserAgent;
$ua->agent("AgentName/0.1 " . $ua->agent);
# リクエストを作成します
my $req = new HTTP::Request POST => 'http://localhost/cgi-bin/hoge.cgi';
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');
# ユーザ・エージェントにリクエストを渡し、返されたレスポンスを取得します
my $res = $ua->request($req);
# レスポンスの結果をチェックします
if ($res->is_success) {
print $res->content;
} else {
print "Bad luck this time\n";
}
Net::SSLeayモジュールがインストールされていれば、自動的にSSL使用サイトへのアクセスを適切に処理してくれるらしいです。
ですので、アクセス先が「https://」で始まっていても、プログラムを変える必要はまったくないそうな。
下記プログラムをみてください。http://localhost/index.html には、アクセスできているのに(localhost側のアクセスログを見て) "Bad luck the time"のエラーが出る場合は、CPANのモジュールが正しくインストールされていない可能性があります。
この場合、LWP リクエスト/レスポンスのデバックログを出す事によって、エラー個所が分かる場合があります。※赤いところ
use LWP::UserAgent;
$ua = new LWP::UserAgent;
$ua->agent("AgentName/0.1 " . $ua->agent);
# リクエストを作成します
my $req = new HTTP::Request GET => 'http://localhost/index.html';
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');
# リクエストデバック
print $req->as_string();
# ユーザ・エージェントにリクエストを渡し、返されたレスポンスを取得します
my $res = $ua->request($req);
# レスポンスデバック
print $res->as_string();
# レスポンスの結果をチェックします
if ($res->is_success) {
print $res->content;
} else {
print "Bad luck this time\n";
}