トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

blosxom

【注意】bracket_fep プラグイン 専用 bfep 「 bsnap_asin プラグイン 」としてインプリメントし直しました。
 今後、bsnap_asin プラグイン を改変していくことになりますので、可能であればそちらに移行いただければ幸甚です。

asin_complex plug-in

開発方針

開発ログ

Sep 7, 2005

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

開発メモ


 以下に貼り付けてありますソースコードは開発中のものであり、使用していただくこと、改変していただくことについて一切、当方では著作に関する権利を主張するつもりはありませんが、お使いいただく場合はすべて自己責任でお願いします。このソースコードを使用することで不利益を被られた場合でも、当方では一切の責任を負いかねます。

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;
}

リンク集


© 2004-2010 Ellinikonblue.com All Rights Reserved.