asin記法をカスタマイズ
再編集・再構築時に外部接続のコストがかかることから、このカスタマイズは使用しなくなりました。
■detailオプションを指定したときは詳細を表示できるように
adiaryのasin記法でdetailオプションを指定したら詳細を表示したいなぁとおもってカスタマイズしてみました。(/path/to/lib/Satsuki/TextParser/TagPlugin/Tag_amazon.pm)
[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)
- 作者: 安井真伸,横川和哉,ひろせまさあき,伊藤直也,田中慎司,勝見祐己
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/07
- メディア: 単行本(ソフトカバー)
- 購入: 133人 クリック: 2,270回
- この商品を含むブログ (288件) を見る
と記述すれば以下のように展開されるようになりました。*1
*1 : 明日買おうと思っている本
■WebService::Simpleモジュールは結構使いやすい
このカスタマイズにはPerlのWebService::Simpleモジュールを使用しています。さすがにちょっと前に話題になっただけあって使いやすいなと思いました。
PerlでAmazonWebServiceを扱うときにはNet::Amazonという有名なモジュールがあるんですが、これを使用するとadiaryの日記更新時のリフレッシュの問題か、Net::Amazonを使用したAsinSearchの処理時間の問題かわかりませんが、HTTP 410が返されうまくいきませんでした。
■カスタマイズの内容
--- Tag_amazon.pm.utf8 2008-02-07 01:50:00.000000000 +0900 +++ Tag_amazon.pm.new 2008-08-06 01:59:45.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,58 @@ 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 => 'xxxxxxxxxxxxxxxxxxxx', + 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 = join(", ", @{$item->{ItemAttributes}->{Author}}); + my $maker = $item->{ItemAttributes}->{Manufacturer}; + + my $detail = " + <div style=\"font-size:75%; margin: 0.5em 0 0.5em 0;\"> + <div style=\"width:10%; float:left;\"> + <a href=\"$url\" title=\"$title\"><img src=\"$img\" alt=\"$title\" /></a> + </div> + <div style=\"width:75%; float:left;\"> + <ul style=\"margin:0 auto; list-style:none;\"> + <li><a href=\"$url\" title=\"$title\"><strong>$title</strong></a></li> + <li>$media</li> + <li>$author</li> + <li>$maker</li> + <li>$price</li> + </ul> + </div> + <div style=\"clear:both;\"></div> + </div> + "; + $detail = Encode::encode('utf8',$detail); + return $detail; +} + 1;