簡體   English   中英

亞馬遜產品廣告API簽名

[英]Amazon Product Advertising API Signature

我正在嘗試為亞馬遜產品廣告API制作一個簽名,已經花了幾個小時,我仍然得到一個403 - 任何人都可以快速查看代碼並告訴我,如果我做錯了什么嗎?

這是我用來創建簽名的功能

def create_signature(service, operation, version, search_index, keywords, associate_tag, time_stamp, access_key):
start_string = "GET\n" + \
               "webservices.amazon.com\n" + \
               "/onca/xml\n" + \
               "AWSAccessKeyId=" + access_key + \
               "&AssociateTag=" + associate_tag + \
               "&Keywords=" + keywords + \
               "&Operation=" + operation + \
               "&SearchIndex=" + search_index + \
               "&Service=" + service + \
               "&Timestamp=" + time_stamp + \
               "&Version=" + version

dig = hmac.new("MYSECRETID", msg=start_string, digestmod=hashlib.sha256).digest()
sig = urllib.quote_plus(base64.b64encode(dig).decode())

return sig;

這是我用來返回請求字符串的函數

def ProcessRequest(request_item):
    start_string = "http://webservices.amazon.com/onca/xml?" + \
                   "AWSAccessKeyId=" + request_item.access_key + \
                   "&AssociateTag=" + request_item.associate_tag + \
                   "&Keywords=" + request_item.keywords + \
                   "&Operation=" + request_item.operation + \
                   "&SearchIndex=" + request_item.search_index + \
                   "&Service=" + request_item.service + \
                   "&Timestamp=" + request_item.time_stamp + \
                   "&Version=" + request_item.version + \
                   "&Signature=" + request_item.signature
    return start_string;

這是運行代碼

_AWSAccessKeyID = "MY KEY"
_AWSSecretKey= "MY SECRET KEY"

def ProduceTimeStamp():
    time = datetime.datetime.now().isoformat()
    return time;

item = Class_Request.setup_request("AWSECommerceService", "ItemSearch", "2011-08-01", "Books", "harry%20potter", "PutYourAssociateTagHere", ProduceTimeStamp(), _AWSAccessKeyID)
item2 = Class_Request.ProcessRequest(item)

它在403處產生的示例Web請求是: -

http://webservices.amazon.com/onca/xml?AWSAccessKeyId=AKIAIY4QS5QNDAI2NFLA&AssociateTag=PutYourAssociateTagHere&Keywords=harry%20potter&Operation=ItemSearch&SearchIndex=Books&Service=AWSECommerceService&Timestamp=2015-02-26T23:53:14.330000&Version=2011-08-01&Signature=KpC%2BUsyJcw563LzIgxf7GkYI5IV6EfmC0%2FsH8LuP%2FEk%3D

還有一個名為ClassRequest的holder類,它只為每個請求字段都有一個字段

如果有人有興趣,我所遵循的指示就在這里: - http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html

我希望有人可以提供幫助,我是Python新手,有點迷失

您只需使用一種現有解決方案即可

可從PyPI獲得

要么

將您的解決方案與其中一個進行比較: https//bitbucket.org/basti/python-amazon-product-api/src/41529579819c75ff4f03bc93ea4f35137716ebf2/amazonproduct/api.py?at=default#cl-143

例如,您的時間戳看起來有點短。

再次檢查時間戳是否正確,它應該具有2015-03-27T15:10:17.000Z的格式,並且在您的示例Web請求中看起來像:2015-02-26T23:53:14.330000

嘗試鏈接的好工具是亞馬遜簽署的請求幫助程序: https//associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html

這對我有用。

$str = "Service=AWSECommerceService&Operation=ItemSearch&AWSAccessKeyId={Access Key}&Keywords=Harry%20Potter&ResponseGroup=Images%2CItemAttributes%2COffers&SearchIndex=Books&Timestamp=2019-08-11T17%3A51%3A56.000Z";


$ar = explode("&", $str);

natsort($ar);

$str = "GET
webservices.amazon.com
/onca/xml
";

$str .= implode("&", $ar); 

$str = urlencode(base64_encode(hash_hmac("sha256",$str,'{Secret Key Here}',true)));


http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&Operation=ItemSearch&AWSAccessKeyId={Access Key}&Keywords=Harry%20Potter&ResponseGroup=Images%2CItemAttributes%2COffers&SearchIndex=Books&Timestamp=2019-08-11T17%3A51%3A56.000Z&Signature=$str

請記住:如果您收到此錯誤,您的AccessKey ID未在Product Advertising API中注冊。 請使用https://affiliate-program.amazon.com/assoc_credentials/home上注冊后獲得的AccessKey ID

轉到https://affiliate-program.amazon.com/assoc_credentials/home

暫無
暫無

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

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