[Perl] Amazon Plugin 開発(1)
開発中
現在,開発中のプラグイン.
バージョン 1.00
mt-amazon.pl
ソースコード
# # sonson@Picture&Software # # Amazon Plugin for MovableType # 2006/04/05 version 1.00 # # sonson, all rights reserved. # use LWP::UserAgent; use HTTP::Request; use HTTP::Response; # AmazonID my $accessKeyID = "XXXXXXXXXXXXXXXXXXXX"; # AamzonWebServicesのAccessKeyID my $associateID = "XXXXXXXXXXXXX"; # AmazonアフィリエイトのアソシエイトID # エラーメッセージ my $errorMsg = "[Amazon Plugin] "; my $errorMsgInput = "$errorMsg入力URLが間違っている可能性があります."; my $errorMsgNetworkError = "Amazonに接続できませんでした."; my $errorMsgXML = "Amazonから商品情報XMLを取得できませんでした."; my $AMAZON_HTML =<<'__EOF__'; <div class="amazon"> test </div> __EOF__ MT::Template::Context->add_global_filter( amazon => sub { my ($str, $arg, $ctx) = @_; $str =~ s/[amazon:(.+)]/makeAmazonTag($1)/ge if $arg && $str =~ /[amazon:http://(.+)]/; return $str; } ); # URLを分割して,ASINコードを切り出す. sub getASINCode{ my $url = shift; my @a = split(///, $url); my $i=0; my $asinPos=0; # ASINの次のブロックにISBNあるいはASINコードがある for($i=0;$i<@a;$i++){ if( @a[$i] =~ /^ASIN$/ ){ $asinPos = $i+1; last; } } #一回も引っかからなかったらエラー if( $asinPos==0 ){ return NULL; } # コードが10桁かを確認 if( @a[$asinPos] =~ /^.{10}$/ ){ return @a[$asinPos]; } else{ return NULL; } } # ASINコードでAMAZONにアクセスして,結果をXMLで取得する. sub getXML{ my $asinCode = shift; # AmazonアクセスURLを生成 my $amazonURL = "http://webservices.amazon.co.jp/onca/xml"; $amazonURL .= "?Service=AWSECommerceService"; $amazonURL .= "&SubscriptionId="; $amazonURL .= $accessKeyID; $amazonURL .= "&AssociateTag="; $amazonURL .= $associateID; $amazonURL .= "&Operation=ItemLookup"; $amazonURL .= "&ResponseGroup=Small,Images"; $amazonURL .= "&ItemId="; $amazonURL .= $asinCode; my $proxy = new LWP::UserAgent; my $req = HTTP::Request->new('GET' => $amazonURL); my $res = $proxy->request($req); # レスポンスをチェック if ($res->is_success) { return $res->content; }else { return NULL; } } # エラーの結果が返っていないかをチェック sub checkXML{ my $lines = shift; my $searchHeader = "<?xml version="1.0" encoding="UTF-8"?><ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/"; if($lines =~ /$searchHeader/ ){ return true; } else{ return false; } } # XMLから,詳細ページへのリンク,タイトル,画像のURLを抽出し, # タグを生成して,文字列として返す. sub makeHtmlTag{ my $result_str = shift; my $result = "<center> "; if($result_str =~ /<DetailPageURL>(.*)</DetailPageURL>/ ){ my $item_url = $1; $result .= " <a href="$item_url"target="_blank"> "; } $result_str =~ s/<ImageSets>(.*)</ImageSets>//; if($result_str =~ /<MediumImage><URL>(.*)</URL>.*</MediumImage>/ ){ $result .= " <img src="$1"><br/>"; } if($result_str =~ /<Title>(.*)</Title>/ ){ $result .= $1; } $result .= " </a> </center> "; return $result; } # 入力されたURLから,HTMLタグか,エラー結果を返す. sub makeAmazonTag{ my $url = shift; my $code = getASINCode($url); if( $code eq NULL ){ return $errorMsgInput; } my $result_str = getXML($code); if( $result_str eq NULL ){ return $errorMsgNetworkError; } if( !checkXML($result_str) ){ return $errorMsgXML; } return makeHtmlTag($result_str); } 1; __END__