ぶっくまーくかんり(4)ブックマーク全データ取得スクリプト

というわけで作ってみる。さっきのモロパクリですが、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;

*1:動作が・・・ではなく、依存モジュール多すぎ。CPANモジュールがあるからたいした手間ではないけど