昨年10月にMovableType3.2にアップグレードしたらaws.plの出力が文字化けして困った際に参考にしたサイトがなくなってしまったようなので、修正版aws.plを上げておきます。
DVDの監督情報なども取得できるように文字化け問題とは関係の無いカスタマイズも行っていますので、必要の無い人は該当部分を削除した方が再構築時などのレスポンスがよくなるかと思います。
オリジナルaws.plのライセンスには改造版の再配布について明記されて無いのが気になるんですが、自由に利用してかまわないと書いてあるからいいですかね。
利用して得られる利益/損失について、散財人は一切関知せず、また責任をとりませんし、サポートも行わないのであしからず。
このプラグインの著作権はひらたにあります。個人かつ非営利での利用(もちろん、Amazon アソシエイトはOK!) に限り、プログラムの一部、もしくは全部を自由に利用、改造していただいて構いません。利用して得られる利益/損失について、わたしは一切関知せず、また責任をとりません。
# aws.pl
# (C) 2003 Daiji Hirata
# All Right Reserved.
#use Data::Dumper;
use MT;
use MT::ConfigMgr;
use MT::Template::Context;
use LWP::UserAgent;
use XML::Simple;
#use Jcode;
use Encode;
use strict;
my $VERSION = '1.0a';
my %config;
$config{"dev-t"} = 'DDDDDDDDDDDDDD'; #自分で取得したdeveloper-tokenを入れる
$config{associate_id} = 'sanzairyusei-22'; #自分で取得したassociate-idを入れる。もちろんこのままでも歓迎!
$config{locale} = 'jp';
my @aws_tags = (
# lite
'url', 'ImageUrlSmall', 'ImageUrlMedium', 'ImageUrlLarge', 'ProductName', 'Asin',
'Manufacturer', 'Availability', 'ListPrice', 'OurPrice', 'UsedPrice', 'Catalog',
# heavy
'Media', 'Isbn', 'ReleaseDate', 'SalesRank', 'Upc', 'ThirdPartyNewPrice',
);
my $elements = {
'ActorSearch' => [ "dev-t", "t", "type", "f", "locale", "mode", "page" ],
'ArtistSearch' => [ "dev-t", "t", "type", "f", "locale", "mode", "page" ],
'AsinSearch' => [ "dev-t", "t", "type", "f", "locale" ],
'AuthorSearch' => [ "dev-t", "t", "type", "f", "locale", "mode", "page"],
# 'BlendedSearch' => [ "dev-t", "t", "type", "f", "locale" ],
'BrowseNodeSearch' => [ "dev-t", "t", "type", "f", "locale" ,"mode", "sort"],
'DirectorSearch' => [ "dev-t", "t", "type", "f", "locale", "mode", "page"],
'KeywordSearch' => [ "dev-t", "t", "type", "f", "locale", "mode", "page"] ,
'ListManiaSearch' => [ "dev-t", "t", "type", "f", "locale"],
'ManufacturerSearch' => [ "dev-t", "t", "type", "f", "locale", "mode", "page"] ,
'PowerSearch' => [ "dev-t", "t", "type", "f", "locale", "mode", "page"] ,
'SemilaritiesSearch' => [ "dev-t", "t", "type", "f", "locale" ],
'UpcSearch' => [ "dev-t", "t", "type", "f", "locale", "mode" ],
'WishListSearch' => [ "dev-t", "t", "type", "f", "locale" ],
};
MT::Template::Context->add_container_tag(Aws => \&aws);
MT::Template::Context->add_tag(AwsAddCart => \&aws_addcart);
MT::Template::Context->add_tag(AwsAuthors => \&aws_authors );
MT::Template::Context->add_tag(AwsArtists => \&aws_artists );
MT::Template::Context->add_tag(AwsTracks => \&aws_tracks );
MT::Template::Context->add_tag(AwsXML => \&aws_xml );
MT::Template::Context->add_tag(AwsRequestUrl => \&aws_requesturl );
MT::Template::Context->add_tag(AwsTotalPages => \&aws_totalpages );
MT::Template::Context->add_tag(AwsTotalResults => \&aws_totalresults );
MT::Template::Context->add_tag(AwsAvgCustomerRating => \&aws_avgcustomerrating );
MT::Template::Context->add_tag(AwsTotalCustomerReviews => \&aws_totalcustomerreviews );
MT::Template::Context->add_tag(AwsVersion => \&aws_version );
MT::Template::Context->add_tag(AwsDirectors => \&aws_directors );
MT::Template::Context->add_tag(AwsStarring => \&aws_starring );
foreach my $tag (@aws_tags) {
MT::Template::Context->add_tag('Aws'.$tag => sub { my $ctx = shift; aws_detail($ctx, $tag)});
}
sub aws {
my ($ctx, $arg) = @_;
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
my $res;
my %q;
use MT::ConfigMgr;
my $cfg = MT::ConfigMgr->instance;
my $charset = {'Shift_JIS'=>'sjis','ISO-2022-JP'=>'jis','EUC-JP'=> 'euc',
'UTF-8'=>'utf8'}->{$cfg->PublishCharset} || 'utf8';
$q{f} = 'xml';
$q{"dev-t"} = ($arg->{dev_token}) ? $arg->{dev_token} : $config{"dev-t"};
if (!($q{"dev-t"})) { return $ctx->error("MTAWS needs your developer token: $q{'dev-t'}."); }
$q{t} = ($arg->{associate_id}) ? $arg->{associate_id} : $config{associate_id};
if (!($q{t})) { $q{t} = 'dh0dc-22'; }
$q{type} = ($arg->{type}) ? $arg->{type} : 'lite';
$q{mode} = ($arg->{mode}) ? $arg->{mode} : '';
$q{page} = ($arg->{page}) ? $arg->{page} : 1;
$q{lastn} = ($arg->{lastn}) ? $arg->{lastn} : -1;
$q{offset} = ($arg->{offset}) ? $arg->{offset} : -1;
$q{locale} = ($arg->{locale}) ? $arg->{locale} : $config{locale};
$q{sort} = ($arg->{sort}) ? $arg->{sort} : '';
if ($arg->{search} && $arg->{query}) {
$q{search} = $arg->{search};
# $q{query} = ($charset ne 'utf8') ? Jcode->new($arg->{query}, $charset)->utf8 : $arg->{query};
$q{query} = Encode::encode('utf8', $arg->{query});
$q{$arg->{search}} = utf2entity($q{query},1);
} else {
return $ctx->error("No search method and/or query");
}
# my $url = 'http://xml.amazon.com/onca/xml3?';
my $url = 'http://xml.amazon.co.jp/onca/xml3?';
my @query;
push @query, "$q{search}=$q{$q{search}}";
foreach my $key (@{$elements->{$q{search}}}) {
if (defined $q{$key}) {
push @query, "$key=$q{$key}";
}
}
$url .= join "&", @query;
# $url .= '&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A';
$ctx->stash('RequestUrl', $url );
$ctx->stash('Associate_Id', $q{t} );
my $ua = new LWP::UserAgent;
$ua->agent("MTAWS");
my $http_request = new HTTP::Request('GET', $url);
my $http_response = $ua->request($http_request);
my $content = $http_response->{'_content'};
if ( $q{type} eq 'heavy') {
my @content = split "\n", $content;
$content = '';
foreach my $line (@content) {
if ($line) {
$content .= Encode::decode('utf8', $line);
# $content .= Jcode->new($line,'utf8')->utf8;
$content .= "\n";
}
}
}
#die $q{query};
# AWSからのレスポンスはここでUTF8フラグが立てられるっぽい
my $tree;
$tree = XMLin($content);
if (!($tree)) { return $ctx->error("XML incorrect:\n"); }
$ctx->stash('XML', $content );
my @details;
if (ref $tree->{Details} eq 'ARRAY') {
push @details, @{$tree->{Details}};
} else {
push @details, $tree->{Details};
}
$ctx->stash("TotalResults", $tree->{TotalResults});
$ctx->stash("TotalPages", $tree->{TotalPages});
# トークンはDBにあるままなので、UTF8フラグが立っていない
# なので、文字コードをUTF8に変換し、UTF8フラグを立てる
for my $t (@$tokens)
{
if( $t->[0] eq 'TEXT' )
{
$t->[1] = Encode::decode( $charset, $t->[1] );
# $t->[1] = Jcode->new($t->[1])->utf8;
# $t->[1] = decode_utf8( $t->[1] );
}
}
for my $detail (@details) {
next if (($q{offset}--) > 0);
$ctx->stash("Detail", $detail);
defined(my $out = $builder->build($ctx, $tokens))
or return $ctx->error($ctx->errstr);
# $res .= sprintf($out);
$res .= $out;
if ($q{lastn}>0) { $q{lastn}--; }
last if ($q{lastn} == 0);
}
# UTF8フラグをおろし、PublishCarsetの文字コードに変換する
# $res = encode_utf8($res);
# return Jcode->new($res, 'utf8')->$charset();
return Encode::encode( $charset, $res );
}
sub utf2entity {
my ($str, $amazon) = @_;
# $str = Jcode->new($str)->utf8;
$str =~ s/([^\w,])/'%'.unpack("H2", $1)/ego;
if ($amazon ) {
$str =~ s/%/%25/g;
}
$str;
}
sub aws_requesturl {
my $ctx = shift;
$ctx->stash("RequestUrl") || '';
}
sub aws_xml {
my $ctx = shift;
$ctx->stash("XML") || '';
}
sub aws_totalresults {
my $ctx = shift;
$ctx->stash("TotalResults") || '';
}
sub aws_totalpages {
my $ctx = shift;
$ctx->stash("TotalPages") || '';
}
sub aws_authors {
my $ctx = shift;
defined (my $detail = $ctx->stash("Detail")) or return '';
if (ref $detail->{Authors}->{Author} eq 'ARRAY') {
return join ", ", @{$detail->{Authors}->{Author}};
} else {
$detail->{Authors}->{Author} || '';
}
}
sub aws_directors {
my $ctx = shift;
defined (my $detail = $ctx->stash("Detail")) or return '';
if (ref $detail->{Directors}->{Director} eq 'ARRAY') {
return join ", ", @{$detail->{Directors}->{Director}};
} else {
$detail->{Directors}->{Director} || '';
}
}
sub aws_starring {
my $ctx = shift;
defined (my $detail = $ctx->stash("Detail")) or return '';
if (ref $detail->{Starring}->{Actor} eq 'ARRAY') {
return join ", ", @{$detail->{Starring}->{Actor}};
} else {
$detail->{Starring}->{Actor} || '';
}
}
sub aws_detail {
my ($ctx, $e) = @_;
defined (my $detail = $ctx->stash("Detail")) or return '';
if (ref $detail->{$e} eq 'ARRAY') {
return join ", ", @{$detail->{$e}};
} else {
return $detail->{$e} || '';
}
}
sub aws_avgcustomerrating {
my $ctx = shift;
defined (my $detail = $ctx->stash("Detail")) or return '';
$detail->{Review}->{AvgCustomerRating} || '';
}
sub aws_totalcustomerreviews {
my $ctx = shift;
defined (my $detail = $ctx->stash("Detail")) or return '';
$detail->{Review}->{TotalCustomerReviews} || '';
}
sub aws_artists {
my $ctx = shift;
defined (my $detail = $ctx->stash("Detail")) or return '';
if (ref $detail->{Artists}->{Artist} eq 'ARRAY') {
return join ", ", @{$detail->{Artists}->{Artist}};
} else {
$detail->{Artists}->{Artist} || '';
}
}
sub aws_tracks {
my $ctx = shift;
defined (my $detail = $ctx->stash("Detail")) or return '';
if (ref $detail->{Tracks}->{Track} eq 'ARRAY') {
return join ", ", @{$detail->{Tracks}->{Track}};
} else {
$detail->{Tracks}->{Track} || '';
}
}
sub aws_addcart {
my ($ctx, $args) = @_;
my $res;
defined (my $detail = $ctx->stash("Detail")) or return '';
my $button = ($args->{label}) ? $args->{label} : "Buy";
$res = sprintf( "<form method=\"POST\" action=\"http://www.amazon.co.jp/o/dt/assoc/handle-buy-box=%s\">\n", $detail->{Asin} );
$res .= sprintf( "<input type=\"hidden\" name=\"asin.%s\" value=\"1\">\n", $detail->{Asin} );
$res .= sprintf( "<input type=\"hidden\" name=\"tag-value\" value=\"%s\">\n", $ctx->stash("Associate_Id") );
$res .= sprintf( "<input type=\"hidden\" name=\"tag_value\" value=\"%s\">\n", $ctx->stash("Associate_Id") );
$res .= sprintf( "<input type=\"submit\" name=\"submit.add-to-cart\" value=\"%s\">\n", $button);
$res .= "</form></span>\n";
$res;
}
sub aws_version {
$VERSION;
}
1;
__END__
=head1 NAME
aws.pl - Movable Type Plugin of Amazon Webservices
=head1 SYNOPUS
<MTAws dev-t="developer-token" associate_id="dh0dc-22" search="KeywordSearch" mode="books-jp" query="weblog" locale="jp">
<$MTAwsurl$>
<$MTAwsAuthors$>
<img src="<$MTAwsImageUrlSmall$>">
<$MTAwsAddCart label="Buy from Amazon!"$>
</MTAws>
=head1 LICENSE
Please see the file F<README> in the package.
=head1 AUTHOR
Daiji Hirata, dh@uva.jp
=cut

コメントする