| 【注意】bracket_fep プラグイン 専用 bfep 「 bsnap_asin プラグイン 」としてインプリメントし直しました。 今後、bsnap_asin プラグイン を改変していくことになりますので、可能であればそちらに移行いただければ幸甚です。 |
asin_complex plug-in †
開発方針 †
- asin_simple プラグイン をベースに機能追加を行う
- asin プラグイン 相当の機能追加
開発ログ †
Sep 7, 2005
- asin_simple プラグイン より開発を移行
- ASIN コードをマッチングする正規表現を見直し
Nov 17, 2005
- キャッシュリフレッシュ時のロック処理を追加
Jan 29, 2007
- ロック処理時間をキャッシュ新規生成/リフレッシュ処理時のみに最小化
- 商品画像がないことを確認してから noImage に差し替えるのではなく、デフォルトは noImage に設定し商品画像があれば noImage を差し替えるアルゴリズムに変更
- キャッシュの読み込み時は読み込み専用モードでファイルを開くようにした
- Amazon.co.jp への問い合わせの際のタイムアウト時間を 10 秒から 30 秒に延長
Jul 15, 2007
- 商品画像への URL が返されない場合に対応
- 商品画像の URL チェックを 5 回までリトライする仕様に変更
Mar 2, 2008
- ECS 4.0 対応
Feb 7, 2009
- bracket_fep プラグイン 専用 bfep 「 bsnap_asin プラグイン 」へ開発主体を移行
開発メモ †
- XML スタイルファイル
- その 2 : Amazon からの出力(スタイルシート指定)
以下に貼り付けてありますソースコードは開発中のものであり、使用していただくこと、改変していただくことについて一切、当方では著作に関する権利を主張するつもりはありませんが、お使いいただく場合はすべて自己責任でお願いします。このソースコードを使用することで不利益を被られた場合でも、当方では一切の責任を負いかねます。
Mar 02, 2008 版全ソース
# Blosxom Plugin : asin_complex
# Author(s) : kay <info@ellinikonblue.com>
# Version : 2008 Feb for Amazon ECS 4.0
package asin_complex;
# --------------------------------------
# Configurable Variable
my $associatetag = "YourAssociateTag"; # Associate Tag
my $subscriptionid = "YourAccessKeyID"; # Access Key ID
my $xslfile = "http://www.yourdomain.com/xsl/asinsimple.xsl";
# Cache Configuration
my $asin_dir = "$blosxom::plugin_state_dir/asin";
my $modify = "24";
# Path to no image
my $noImage = "http://www.yourdomain.com/image/no-image.png";
my $noImageHeight = "130";
my $noImageWidth = "130";
# --------------------------------------
my $locale = "jp";
# Base URL
my $requesturl = "http://webservices.amazon.co.jp/onca/xml"; # for Amazon.co.jp
my $targeturl = "http://www.amazon.co.jp/exec/obidos/ASIN/"; # for Amazon.co.jp
#Constant value for deadlock routine
my $LockName = "$asin_dir/Locked";
my $retry = 10;
# ======================================
use LWP::Simple;
sub start {
if (!-e $asin_dir) {
my $mkdir_r = mkdir($asin_dir, 0755) or die "Can't creat $asin_dir : $1";
$mkdir_r or return 0;
}
return 1;
}
sub story {
my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_;
$$body_ref =~ s/\[asin:([A-Z0-9]{10})\]/requestAWS($1)/gei;
$$body_ref =~ s/<a\s+href="asin:([A-Z0-9]{10})"\s*>/'<a href="'.rewriteASIN($1).'">'/gei;
return 1;
}
sub rewriteASIN { # SubRoutine to make URL from ASIN code
my ($asinCode) = @_;
return "$targeturl$asinCode/$associatetag/ref=nosim/";
}
sub requestAWS { # SubRoutine to request to AWS
my ($asinCode) = @_;
my $request = "$requesturl?Service=AWSECommerceService&ContentType=text/html&" .
"SubscriptionId=$subscriptionid&" .
"AssociateTag=$associatetag&" .
"&ResponseGroup=Medium&Operation=ItemLookup&&ItemId=$asinCode" .
"&Version=2005-07-26&Style=$xslfile";
my $cache = "$asin_dir/$asinCode.html";
my $tmpcache = "$asin_dir/$asinCode.tmp";
my $rtn = "";
if ( -e $cache ) {
# Cache Refresh?
if ( -M $cache > ( $modify / 24 ) or ( -s _ > 1 and -s _ < 160 ) ) {
# Cache files less 160bytes is refreshed by my experiense.
# for LockFile exist
if ( -e "$LockName$asinCode" && (stat("$LockName$asinCode"))[8] + 180 < time() ) {
# Lock cleaning
if ( -e $tmpcache ) { unlink( $tmpcache ); }
rmdir( "$LockName$asinCode" ); # LockFile Cleaning
}
if ( -e "$LockName$asinCode" ) {
while ( -e "$LockName$asinCode" ) {
if ( --$retry < 1 ) { last; } # Give up to refresh cache after 10s waiting
sleep(1);
}
} else {
mkdir( "$LockName$asinCode", 0755 ); # Cache Locked!
create_cache( $tmpcache, $request );
if ( unlink( $cache ) ) {
rename( $tmpcache, $cache );
}
rmdir( "$LockName$asinCode" ); # Cache unlocked!
}
}
} else {
# New Cache Create
mkdir( "$LockName$asinCode", 0755 ); # Cache Locked!
create_cache( $cache, $request );
rmdir( "$LockName$asinCode" ); # Cache unlocked!
}
# Read from cache
if ( open CACHE, "< $cache" ) {
$rtn = join( '', <CACHE> );
$rtn = '<div class="asinSimple">' . $rtn . '</div>';
close CACHE;
}
return $rtn;
}
sub create_cache { # SubRoutine to create new cache
my ( $cache_file, $request ) = @_;
my $url = "s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+";
# Request and get that response
my $ua = new LWP::UserAgent;
$ua->agent("asin_complex");
$ua->timeout(30);
my $r = $ua->mirror($request, $cache_file);
my $rtn = "";
# Cache Conversion
if ( open CACHE, "< $cache_file" ) {
while ( <CACHE> ) {
if ( /<img\s+src="(.*?)"\s*\/?>/ ) { # Is image legal?
my $imgsrc = $1;
my $convtag = '<img src="' . $noImage . '" ' .
'height="' . $noImageHeight . 'px" ' .
'width="' . $noImageWidth . 'px" />';
if ( $imgsrc =~ /$url/ ) {
my $header = head( $imgsrc );
my $r = 5;
while ( !$header and $r-- > 0 ) {
sleep(5);
$header = head( $imgsrc );
}
if ( $header && $header->content_length > 820 ) {
# Image file less 820bytes is "No Image".
$convtag = '<img src="' . $imgsrc . '" />';
}
}
$_ =~ s/<img\s+src=".*?"\s*\/?>/$convtag/gs;
}
# for HTML 1.0
$_ =~ s/<br>/<br \/>/gs;
$rtn .= $_;
}
close CACHE;
if ( open CACHE, "> $cache_file" ) {
print CACHE $rtn;
close CACHE;
}
}
return 1;
}