簡體   English   中英

對亞馬遜 MWS API 的 Python HTTP POST 請求

[英]Python HTTP POST Request to Amazon MWS API

我沒有太多處理 API 的經驗,而且在使用 Python 發出 HTTP POST 請求方面還很陌生。 想知道是否有人可以幫我解決這個問題。

他們提供了這個工具來手動訪問數據,但我希望使用 Python 的請求庫來實現自動化。 插入必要的信息,我得到這個作為 HTTP POST:

POST /Products/2011-10-01?AWSAccessKeyId=AKIAJEHA562QWNAIEIKA
  &Action=GetLowestOfferListingsForASIN
  &SellerId=<removed>
  &MWSAuthToken=<removed>
  &SignatureVersion=2
  &Timestamp=2016-01-06T04%3A20%3A48Z
  &Version=2011-10-01
  &Signature=7vP5dwgpk%2Bi%2Bl1L9tOsd7tVXDeQOoyvjR2fYtEhJCEY%3D
  &SignatureMethod=HmacSHA256
  &MarketplaceId=<removed>
  &ASINList.ASIN.1=B00GQLLCTA HTTP/1.1
Host: mws.amazonservices.com
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript)
Content-Type: text/xml

它還吐出一個 POST URL,我想我可以用它來提取我需要的數據,但是當我把它扔到我的瀏覽器中時我得到了這個:

Sender InvalidParameterValue Action 或 Operation 查詢參數必須存在。

我將如何使用 Python 發送同樣的請求?

任何幫助將不勝感激!

謝謝

編輯:

到目前為止,我已經嘗試通過發布請求傳遞以下字典,其中包含暫存器工具中顯示的所有參數:

params = {
    'AWSAccessKeyId':'<removed>',
    'Action':'GetMyPriceForASIN',
    'SellerId':'<removed>',
    'MWSAuthToken':'amzn.mws.fca4aee8-689d-74a2-5430-128d34f56873',
    'SignatureVersion':'2',
    'Timestamp':'2016-01-06T04%3A09%3A24Z',
    'Version': '2011-10-01',
    'Signature':'TZX1AP3dwl%2Fy3y5RLjZGorZFVLtQvW40KJ3IrTmWrw0%3D',
    'SignatureMethod':'HmacSHA256',
    'MarketplaceId':'<removed>',
    'ASINList.ASIN.1':'B004KZQVF4'
    }

page = requests.post("https://mws.amazonservices.com", params=params)

不過,我收到一條帶有此消息的 404:

在此服務器上找不到資源 /。 API 部分丟失或您提供了無效的操作名稱。

簡短回答:

假設您可以使用 HTTP GET 使其工作並希望它使用 HTTP POST,則您的 URL 應該僅為/Products/2011-10-01 省略問號並將 URL 的其余部分(即AWSAccessKeyId=及其后的所有內容)放入 POST 請求的正文中。 添加值為application/x-www-form-urlencodedContent-Type標頭。

長答案:

我剛剛遇到了同樣的問題(我不知道如何讓 POST 正常工作)。 我嘗試使用GetMyFeesEstimate API 調用一次估算 20 個 ASIN 的費用。 使用 HTTP GET 我收到錯誤 414(請求 URI 太大),所以我決定嘗試讓 HTTP POST 工作。

MWS 文檔僅指出“查詢請求是簡單的 HTTP 請求,分別在 URL 或 HTTP 正文中使用帶有查詢參數的 GET 或 POST 方法”,但不清楚具體如何執行此操作。

我在 Amazon SQS 文檔中找到了更多詳細信息,展示了如何在正文中構造帶有查詢參數的 POST 請求。 它希望對它們進行形式 URL 編碼,但我發現只是獲取我的 GET 請求的 URL 並將其放入請求正文(如上所述)對我有用(所以編碼可能是兼容的,沒有仔細檢查) .

nonagon 的答案有效,但請注意,您必須將 POST 正文作為字符串發送,而不是字典(注意Content-Typeapplication/x-www-form-urlencoded ,而不是application/json

所以你的 POST 正文應該是這樣的:

AWSAccessKeyId=AKIAJEHA562QWNAIEIKA
&Action=GetLowestOfferListingsForASIN
&SellerId=<removed>
&MWSAuthToken=<removed>
&SignatureVersion=2
&Timestamp=2016-01-06T04%3A20%3A48Z
&Version=2011-10-01
&Signature=7vP5dwgpk%2Bi%2Bl1L9tOsd7tVXDeQOoyvjR2fYtEhJCEY%3D
&SignatureMethod=HmacSHA256
&MarketplaceId=<removed>
&ASINList.ASIN.1=B00GQLLCTA

完整的蟒蛇代碼:

url = 'https://mws.amazonservices.jp/Products/2011-10-01'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = <The big string above>

res = requests.post(url, data=body, headers=headers)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM