Amazon.co.jp のウィッシュリストを使うと自分が欲しいと思う書籍や音楽をリストアップすることができます。作成したウィッシュリストは Amazon.co.jp 内で他のユーザも閲覧することができますが、せっかくなのでそれを blog で公開してみましょう。
...といってもそんなに目新しいことをするわけではなく、Amazon Web サービスを使ってウィッシュリストのデータを取得し、JavaScript に書き出して JavaScript Includion で表示するというものです。結果はこんな感じ。 (出力にスタイルを当ててます。)
コードは以下です。Net::Amazon で Wishlist 検索を行って、その結果を Template-Toolkit に渡して整形表示。モジュールのおかげで割と単純なスクリプトだったりします。
#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
NDO::Wishlist2Js->new->do;
package NDO::Wishlist2Js;
use Cache::File;
use Encode;
use Net::Amazon;
use Template;
use constant DEV_TOKEN => 'DM1XQEXM3YQU8';
use constant WISHLIST_ID => '3J0YO7YAO4L4W';
use constant AWS_CACHE_ROOT => '/memfs/wlist2js';
use constant AWS_CACHE_EXPIRES => '3600 sec';
sub new {
bless {}, shift;
}
sub do {
my $self = shift;
$self->setcache;
$self->setua;
$self->makelist;
$self->print;
}
sub setcache {
my $self = shift;
$self->{awscache} = Cache::File->new(
cache_root => AWS_CACHE_ROOT,
default_expires => AWS_CACHE_EXPIRES,
);
}
sub setua {
my $self = shift;
$self->{ua} = Net::Amazon->new(
token => DEV_TOKEN,
locale => 'jp',
cache => $self->{awscache},
);
}
sub makelist {
my $self = shift;
my $response = $self->{ua}->search( wishlist => WISHLIST_ID );
die $response->message if ($response->is_error);
$self->{wishlist} = [ $response->properties ];
}
sub print {
my $self = shift;
my $template = Template->new or die $Template::ERROR;
my $html;
$template->process(
\*DATA, { wishlist => $self->{wishlist} }, \$html
) or die $template->error;
my @lines = split /\n/, $html;
my $output = "";
for (@lines) {
s/x27/'/g;
$output .= "document.writeln('$_');\n";
}
print encode('euc-jp', $output);
}
1;
__DATA__
<div id="wishlist">
[% FOREACH item IN wishlist -%]
<div class="wishlist-item">
<div class="wishlist-item-image">
<img src="[% item.ImageUrlSmall %]" alt="[% item.ProductName %]" />
</div>
<div class="wishlist-item-info">
<div class="wishlist-item-info-title">
<a href="http://www.amazlet.com/browse/ASIN/[% item.Asin %]/">[% item.ProductName %]</a>
</div>
Amazon.co.jp 価格: <span class="wishlist-price">[% item.OurPrice %]</span><br />
[% IF item.SalesRank %]ランキング: [% item.SalesRank %][% END %]<br />
[% item.Availability %]
</div>
<div class="wishlist-item-footer"></div>
</div>
[% END -%]
</div>
実はちょっと色気を出して、出力先のリンクは Amazon.co.jp ではなく amazlet.com に貼ったりしてみました。このスクリプトを crontab にでも引っ掛けておき、出力を wishlist.js にでもリダイレクトして保存、script タグで取り込めば完了です。
というわけでたまには週末 Hack してみました。