PythonでAmazon Product Advertising APIからデータを取得しようとして挫折した
ので、既成のプラグインにお世話になることに。→AmazonLink
どういうわけか、最初に表示したときにエラーが出ますが、リロードすれば大丈夫。記事を最初に表示するのはだいたい僕なので、特に問題はないはず。
で、Pythonで書いたほう、リクエストURLを生成する部分。PythonでAmazon Product Advertising APIを使う – 人工知能に関する断想録 を参考にさせて頂きました。
#!/usr/local/bin/python # -*- coding: utf-8 -*- import urllib, time, base64, hashlib, hmac class AmazonPAAPI: def request(self, query): scrtkey = "秘密キー" #パラメータをセット params = { 'AWSAccessKeyId' :"ユーザーID", 'ItemId' :query, 'Operation' :"ItemLookup", 'ResponseGroup' :"ItemAttributes,Images", 'Service' :"AWSECommerceService", 'Timestamp' :time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), 'Version' :"2009-10-01", 'ContentType' :"text/xml" } host = "xml-jp.amznxslt.com" path = "/onca/xml" #キーをリストにしてソート keys = params.keys() keys.sort() #一つの文字列に string = '' for k in keys: string += urllib.quote(k,'') + '=' + urllib.quote(params[k],'') + '&' #ベースと合体(最後の&は省く) req = "GETn%sn%sn%s" % (host, path, string[:-1]) #署名を生成 sig = base64.b64encode(hmac.new(scrtkey,req,hashlib.sha256).digest()) #urlエンコード sig = urllib.quote(sig,'') #合体 url = 'http://%s%s?%sSignature=%s' % (host, path, string, sig) return url
Amazon Product Advertising APIでは、ただ必要なパラメータを渡すだけじゃなく、そのパラメータと秘密鍵から計算した署名を付けなければ、結果を返してくれません。その署名を計算するためにこういう処理が必要になります。URLエンコードする際に、urllib.quote(s)
ではなく、urllib.quote(s,'')
としたのは、urllib.quote()
がエンコードしない文字として”/”(スラッシュ)を初期値で持っているからです。これをそのままにしておくと、”ContentType=text/xml”とか、”Style=http://www~”とかでxsltのアドレスを指定したときに、スラッシュがエンコードされないので、署名が承認されません。
これにXMLから情報を取得する部分を書き足して、PHPでinclude(amazon.py?q=479733665X)
とかやって記事に埋め込もうと思っていたのですが、タイトルの通り挫折。ローカルのPython2.6ではちゃんと動いたのですが、XREAのサーバーにインストールされているPython(2.4.2)が古くて動きませんでした。せめて2.5.xにして欲しい……。