2009年06月26日 06:00 [Edit]

Ajax - AWS Caching Proxy w/ Authentication Support

ありがとう、たださん。

Amazon API認証のPROXYを書いたよ(AmazonのAPI認証導入はOSSに対する挑戦だよなぁ(4)) - ただのにっき(2009-06-19)
ご提案いただいている
アプリ --(ASIN)→ PROXY --(ASIN+秘密キー)→ Amazon
の方法でしたら、ライセンス上問題となりませんので、対応につきご検討いただけますと幸いです。
ニヤリ。

というわけで、私も書きました。


Synopsis

すごくRESTful。とっても簡単。ASINが4534045220とすると、

XML
http://api.dan.co.jp/asin/4534045220.xml
YAML
http://api.dan.co.jp/asin/4534045220.yml
JSONP
http://api.dan.co.jp/asin/4534045220/callback.name

後述の通りソースは全部公開するので、なるべく自分の鯖で動かして下さい。api.dan.co.jp でいつまでサービスを動かしておくかは例によって無保証です。

Ajax Demo:

ASIN:

HTML Source:


JS Source:

(function(d){

var $ = function(id){ return d.getElementById(id) };

var json2list = function(json){
    if (json.length){
        var ol = d.createElement('ol');
        ol.start = 0;
        for (var i = 0, l = json.length; i < l ; i++){
            var li = d.createElement('li');
            li.appendChild(
                typeof(json[i]) === 'object' ? arguments.callee(json[i])
                                             : d.createTextNode(json[i])
            );
            ol.appendChild(li);
        }
        return ol;
    }else{
        var ul = d.createElement('ul');
        ul.style.listStyleType = 'none';
        var keys = [];
        for (var p in json) keys[keys.length] = p;
        keys.sort();
        for (var i = 0, l = keys.length; i < l ; i++){
            var p = keys[i];
            var li = d.createElement('li');
            li.appendChild(d.createTextNode(p + ': '));
            li.appendChild(
                typeof(json[p]) === 'object' ? arguments.callee(json[p])
                                             : d.createTextNode(json[p])
            );
            ul.appendChild(li);
       }
       return ul;
    }
};

JSONP = {
  get:function(asin){
    var u = 'http://api.dan.co.jp/asin/' + asin + '/JSONP.run';
    var s = d.createElement('script');
    s.charset = 'UTF-8';
    s.id = s.src = u;
    d.body.appendChild(s);
  },
  run:function(json){
    $('amazon.attr').innerHTML = '';
    if (json.Error){
        $('amazon.attr').appendChild(json2list(json));
        return;
    }
    $('amazon.link').href = 'http://www.amazon.co.jp/gp/product/' + json.ASIN
      + '?ie=UTF8&linkCode=as2tag=blogsofdankog-22';
    if (json.ImageSets){
       var imageset = json.ImageSets.ImageSet;
       if (imageset.length) imageset = imageset[0];
       $('amazon.img').src = imageset.MediumImage.URL;
    }else{
       $('amazon.img').src = 'http://ec1.images-amazon.com/'
         + 'images/G/09/nav2/dp/no-image-no-ciu._AA128_.gif';
    }
    $('amazon.attr').appendChild(json2list(json.ItemAttributes));
  }
};

(function(f){
  if (1 /*@cc_on -1 @*/){ /* good */
    window.setTimeout(f, 100)
  }else{ /* evil */
    window.attachEvent('onload', f)
  }
})(
  function(){
    JSONP.get($('asin').value);
    $('demo.src')[ 
        d.body.innerText ? 'innerText' : 'textContent'
    ] = $('demo').innerHTML;
  }
);

})(document);

Server Source(Perl)

なるべく api.dan.co.jp ではなく、自分の鯖で動かして下さいませ。

  • CGIでもmod_perlでも動きます。
  • キャッシュが効いている場合、特にチューニングしていないmod_perlでも150request/secぐらい出ました(@ api.dan.co.jp)
  • awskeyは、httpdから読めて、かつGETリクエストで取れないところにおいて下さい。
  • awskeyのフォーマットは
    key:    XXXXXXXXXXXXXXXXXXXX
    secret: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
    
    です。
  • 2011年10月26日より、AssociateTagも必須になったようです。
  • cache fileはhttpdから読めるところにおきます。
    chmod 0666 /path/to/cache.db
  • あとはcacheの寿命など、お好みに合わせて。
asin.src

Enjoy!

Dan the Perl-Monging JavaScripting AWS poker


この記事へのトラックバックURL

この記事へのトラックバック
はじめに 前回、ヤマト運輸の配送状況を確認勝手APIを作成してxml,yaml,jsonの形式でデータ取得できるようになったのですが、まだJSONPは未対応でした。 [WebAPI]ヤマト運輸の配送状況を確認するAPIを作ってみた で、以下のページをチェックしてみると、dankogaiがAmazonの商
dankogai作のAWS APIからJSONの仕組みを理解する(1/2)【nanoblog】at 2012年01月21日 23:57
amazonがAmazon アソシエイト Webサービスの名称を「Product...
Product Advertising API【cagylogic】at 2009年08月09日 14:05
この記事へのコメント
「仕組み」進化論、興味深く読みました。http://katagi.weblogs.jp/blog/
Posted by sarikatagi at 2010年09月11日 13:19