2016-04-27 31 views
1

我用R來使亞馬遜MWS API的調用,並出現以下錯誤:用R來使亞馬遜MWS API調用

The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

post幫了我很多與商品廣告API。但是,我似乎無法讓它在MWS方面發揮作用。

這裏是我的代碼:

library(digest) 
library(RCurl) 

base.html.string <- "https://mws.amazonservices.com/Products/2011-10-01?" 

SellerID <- 'A2UZXXXXXXXXXX' 
MWSAuthToken <- 'ATVPXXXXXXXXX' 
MarketplaceID <- 'ATVPXXXXXXXXX' 
AWSAccessKeyId <- 'AKIAXXXXXXXXXXXXXXXX' 
AWSsecretkey <- 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 
ActionType <- 'GetMyPriceForASIN' 
version.request = '2011-10-01' 
ASINList.ASIN.1 <- 'B00XXXXXXX' 

pb.txt <- Sys.time() 

pb.date <- as.POSIXct(pb.txt, tz = Sys.timezone) 

Timestamp = strtrim(format(pb.date, tz = "GMT", usetz = FALSE, "%Y-%m-%dT%H:%M:%SZ"), 24) 

str = paste('POST\nmws.amazonservices.com\n/Products/2011-10-01\n', 
      'ASINList.ASIN.1=', ASINList.ASIN.1, 
      '&AWSAccessKeyId=', AWSAccessKeyId, 
      '&Action=', ActionType, 
      '&MWSAuthToken=', MWSAuthToken, 
      '&MarketplaceId=', MarketplaceID, 
      '&SellerId=', SellerID, 
      '&SignatureMethod=HmacSHA256', 
      '&SignatureVersion=2', 
      '&Timestamp=', gsub('%2E','.',gsub('%2D', '-', curlEscape(Timestamp))), 
      '&Version=', version.request, 
      sep = '') 

## signature test 
Signature = curlEscape(base64(hmac(enc2utf8(AWSsecretkey), enc2utf8(str), algo = 'sha256', serialize = FALSE, raw = TRUE))) 


AmazonURL <- paste(base.html.string, 
        'ASINList.ASIN.1=', ASINList.ASIN.1, 
        '&AWSAccessKeyId=', AWSAccessKeyId, 
        '&Action=', ActionType, 
        '&MWSAuthToken=', MWSAuthToken, 
        '&MarketplaceId=', MarketplaceID, 
        '&SellerId=', SellerID, 
        '&SignatureMethod=HmacSHA256', 
        '&SignatureVersion=2', 
        '&Timestamp=', Timestamp, 
        '&Version=', version.request, 
        '&Signature=', Signature, 
        sep = '') 

AmazonResult <- getURL(AmazonURL) 

我使用亞馬遜MWS便籤,並確保我的字符串標配。

我的密鑰確實包含+,但我認爲編碼會解決這個問題。

任何幫助,將不勝感激!

回答

0

看完這個post後我發現我的問題。我從字面上理解了Amazon的例子,並使用POST而不是GET。我也用我的時間戳計算進行了不必要的調整,我也修正了這個問題。希望這可以幫助那些在路上的人。

+1

嗨,你能更詳細地解釋你的方法嗎?我的代碼中出現「請求時間戳太遠」錯誤(POST更改爲GET) – michaelsinner