SOAPpyでAmazonにアクセス その2¶
SOAPpyでAmazonにアクセス の続き。
とりあえず分かったのは、提供されているメソッドに対して渡すパラメータはキーワード引数ではなく辞書で渡す必要があると言うこと。前回の記事のあとキーワード引数でなんどか試していて、正しそうなRequestが出ているもののレスポンスがエラーばっかりだった。
この違いはSOAPpyのドキュメントを読んでいてもなかなか気づかなかった。よくよく読むと SOAPpy-0.12.0/docs/MethodParameterNaming.txt に言及があるんだけど、自分は以下のサイトのコードを参考にしてやっと気づきましたよ。
実際にやってみると、キーワード引数の場合は以下のようにエラーになる。
>>> from SOAPpy import WSDL
>>> proxy = WSDL.Proxy('http://soap.amazon.com/schemas3/AmazonWebServices.wsdl')
>>> results = proxy.KeywordSearchRequest(keyword='python',
... page='1',
... mode='books-jp',
... locale='jp',
... type='lite',
... tag='freiaweb-22',
... devtag='D2XXXXXXXXXXX')
...
Traceback...
...
SOAPpy.Types.faultType: <Fault SOAP-ENV:Client: We encountered an error at
our end while processing your request. Please try again
: The request contains an invalid SOAP body.>
>>>
以下は辞書渡しにしたらうまくいった例。
>>> from SOAPpy import WSDL
>>> proxy = WSDL.Proxy('http://soap.amazon.com/schemas3/AmazonWebServices.wsdl')
>>> results = proxy.KeywordSearchRequest(dict(keyword='python',
... page='1',
... mode='books-jp',
... locale='jp',
... type='lite',
... tag='freiaweb-22',
... devtag='D2XXXXXXXXXXX'))
...
>>> results.TotalPages
'3'
>>> results.TotalResults
'27'
>>> book0 = results.Details[0]
>>> book0.Asin
'4797341815'
>>> book0.ProductName
u'\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\xe3\x81\xaePython Web\xe3\x82\xa2\xe3
\x83\x97\xe3\x83\xaa\xe7\xb7\xa8 [\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\xe3
\x81\xae\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xba]'
ここで、ProductNameがへんな事になっている。中身はutf-8なのにu'...'になっていてうまく扱うことができない。とりあえず以下のようにして表示。
>>> print ''.join([chr(ord(x)) for x in book0.ProductName]).decode('utf-8')
みんなのPython Webアプリ編 [みんなのシリーズ]
はて、コレを直すにはどうすればよいのだろうか...。SOAPpyが xml.sax でparseするときに正しくなるようにする方法があるのかなあ。
ところで、proxy.KeywordSearchRequestはうまくいくようになったけど、proxy.AsinSearchRequestはまだうまくいかない。何故だ!?