というわけで作ってみる。さっきのモロパクリですが、HTTPコマンド(?)の後にWSSE認証のヘッダーを追加すれば結果が返ってくる、と。なんかHTTPが独自拡張されていくような気がしますね・・・。GETとPUTだけの単純なプロトコルだったはずなのに。
スクリプトのポイントとして、Nonce情報は渡すときにBase64でエンコードしないとエラーになるので注意。あとくだらないところだけどDateTimeはiso8601フォーマットのためだけに使うにはちょっと重い*1ので、やめました。じゃーLWPもやめてソケット叩けという気もしますが・・・。まあそこはそれ。
use strict; use warnings; use Digest::SHA1; use MIME::Base64; use HTTP::Request; use LWP::UserAgent; my $username = shift || ''; my $password = shift || ''; my $nonce = 'nonce'; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); my $now = sprintf("%4d-%02d-%02dT%02d:%02d:%02dZ", $year+1900, $mon+1, $mday, $hour, $min, $sec); my $digest = Digest::SHA1::sha1_base64($nonce . $now . $password); my $credentials = sprintf(qq(UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"), $username, $digest, MIME::Base64::encode_base64($nonce, ''), $now); my $req = HTTP::Request->new(GET => 'http://b.hatena.ne.jp/dump'); $req->header( Accept => 'application/x.atom+xml, application/xml, text/xml, */*'); $req->header( 'X-WSSE' => $credentials ); print LWP::UserAgent->new->request($req)->as_string;