December 23, 2004

Net::Amazon & XML::RSS で Amazon ウィッシュリストをRSSにする

wishlist

読みたい本、読まなければならない本は増える一方なのですが消費量は低下するばかりで、Amazonのウィッシュリストはどんどん増えていくのでした。これをWebで確認するのは面倒なのでRSSリーダーで読めたらいいなぁと思い、ウィッシュリストをRSSにして出力するスクリプトを作ってみました。


#!/usr/local/bin/perl

require 5.008;
use strict;
use warnings;
binmode STDOUT, ':utf8'; # Wide character in print at..

use Net::Amazon;
use XML::RSS;
use DateTime::Format::W3CDTF;

use constant DEV_TOKEN   => 'YOUR_AMZN_TOKEN';
use constant WISHLIST_ID => 'YOUR_WISH_LIST';
use constant RDF_PATH    => './wishlist.rdf';

my $ua = Net::Amazon->new(
    token  => DEV_TOKEN,
    locale => 'jp',
);
my $rss = new XML::RSS (version => '1.0');

$rss->channel(
    title        => 'My Amazon Wishlist',
    link         => 'http://www.amazon.co.jp/exec/obidos/registry/' . WISHLIST_ID,
    description  => '',
    dc => {
        creator  => '',
        rights   => '',
        language => 'ja'
    }
);

my $response = $ua->search( wishlist => WISHLIST_ID );
for ($response->properties){
    my $description = $_->ProductDescription();
    $description =~ s/<[^>]*>//g;
    $description =~ s/ / /g;

    my @date = split /\//, $_->ReleaseDate();
    my %date;
    $date{year}      = $date[0];
    $date{month}     = $date[1] if $date[1];
    $date{day}       = $date[2] if $date[2];
    $date{time_zone} = 'Asia/Tokyo';
    my $dt = DateTime->new(\%date);

    $rss->add_item(
        title => $_->ProductName() . " " . $_->author() . " " . $_->OurPrice(),
        link  => "http://www.amazon.co.jp/exec/obidos/ASIN/" . $_->Asin(),
        description => "[ " . $_->ProductName() . " / " . $_->author() . " / " . $_->OurPrice()
         . " / " . $_->Manufacturer() . " / " . $_->Availability()
         . " / SalesRank: " . $_->SalesRank() . " ] " . $description,
        dc => {
            date    =>  $dt->format_datetime($dt) . '+09:00',
        },
    );
}

$rss->save(RDF_PATH);

__END__

スクリプトはutf8で書いたほうがラクですがEUC-JPでも動きます。dc:dateの時間のところはどうせ00:00:00になるので、DateTime::Format::W3CDTFを使う必要はないかもしれません。binmode STDOUT, ':utf8'; は"Wide character in print at.."というエラーの対策ですが、これを書いてもエラーが少し出てしまいます。スクリプトをutf8にすれば解決するかも。でも動くからいいや。
日本語文字化け関係にはちょっと悩まされたのですが、ここなどが参考になりました。Net::Amazonの応答はUTF-8なので、RSSにしやすいですね。

スクリーンショットはOpera7.53での見た目です。発行年月日でソートできるしAmazon.co.jp 売上ランキングが手軽に見られるので便利。満足。cronとかに入れて動作させるとシアワセになれます。本当はコメントとかウィッシュリストへの登録日時が取得できればいいのですが、Net::Amazonでは取得できなさそうです。SOAP::Liteで直接叩けば取ってこれるのかなぁ。

参考サイト
http://fromto.cc/hosokawa/diary/2003/20030727-home2/
http://blog.bulknews.net/cookbook/blosxom/rss/rss2email.html
http://naoya.dyndns.org/~naoya/mt/archives/000386.html
http://naoya.dyndns.org/~naoya/mt/archives/000611.html
http://search.cpan.org/~mschilli/Net-Amazon-0.31/lib/Net/Amazon.pm


この記事へのトラックバックURL

http://app.blog.livedoor.jp/cpiblog00035/tb.cgi/11222337
この記事へのコメント
merry christmas ^^ i could'nt sent you a email so i post a message here, i hope you have a happy new year (^^)b

p.s my friend in Japan now buying me a nintendo DS ww
Posted by Suske at December 24, 2004 01:35
Merry Christmas
I wish you a merry and happy Christmas ! (^-^)/

I am interested in PSP.w ^^
Posted by Perler at December 24, 2004 04:14