Python + Amazon = Pyzon

詳しい使い方はこちら⇒PythonでProduct Advertising APIにリクエストを送信するためのモジュール - SELECT * FROM life;

初めてgithubにコミットして興奮冷めやらぬyuku_tです^^(用語の使い方間違ってるかも知れません・・・汗)

バイト先がバージョン管理システムというものを使わない所なので特に気にもしていなかったのですが、id:hat-tun「それは危険過ぎる!」と驚かれてから、バージョン管理システムに手を出してみたいなと思っていたのです。
今までも事有る毎に"svn checkout http://〜"みたいな「魔法の合言葉」を盲目的に実行しては来たけれど、正直何をしているのかチンプンカンプン。
これじゃまずい。時代に取り残されてしまう。

という訳で、githubにリポジトリを作成してPythonモジュールを公開してみることに。
githubの説明に従って、gitをインストールして公開鍵と秘密鍵を生成し・・・

そんなこんなで、Pyzonっていうモジュールを公開してみました

taka84u9/Pyzon · GitHub

PythonProduct Advertising API(Amazon)にアクセスするためのモジュールだからPyzon。安直なネーミングだけど個人的には気に入っているのです。

せっかくなので、簡単な使い方の例を

>>> from Pyzon import Pyzon # Pyzonモジュールをインポート
>>> access_key_id = 'your_access_key_id' # Amazon Web ServiceのAccess Key ID
>>> secret_access_key = 'your_secret_access_key' # Amazon Web ServiceのSecret Access Key
>>> associate_tag = 'your_associate_tag-22' # Associate Tag。省略可能。
>>> pyzon = Pyzon(access_key_id, secret_access_key, associate_tag)
>>> pyzon.setLocale('JP') # 日本のAmazonにアクセス
>>> xml = pyzon.ItemSearch(search_index='Books', Keywords='python') # 返り値は、RESTリクエストへのレスポンスをそのまま返す。
>>> minidom.parseString(xml) # 例えばminidomでパースしてデータを用いる。

ちなみに、8月中旬からProduct Advertising APIでは署名を付与しなきゃいけなくなりますが、それにも対応しています。
署名の作成とかは_buildUrlメソッドの中で行っています。

def _buildUrl(self, params):
    """Builds a URL
    """
    params['Service'] = 'AWSECommerceSerivce'
    params['AWSAccessKeyId'] = self.getAccessKeyID()
    if self._associate_tag is not None:
        params['AssociateTag'] = self._associate_tag

    params['Version'] = self._version
    params['Timestamp'] = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
    sorted_params = sorted(params.items())
    req_list = []
    for p in sorted_params:
        pair = "%s=%s" % (p[0], urllib2.quote(p[1].encode('utf-8')))
        req_list.append(pair)
    urlencoded_reqs = '&'.join(req_list)
    string_to_sign = "GET\n%s\n/onca/xml\n%s" % (self._urlhost, urlencoded_reqs)
    # ここで暗号化↓
    hmac_digest = hmac.new(self._secret_access_key, string_to_sign, hashlib.sha256).digest()
    base64_encoded = base64.b64encode(hmac_digest)
    signature = urllib2.quote(base64_encoded)
    url = "http://%s/onca/xml?%s" % (self._urlhost, urlencoded_reqs)
    return url

翻訳学習法?

このPythonモジュールの元ネタはPHPPEARに入っているServices_Amazonっていうやつです。こいつを単純にPythonコードに変換しただけという。もちろん、PEARの方はちゃんとxmlをパースしてもっと使いやすいものにしてくれるんですがね。

今回、PHPのコードをPythonに直すってことをしていて思ったんだが、これって結構いいプログラミングの勉強になるんじゃなかろうか。
もちろん、PHPに適した書き方、Pythonに適した書き方、みたいなプログラミング作法を学ぶには同じ言語のソースを読まなきゃいけないんだろうけど、こうやって翻訳するっていう作業もあながち侮れないな!と思いました。