PerlでLWP::UserAgentを使い、HTTPSサイトへ接続を行いコンテンツを取得してくるプログラムを書く必要が出てきて、色々調べて書いたのですが情報が錯綜していたりで結構ハマったのでソースコードを載せておきます。
今回わけあったりでコンストラクタ側でProxyの情報を保持していなかったりしますが、そこはお好きに改変してお使いください。
#########################################################
#
# LWP::UserAgentを使ったHTTPS接続
#
#########################################################
use utf8;
use strict;
use warnings;
{
package ProxyWebGet;
use LWP::UserAgent;
# コンストラクタ
sub new {
my ($class, @args) = @_;
my %args = ref $args[0] eq 'HASH' ? %{$args[0]} : @args;
my $self = {%args};
# オプション項目
$self->{ac_timeout} ||= 10; # プロキシ接続時のタイムアウト(秒)
return bless $self , $class;
}
# ホストとポート番号に対してProxy接続を行う
# 引数にホストとポート番号と接続先URLを指定する
sub proxy_connect {
my $self = shift;
my $proxy_host = shift; # ホストを受け取る
my $proxy_port = shift; # ポート番号を受け取る
my $target_url = shift; # 接続先URL
# ホストとポート番号をLWP::UserAgentで利用できる形式に整形する
my $http_proxy = 'http://' . $proxy_host . ':' . $proxy_port;
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
$ENV{HTTPS_PROXY} = $http_proxy;
$ENV{HTTPS_VERSION} = 3;
# LWP::UserAgentのインスタンスの生成
my $ua = LWP::UserAgent->new(
timeout => $self->{ac_timeout} # オプションにタイムアウト時間を指定
);
# ヘッダーにUTF-8を含む場合エラーが出るため解析しない
$ua->parse_head(0);
# 整形したProxyを指定
$ua->proxy(['http'], $http_proxy);
# 指定されたURLへ接続する
# FTP等のプロトコルに接続を行った場合
# コネクションが維持されるため強制的に破棄する
my $res = "";
eval{
local $SIG{ALRM} = sub{die "timeout"};
alarm($self->{ac_timeout}); # タイマー設定
$res = $ua->get($target_url); # URLへ接続しコンテンツを取得
alarm(0); # タイマー解除
};
# ステータスコードが正常である場合、コンテンツを返す
my $result = $res->is_success() ? $res->content() : "";
return $result;
}
}
{
# sub main
my $pwg = ProxyWebGet->new();
print $pwg->proxy_connect(
'000.000.000.000',
'0000',
'https://ja.wikipedia.org/wiki/'
);
}
0 Comments.