もう一本は Amazon のウェブサービス を使って、Amazon.co.jp からウィッシュリストを引っ張ってきて表示するプラグインを書いてみました。まだ必要最低限のパラメータしか引っ張れないし、日本語の処理も不十分で化ける時がありますが一応動きはします。
CPAN には Net::Amazon という便利なモジュールが登録されていて、これを使えば Web サービスであることをほとんど意識せずに Amazon ウェブサービスを利用するコードが書けます。
package MT::Plugin::AmazonWishlist;
use strict;
use warnings;
use Jcode;
use Net::Amazon;
use Net::Amazon::Request::Wishlist;
use MT::Template::Context;
MT::Template::Context->add_container_tag( AmazonWishlist => \&_amazonWishlist );
MT::Template::Context->add_tag( AWProductName => \&_awProductName );
MT::Template::Context->add_tag( AWImageUrl => \&_awImageUrl );
MT::Template::Context->add_tag( AWUrl => \&_awUrl );
MT::Template::Context->add_tag( AWOurPrice => \&_awOurPrice );
sub _amazonWishlist {
my ($ctx, $args) = @_;
my $res = '';
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
my $ua = Net::Amazon->new(
token => $args->{token},
locale => $args->{locale}
);
my $req = Net::Amazon::Request::Wishlist->new( id => $args->{id} );
my $response = $ua->request($req);
if ($response->is_success()) {
for my $property ($response->properties) {
$ctx->stash('property', $property);
defined (my $out = $builder->build($ctx, $tokens)) or return $ctx->error($ctx->errstr);
$res .= $out;
}
} else {
return $ctx->error( $response->message() );
}
$res;
}
sub _awProductName {
my ($ctx, $args) = @_;
my $property = $ctx->stash('property')
or return $ctx->error("Tag called without an amazon wishlist in context");
# Jcode->new($property->ProductName)->euc;
$property->ProductName;
}
sub _awImageUrl {
my ($ctx, $args) = @_;
my $size = $args->{size};
my $img_url = "";
my $property = $ctx->stash('property')
or return $ctx->error("Tag called without an amazon wishlist in context");
if ($size eq 'small') {
$img_url = $property->ImageUrlSmall;
} elsif ($size eq 'large') {
$img_url = $property->ImageUrlLarge;
} else {
$img_url = $property->ImageUrlMedium;
}
$img_url;
}
sub _awUrl {
my ($ctx, $args) = @_;
my $property = $ctx->stash('property')
or return $ctx->error("Tag called without an amazonwishlist in context");
$property->url;
}
sub _awOurPrice {
my ($ctx, $args) = @_;
my $property = $ctx->stash('property')
or return $ctx->error("Tag called without an amazonwishlist in context");
$property->OurPrice;
}
1;
こんなプラグインを書いておいて、
<div class="sidetitle">
Amazon ウィッシュリスト
</div>
<div class="side">
<MTAmazonWishlist token="..." locale="jp" id="...">
<div class="awitem">
<a href="<$MTAWUrl$>"><$MTAWProductName$><br/>
<img src="<$MTAWImageUrl size="small"$>"/>
</a>
</div>
</MTAmazonWishlist>
</div>
というタグをテンプレートに埋め込みます。MTAmazonWishlist タグの属性 token は Amazon ウェブサービスのデベロッパートークン。Amazon のサイトから無料で取得できます。id はウィッシュリストの ID です。URL などに含まれているものを使います。locale を jp にしておけば Amazon.co.jp からデータを引っ張れます。
とりあえず実験目的で作ったものなので、名前、画像、画像のURL、商品のURLしか取得できません。他のパラメータも同じ要領で取得できるので、追加するのは簡単ですがいかんせん日本語が化けまくりではまってしまいました。
日本語が化けるケースは色々あって混乱してしまってよくわからない状況になっちゃってます。Net::Amazon は内部で XML::Parser を用いていることもあってか、応答は UTF-8 で返却されます。この状況で、
うーん、Jcode.pm の UTF-8 絡みはもうお手上げです。
ちなみに MT Plugin Directory にある MTAmazon も同じく Amazon ウェブサービスを利用するためのプラグインで、かなり汎用的なつくりになってるみたいです。
Jcode.pmではなく Encode.pm を使うのがイマドキみたいですよ。(see. perldoc Encode)
Jcode と同じく Dan Kogai さんがメンテナです。
# 実際に触ってないので本当のところは知りませんが
http://naoya.dyndns.org/~naoya/mt/archives/amazon_wl.pl
Perl 5.8.0 で Encode.pm で UTF-8 → EUC-JP 変換させると文字化けは回避できました。
ただ、Encode.pm って Perl 5.6.0 じゃ使えないですよね。自分専用プラグインとして終わりそうな気配。(笑)
[2] Posted by: naoya at August 15, 2003 08:34 PM [返信]こんばんは。自分でAmazonのウェブサービスを使い始めて、いろいろ調べているうちにたどり着きました。
ウィッシュリストもNet::Amazonも初めて知りました。時間あるときに一通り読みふけりたいと思います。
どうもです。
Net::Amazon は結構便利ですよ。ソースを見ていただいてもお分かりかと思いますや、SOAP や XML なんかは完全に抽象化してくれていますから。
Net::Google なんかもおすすめです。;)
[4] Posted by: naoya at September 16, 2003 01:14 AM [返信]