めも帖

「めも帖」代わりにダラダラと書いていったり、めもしたりしているだけです。

PythonでAmazonのProduct Advertising APIを利用する

正直、「PythonでAmazon Product Advertising APIを使う - 人工知能に関する断創録」や、「無題メモランダム: Amazon Product Advertising APIの署名認証をPythonでやってみる」を読んでいただくのが一番にいいと思います。
ただ、XMLのパースがこのままだと、GAEで上手くできないので(方法があるのかもしれないのですが)、xml.etree.ElementTreeにて分解してみました。ポイントは、名前空間を利用しているところでしょうか...

それにしても、AmazonのAPIも知らない間に認証方法が複雑になったり、名称が変わっていたり、ドキュメント(Product Advertising API)もなにやら変わっていたり。

ソース

ちなみに、お米の情報が取れます...

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib, urllib2
import hashlib, hmac
import base64
import time
import re
from xml.etree.ElementTree import *

class Amazon():
	amazonUrl = 'http://webservices.amazon.co.jp/onca/xml'
	accessKey = 'xxxxxxxx'
	secretKey = 'xxxxxxxx'
	associate = 'xxxxxxxx'

	def __init__(self):
		return

	def buildURL(self, params):
		params["Service"]        = "AWSECommerceService"
		params["AWSAccessKeyId"] = self.accessKey
		params["AssociateTag"]   = self.associate
		params["Timestamp"]      = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
		params = sorted(params.items())	

		request = []
		for p in params:
			pair = "%s=%s" % (p[0], urllib2.quote(p[1].encode("utf-8")))
			request.append(pair)

		message        = "GET\nwebservices.amazon.co.jp\n/onca/xml\n%s" % ("&".join(request))
		hmac_digest    = hmac.new(self.secretKey, message, hashlib.sha256).digest()
		base64_encoded = base64.b64encode(hmac_digest)
		signature      = urllib2.quote(base64_encoded)
		request.append("Signature=%s" % signature)
		url = self.amazonUrl + "?" + "&".join(request)
		return url

	def sendRequest(self, params):
		self.url = self.buildURL(params)
		opener   = urllib2.build_opener()
		return opener.open(self.url).read()

	def item(self, itemId):
		params = {}
		params["Operation"] = "ItemLookup"
		params["ItemId"]    = itemId
		return self.sendRequest(params)

amazon = Amazon()
xmlString = amazon.item('B00406BGUI')
xml       = fromstring(xmlString)

namespace_url = 'http://webservices.amazon.com/AWSECommerceService/2005-10-05'
namespace     = '{' + namespace_url + '}'

title = xml.getiterator(namespace+'Title')
print title[0].text