さんまがおいしい季節だねー(´・ω・`)

Amazon Product Advertising API で認証付きリクエストの動作を確認してみますた

Amazon,Python — タグ: , — さくら @ 2009/05/11 2:23

さくらです♡こんばんわ☆彡

今日は5月11日…そう!
AWS ユーザー界を騒がせてるパアピ!パアピ!がサービスインする日なの!!
(パアピ!パアピ!は Product Advertising API の愛称よ。詳しくは [を] アマゾンAPIを使うのに2009年8月15日から認証が必要になるらしい を見てね。)

さくらも早速パアピ!パアピ!を試してみたわ!!
ところで5月11日って +0900 での話なのかしら…午前0時に動作確認する意味って無かったんじゃない?www

とりあえず参考にさせてもらったのは以下のサイトね。
ところでダンコーガイさんって AWS で何か作ってるのかしら?

さくらもアルファブロガーに習って Python のコード片貼っつけとくわね。
実際にこのコードで動作確認してるわよ。

import base64
import hashlib
import hmac
import time
import urllib

RFC3986_SAFE = '^A-Za-z0-9\-_.~'

def sign_aws_request_url(seckey, args, host='www.amazon.com'):
    if not args.has_key('Service'):
        args['Service'] = 'AWSECommerceService'
    if not args.has_key('Timestamp'):
        args['Timestamp'] = time.strftime('%Y-%m-%dT%H:%M:%SZ',
                                          time.gmtime())
    if not args.has_key('Version'):
        args['Version'] = '2009-01-06'

    paramkeys = args.keys()
    paramkeys.sort()
    first = True
    params = ''
    for i in paramkeys:
        if first:
            first = False
        else:
            params += '&'
        if isinstance(i, unicode):
            params += urllib.quote(i.encode('utf8'), RFC3986_SAFE)
        else:
            params += urllib.quote(str(i), RFC3986_SAFE)
        params += '='
        if isinstance(args[i], unicode):
            params += urllib.quote(args[i].encode('utf8'), RFC3986_SAFE)
        else:
            params += urllib.quote(str(args[i]), RFC3986_SAFE)

    data = 'GET\n%s\n/onca/xml\n%s' % (host, params)
    sign = base64.standard_b64encode(
            hmac.new(seckey, data, digestmod=hashlib.sha256).digest())
    return ('http://%s/onca/xml?%s&Signature=%s' %
            (host, params, urllib.quote(sign, RFC3986_SAFE)))

sign_aws_request_url 関数は、AWS の Secret Access Key、リクエストパラメータの辞書、リクエスト先ホスト名を引数として呼び出すと、認証キー付きの REST 用 URL を返すの。
細かい説明は面倒だからいつもどおりパスねww

適当にコピペして使ってもらって構わないわよ。
ライセンスとか気になる人には MIT ライセンスだと言っとくわ。
あと面倒だからおっパイパイには入れてないわよwww

以下は sign_aws_request_url 関数の使用例よ。

import urllib

url = sign_aws_request_url(SECRET_ACCESS_KEY, {
    'AWSAccessKeyId':ACCESS_KEY_ID,
    'ItemId':'0679722769',
    'Operation':'ItemLookup',
    'ResponseGroup':'ItemAttributes,Offers,Images,Reviews'
}, 'webservices.amazon.co.jp')
print url

fh = urllib.urlopen(url)
print fh.read()
fh.close()

こんな感じで呼び出すと、リクエストに使った URL とレスポンスを表示するわ。
もちろん SECRET_ACCESS_KEY と ACCESS_KEY_ID にはアナタのやつをちゃんと設定してね。
このサンプル使って webservices.amazon.com と webservices.amazon.co.jp 宛てにリクエスト投げてみたけど、ちゃんと動いてるわよ。

レスポンス自体は対応前とほとんど一緒だから貼っつけたりするのは省略するわね。
その代わりと言ったらなんだけど、
サンプルコードだけ動かすのもアレなんで、
AZlinkAZlink +trends をパアピ!パアピ! に
対応させたわよ!

対応させるかどうか見合わせてる人は、さくらのサービスがいつコケるか観察しとけばいいんじゃない?

さくら

P.S. 最初にこの記事アップしたとき、sign_aws_request_url 関数の URL エンコードしながらパラメータ連結してる箇所を下のような感じで書いてたんだけど、params に unicode 渡すとおかしなことになってたから書き直したの。ごめんあそばせ!!

    paramkeys = args.keys()
    paramkeys.sort()
    params = '&'.join(['%s=%s' % (urllib.quote(i, RFC3986_SAFE),
                                  urllib.quote(args[i], RFC3986_SAFE))
                       for i in paramkeys])


最初に記事をアップしたのが2時半前で、書き直したのが5時前だから、たぶん書かなきゃ分かんないと思うんだけどね。
正直者のさくらもかわいいでしょっ!!

0 Comments »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2017 さくらたんどっとびーず | powered by WordPress with Barecity