2015-02-26 20 views
5

Ich versuche, eine Signatur für das Amazon Product Advertising API zu produzieren, war es ein paar Stunden und bin immer noch ein 403 immer - könnte jemand einen kurzen Blick auf den Code haben und mir sagen, ob ich bin etwas falsch machen bitte?Amazon Product Advertising API Signature

Dies ist die Funktion, die ich verwende, um die Signatur

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; 

Und dies ist die Funktion, die ich die Zeichenfolge für die Anforderung

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; 

Und das ist der Lauf-Code zurück zum Erstellen

_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) 

Ein Beispiel Web-Anfrage, dass bei 403 erzeugt ausspuckt, ist dies: -

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 

Es gibt auch einen Halter Klasse ClassRequest genannt, die nur ein Feld für jedes Anforderungsfeld hat

Die Anweisungen, die ich hier gefolgt sind, wenn jemand Interesse geweckt wird: - http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html

Ich hoffe jemand kann helfen , ich bin neu in Python und ein wenig verloren

Antwort

Verwandte Themen