

Amazon MWSを使用してプログラムを作成しようとしています。  
こちらの仕様書を見て実装していますが、何か抜けている状態です。

<http://docs.developer.amazonservices.com/ja_JP/dev_guide/DG_ClientLibraries.html>

[code]

    # -*- coding:utf-8 -*-
    from time import strftime, gmtime
    from requests import request
    import base64
    import hashlib
    import hmac
    import urllib.parse
    
    param = {
        'AWSAccessKeyId': 'xxxx',
        'Action': 'ListMatchingProducts',
        'SellerId': 'xxxx',
        'SignatureMethod': 'HmacSHA256',
        'SignatureVersion': '2',
        'Timestamp': strftime("%Y-%m-%dT%H:%M:%SZ", gmtime()),
        'Version': '2011-10-01',
        'Query': "harrypotter"
    }
    
    data = "POST\nmws.amazonservices.jp\nProducts/2011-10-01\n/"
    format_param = "&".join(['{0}={1}'.format(key, urllib.parse.quote(param[key], safe='-_.~').encode('utf-8')) for key in sorted(param)])
    before_sign_data = "{0}{1}".format(data, format_param)
    hmacstr = hmac.new(b"secretKey", bytes(before_sign_data.encode('UTF-8')), hashlib.sha256).digest()
    base64str = base64.b64encode(hmacstr)
    
    url = "{0}{1}?{2}&Signature={3}".format("https://mws.amazonservices.jp", "/Products/2011-10-01", format_param, urllib.parse.quote(base64str))
    headers = {'User-Agent': 'python-app-mws/0.0.1 (Language=Python)'}
    response = request("POST", url_param, data={}, headers=headers)
    data = response.content
    
    print(data)
    
[/code]

実行時のエラーは、以下になります。

[code]

    b'<?xml version="1.0"?>\n<ErrorResponse xmlns="https://mws.amazonservices.com/">\n  <Error>\n    <Type>Sender</Type>\n    <Code>InvalidParameterValue</Code>\n    <Message>Value b&apos;2&apos; for parameter SignatureVersion is invalid.</Message>\n  </Error>\n  <RequestID>6e29a554-c2d2-4b23-9f99-276aa250d239</RequestID>\n</ErrorResponse>\n'
    
[/code]

送信時のURLは、以下のようになっていました。

[code]

    https://mws.amazonservices.jp/Products/2011-10-01?AWSAccessKeyId=b'xxxxx'&Action=b'ListMatchingProducts'&Query=b'harry%20potter'&SellerId=b'xxxxx'&SignatureMethod=b'HmacSHA256'&SignatureVersion=b'2'&Timestamp=b'2017-03-07T15%3A22%3A32Z'&Version=b'2011-10-01'&Signature=v/lujNiPl8NZTkWmDQXRsAfhiX1GTLOOE7erK26QHDA%3D
    
[/code]

何かお気づきのところあれば、教えて頂けれたら幸いです。


CC BY-SA 4.0
2017-03-07T15:26:11.503
33172
2020-07-23T11:49:50.890
2020-07-23T11:49:50.890
3060
20924
question
python amazon-mws
Amazon MWSのAPIをコールしても InvalidParameterValue エラーが返ってきてしまう


> Value b'2' for parameter SignatureVersion is invalid.

`SignatureVersion` の値「`b'2'`」が不正と言ってますね。

URLのGETパラメータの値が「b'...'」となっているのが原因ではないでしょうか。  
`&SignatureVersion=2` と変えたら変化があると思います。

参照されてるドキュメントの「URLを作成する」に書かれてる例と見比べてみてください。


CC BY-SA 3.0
2017-03-23T07:37:57.277
33488
2017-03-23T07:37:57.277
5008
33172
answer


`format_param` を作っているところで、`.encode('utf-8')` を外すと、うまくいきそうに見えます。

[code]

    format_param = "&".join(['{0}={1}'.format(key, urllib.parse.quote(param[key], safe='-_.~')) for key in sorted(param)])
    
[/code]

python には詳しくありませんが、これでは何か問題があるのでしょうか。


CC BY-SA 3.0
2017-03-23T14:02:10.573
33493
2017-03-23T14:02:10.573
5288
33172
answer