2010年5月1日土曜日

GAE Python AWS:レスポンスが返ってきた

 最初に参考にしたページが AWS 用のモジュールだったのだが、Product Advertising API 用ではなかったことに気が付かずだいぶ時間を取られてしまう。AWS って妙に奥が深そうでよくわからない (^^;

 こちらこちらのページ、そしてそこからたどり着いたこちらのページ(Signed Requests Helper)を見ながら cut & try を繰り返して何とかレスポンスが返ってくるようになった。

 ちなみに変更後のソースはこんな感じ。
import os,hashlib,hmac,base64,time,urllib
import xml.dom.minidom

akey = 'xxx'
skey = 'yyy'
def get_url(params, host, path):
'''return signatured rest request url.
For detail, see http://docs.amazonwebservices.com/AmazonSimpleDB/2009-04-15/DeveloperGuide/index.html?REST_RESTAuth.html'''

# first sort the keys alphabetically
keys = params.keys()
keys.sort()

# then construct query string 'key1=val1&key2=val2...'
pairs = []
for key in keys:
val = str( params[key] )
pairs.append( urllib.quote(key, safe='') + '=' + urllib.quote(val, safe='-_~') )
qs = '&'.join(pairs)

# now we get what to sign.
target = 'GET\n%s\n%s\n%s' % (host, path, qs)
sig = base64.b64encode(hmac.new(skey,target,hashlib.sha256).digest())
# url = "https://%s/?%s&Signature=%s" % (host, qs, urllib.quote(sig) )
url = "http://%s%s?%s&Signature=%s" % (host,path, qs, urllib.quote(sig) )
return url

def aws_test(url):
param = {}
param['AWSAccessKeyId'] = akey
param['Service'] = "AWSECommerceService"
param['Version'] = '2009-03-31'
param['Operation'] = 'ItemSearch'
param['SearchIndex'] = 'Books'
param['Keywords'] = 'harry+potter'
param['AssociateTag'] = 'kennik-22'
param['Timestamp'] = '2010-05-01T12:00:00Z'


url = get_url(param, url, '/onca/xml')
res = urllib.urlopen(url).read()

return res
 署名の付け方のドキュメントはこちら

0 件のコメント:

コメントを投稿