asin記法をカスタマイズ2

再編集・再構築時に外部接続のコストがかかることから、このカスタマイズは使用しなくなりました。



asin記法をカスタマイズ - matuダイアリーでasin記法で詳細オプションを指定したときのカスタマイズを行いましたが、あまりにbuggyだったのと、スタイルをベタ書きしすぎていたのが気になったので修正しました。

  • バグ修正
    • Authorが複数じゃなかったり、存在しなかった場合はエラーを吐きまくってました。お恥ずかしい。
  • 出力するHTMLタグを、(ほぼ)はてな化。
    • はてなテーマに定義されている、asin系のスタイルがそのまま使えるのがメリット。

出力例

試しに、いままで紹介させていただいた商品をasin記法の詳細オプション付きで表示すると、以下のようになります。

フォーカス・リーディング 「1冊10分」のスピードで、10倍の効果を出す いいとこどり読書術

フォーカス・リーディング 「1冊10分」のスピードで、10倍の効果を出す いいとこどり読書術

ATOK 2008 for Windows

ATOK 2008 for Windows

Firefox 3 Hacks ―Mozillaテクノロジ徹底活用テクニック

Firefox 3 Hacks ―Mozillaテクノロジ徹底活用テクニック

200809asin-detail.jpg

といった具合に、メディアによって表示する情報数がまちまちなので、たとえばDVDだったら出演者や監督名などを表示するかといったところが今後の検討課題です。

今回の修正内容

--- Tag_amazon.pm.orig  2008-02-07 01:50:00.000000000 +0900
+++ Tag_amazon.pm       2008-09-16 08:53:28.000000000 +0900
@@ -1,4 +1,7 @@
use strict;
+use WebService::Simple;
+use Encode;
+
#------------------------------------------------------------------------------
# Amazon記法プラグイン
#                                                   (C)2006 nabe / nabe@abk.nu
@@ -82,6 +85,12 @@
$asin .= $sum;
}
+
+       # Asin Detail
+        if ( $ary->[0] eq 'detail') {
+               return &amazon_asin_detail($asin, $asid);
+       }
+
# 画像モード?
if ($ary->[0] eq 'img' || $ary->[0] eq 'image' || $ary->[0] eq 'detail') {
shift(@$ary);
@@ -124,5 +133,61 @@
return "<a href=\"http://www.amazon.co.jp/exec/obidos/ASIN/$asin/$asid\"$attri><img src=\"http://images-jp.amazon.com/images/P/$asin$size\" alt=\"$name\" class=\"asin\"$size_tag></a>";
}
+sub amazon_asin_detail {
+       my ($asin, $asid) = @_;
+
+       my $amazon = WebService::Simple->new(
+               base_url => "http://webservices.amazon.co.jp/onca/xml",
+               param    => {
+                       AssociateTag   => $asid,
+                       SubscriptionId => '0EFZW5XNGVAC9H12ER82',
+                       Service        => 'AWSECommerceService',
+                       locale         => 'jp',
+                       ContentType    => 'text/xml',
+                       Version        => '2007-10-29',
+               }
+       );
+
+       my $resp = $amazon->get({
+               Operation     => 'ItemLookup',
+               ItemId        => $asin,
+               ResponseGroup => 'Medium',
+       });
+
+       my $item = $resp->parse_response->{Items}->{Item};
+       my $url    = $item->{DetailPageURL};
+       my $img    = $item->{MediumImage}->{URL};
+       #my $img    = $item->{SmallImage}->{URL};
+       my $title  = $item->{ItemAttributes}->{Title};
+       my $price  = $item->{ItemAttributes}->{ListPrice}->{FormattedPrice};
+       my $media  = $item->{ItemAttributes}->{Binding};
+       my $author;
+       if ( ref($item->{ItemAttributes}->{Author}) eq 'ARRAY' ) {
+               $author = join(", ", @{$item->{ItemAttributes}->{Author}});
+       } else {
+               $author = $item->{ItemAttributes}->{Author};
+       }
+       my $maker  = $item->{ItemAttributes}->{Manufacturer};
+       my @html = ();
+
+       push(@html, "<div class=\"hatena-asin-detail\">\n");
+       # image
+       push(@html, "<a href=\"$url\"><img src=\"$img\" class=\"hatena-asin-detail-image\" alt=\"$title\" title=\"$title\"></a>\n");
+       # info
+       push(@html, "<div class=\"hatena-asin-detail-info\">\n");
+       push(@html, "<p class=\"hatena-asin-detail-title\"><a href=\"$url\">$title</a></p>\n");
+       push(@html, "<ul>\n");
+       push(@html, "<li>$media</li>\n") if ($media);
+       push(@html, "<li>$author</li>\n") if ($author);
+       push(@html, "<li>$maker</li>\n") if ($maker);
+       push(@html, "<li>$price</li>\n") if ($price);
+       push(@html, "</ul>\n");
+       push(@html, "</div>\n");
+       push(@html, "<div class=\"hatena-asin-detail-foot\"></div>\n");
+       push(@html, "</div>\n");
+
+       @html = Encode::encode('utf8',"@html");
+       return "@html";
+}
1;