koba::blog

小林聡: プログラマです

LWP::UserAgentの使い方

今さらながらLWP::UserAgentのメモ。

コンストラク

$ua = new LWP::UserAgent;

$ua->agent($product_id)

リクエストのUser-Agentヘッダの値を $product_id に変更する。$product_id が空白文字で終わっている場合は、その値にデフォルト値が追加される。デフォルト値は libwww-perl/5.805 (5.805 はバージョン番号)。

$ua->agent;                 # libwww-perl/5.805 を返す。
$ua->agent("Mozilla/5.0 "); # Mozilla/5.0 libwww-perl/5.805 に変更。
$ua->agent("Mozilla/5.0");  # Mozilla/5.0 に変更。

$ua->protocols_allowed(\@protocols)

使用できるプロトコルを制限する。デフォルトでは ftp や file も許可されている。

$ua->protocols_allowed(['http','https']);  # httpとhttpsのみ許可。

$ua->parse_head($boolean)

取得したHTMLのheadセクションを解析するか否かを変更する。デフォルトはTRUE。
解析したheadセクション中の要素は、レスポンスヘッダに追加されるので、titleやlinkを取得するときには便利。ヘッダを加工されたくない場合はFALSEを設定すればよい。

$ua->parse_head(0);  # headセクションを解析しない。

$ua->requests_redirectable(\@requests)

LWP::UserAgentはレスポンスのステータスコードが3XXの場合、リダイレクトを繰り返してコンテンツを取得しようと試みるが、その際にリダイレクトを許可するメソッドを設定する、デフォルトは GET と HEAD。

$ua->requests_redirectable([]);  # リダイレクトを許可しない。

$ua->credentials($netloc, $realm, $uname, $pass)

認証のためのユーザ名($uname)、パスワード($pass)を設定する。ユーザ名、パスワードは、$netlocで指定したホストから$realmで指定したレルムが返された場合のみ送信する*1

$ua->credentials("www.example.com:80", "Some Realm", "foo", "secret");

デフォルトで提供されている認証方式は、BasicとDigest。LWP::Authen::Wsseをインストールすれば、WSSEによる認証も使えるようになる*2

$ua->request($request)

$requestで指定したリクエストを送信する。$requestはHTTP::Requestインスタンス、返り値はHTTP::Responseインスタンス

my $request  = new HTTP::Request($method, $url, $header, $content);
my $response = $ua->request($request);

リダイレクトや認証は適切に扱われるので、複数のリクエストが実行される場合がある。その場合の最終リクエストは、$response->requestで取得できる。
$ua->get($url)、$ua->post($url, \%form) などのコンビニエンス関数の呼び出しは、最終的にこのメソッドで処理される。
デフォルトではSSLに対応していないが、Crypt::SSLeayをインストールすれば使えるようになる*3

*1:まずステータスコード401のレスポンスヘッダWWW-Authenticateで認証方式とレルムが返されるので、それに応じて再度リクエストを送信するということ

*2:LWP::Authen 配下にモジュールを追加することで、認証方式を追加できるような作りになっている

*3:最新のLWP::UserAgentではLWP::Protocol::httpsを使うようになっているもよう