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