ありがとう、たださん。

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

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

Synopsis

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

XML
//api.dan.co.jp/asin/4534045220.xml
YAML
//api.dan.co.jp/asin/4534045220.yml
JSONP
//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 (typeof json !== 'object') {
        return;
    }else if( 'length' in json){
        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 = '//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){
    /* console.log(json); */
    $('amazon.attr').innerHTML = '';
    if ('Error' in json){
        $('amazon.attr').appendChild(json2list(json));
        return;
    }
    $('amazon.link').href = '//www.amazon.co.jp/gp/product/' + json.ASIN
      + '?ie=UTF8&linkCode=as2tag=blogsofdankog-22';
    if (json.Images){
       $('amazon.img').src = json.Images.Primary.Medium.URL;
    }else{
       $('amazon.img').src = '//ec1.images-amazon.com/'
         + 'images/G/09/nav2/dp/no-image-no-ciu._AA128_.gif';
    }
    $('amazon.attr').appendChild(json2list(json));
  }
};

(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