I'm trying to create a signature for the Amazon ad advertising API, it had a few hours, and I still get 403 - could someone take a quick look at the code and tell me that I'm doing something wrong?
This is the function that I use to create a signature.
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;
And this is the function I use to return the string for the query
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;
And this is the startup code
_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)
An example of a web request that he spits out that produces at 403 is this: -
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
There is also a class owner class ClassRequest, which has only a field for each request field
The instructions that I followed are here if anyone is interested: - http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html
I hope someone can help, I'm new to Python and lost a little