Amazon-API mit Signatur verwenden
Vorwort
Amazon stellt mit seiner API eine Schnittstelle zur Verfügung, mit der man sehr einfach auf alle vorhandenen Artikeldaten zugreifen kann. Diese API wird bevorzugt von Amazon-Partnern verwendet, die von Amazon eine Provision für jeden über sie verkauften Artikel erhalten. So hat jeder was von der API: Amazon und Ihre Partner.
Doch genug der Einführung, worum geht es hier genau?
Amazon hat in den letzten Tagen per E-Mail eine Umbenennung der API bekannt gegeben. Die API lief bisher unter dem Namen "Amazon Associates Web Service" und wird ab jetzt "Product Advertising API" genannt. Dies soll stärker zum Ausdruck bringen, dass diese API zum Bewerben von Amazon-Artikeln dienen soll. Um diesen Zweck noch ein mal Nachdruck zu verleihen, wird auch für die Verwendung der API die Authentifizierung über eine Signatur eingeführt. D.h. ohne einen gültigen Schlüssel ist die Verwendung der API nicht mehr möglich.
Für diese Änderungen gibt es eine Übergangsphase vom 11.05.2009 bis zum 15.08.2009. Ab dem 15.08.2009 sind Daten ohne gültige Signatur über die API nicht mehr abrufbar. Diese Übergangsphase ist insofern wichtig, da alle bisherigen Mashups bzw. Anwendungen, die diese API verwenden angepasst werden müssen. In diesem Tutorial sollen die notwendigen neuen Schritte zum Erhalt der benötigten Daten ein bisschen näher durchleuchtet werden, so dass der Schritt zu einer weiterhin funktionierenden Amazon-Anwendung vereinfacht werden soll. Vorab möchte ich mich bei Ulrich Mierendorff bedanken, der auf seiner Seite eine mögliche Umsetzung des signierten Abrufs von Daten über die Amazon-API in PHP vorstellt. Hier soll das Ganze nochmal auf deutsch ein bisschen genauer beschrieben werden.
Voraussetzungen
- PHP Grundlagenwissen
- HTML Grundlagenwissen
Vorbereitungen
- Es wird ein AWS-Account (AWS = Amazon Web Services) benötigt, der für die Verwendung der Product Advertising API kostenlos ist.
- Mit diesem AWS-Account kann hier ein Zugangsschlüssel-Paar generiert werden.
Ein bisschen Theorie vorab
Amazon beschreibt in der Dokumentation welche Schritte für einen signierten Aufruf notwendig sind:
- Ein "kanonisierter", also ein normalisierter Abfrage-String muss erstellt werden. Dieser muss:
- die Parameter alphabetisch sortiert haben
- die Parameter und die entsprechenden Werte nach bestimmten Regeln codiert haben
- die Parameter und die entsprechenden Werte jeweils durch ein Gleichheitszeichen ("=") getrennt haben
- die Parameter-Wert-Paare durch ein kaufmännisches Und ("&") getrennt haben
- Dieser Abfrage-String wird in Verbindung mit der Abruf-Methode, des Hosts und der URI zu einem Gesamt-Abfrage-String zusammengesetzt.
- Dieser Gesamt-Abfrage-String wird mit SHA256 und dem Zugangsschlüssel verschlüsselt.
- Der verschlüsselte String muss mit Base64 kodiert werden.
- Das Ergebnis wird als Wert für den Parameter "Signature" an die bisher gewohnt Abruf-URL angehangen.
Das klingt alles sehr theoretisch. Diese Beschreibung hilft aber beim Verständnis des ganzen Vorgehens hier.
Jetzt wird es interessant: Die Praxis
Wie schon erwähnt, hat Ulrich Mierendorff eine sehr schöne Funktion entwickelt, die genau diese gerade beschriebenen Schritte durchführt. Die vollständige Funktion findet Ihr hier. Nachfolgend eine kurze Beschreibung dieser Funktion anhand eines praktischen Beispiel.
Das Beispiel
Wir wollen das Bild und den Titel eines bestimmten Artikels erhalten und ausgeben. In diesem Fall ist uns die ASIN (=Amazon Standard Identification Number) bekannt. Dies ist normalerweise nicht der Fall, aber hier geht es ja primär darum, die Signatur einzusetzen.Die Umsetzung
Zunächst einmal definieren wir ein paar Variablen:
$method = "GET"; $host = "ecs.amazonaws.de"; $uri = "/onca/xml"; $public_key = "XXXXXX"; $private_key = "YYYYYY";
"XXXXXX" und "YYYYYY" müsst Ihr natürlich mit Euren Zugangsschlüsseln ersetzen. Jetzt werden die Parameter für die Abfrage definiert:
$params["Service"] = "AWSECommerceService"; $params["AWSAccessKeyId"] = $public_key; // GMT timestamp $params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z"); // API version $params["Version"] = "2009-03-31"; $params["Operation"] = "ItemLookup"; $params["ResponseGroup"] = "Large"; $params["ItemId"] = "3836401126";
Diese Parameter müssen nun sortiert werden:
ksort($params);
Den normalisierten String erhalten wir mit folgender Schleife:
$canonicalized_query = array(); foreach ($params as $param=>$value) { $param = str_replace("%7E", "~", rawurlencode($param)); $value = str_replace("%7E", "~", rawurlencode($value)); $canonicalized_query[] = $param."=".$value; } $canonicalized_query = implode("&", $canonicalized_query);
Der zu verschlüsselnde String wird jetzt zusammengesetzt, verschlüsselt und kodiert:
$string_to_sign = $method."\n".$host."\n".$uri."\n".$canonicalized_query; $signature = base64_encode(hash_hmac("sha256", $string_to_sign, $private_key, true)); $signature = str_replace("%7E", "~", rawurlencode($signature));
Diese verschlüsselte String wird nun als Parameter an die Abfrage gehangen:
$request = "http://".$host.$uri."?".$canonicalized_query."&Signature=".$signature;
Mit Hilfe dieses String können die Daten nun abgerufen werden:
//XML-Datei abrufen $xmlItemResult = simplexml_load_file($request); //Titel abrufen $myTitle = $xmlItemResult->Items->Item->ItemAttributes->Title; //Daten zum Bild abrufen $myImage = $xmlItemResult->Items->Item->MediumImage->URL;
Mit den erhaltenen Daten können wir nun unsere Ausgabe formen:
echo "<img src='".$myImage."' title='".$myTitle."' />";
Was dann so aussehen sollte:
Das vollständige Skript findet Ihr als vorgefertigte Funktion hier.
Vorteile
Amazon will durch den Einsatz einer Signatur die Fremdverwendung der API vermeiden. So sollen die Daten, die über die API abgerufen werden können, wirklich nur für die Bewerbung von Amazon-Artikeln verwendet werden. Dies ist zunächst einmal nur ein Vorteil für Amazon, kann aber als Folge-Effekt dazu führen, dass die API weiterhin kostenlos zur Verfügung gestellt wird.Nachteile
Durch die Einführung der Signatur für die Verwendung der API ergibt sich das Problem, dass bestimmte Arten von Anwendungen nicht mehr verteilt werden können. So ist es z.B. nicht mehr so einfach möglich ein Open-Source-Script zu entwickeln und zur freien Verwendung freizugeben, da jeder, der er benutzen möchte, noch zusätzlich einen AWS-Account beantragen muss. Eine etwas extremerer Fall ist z.B. die Programmierung einer Extension für Firefox. Da Amazon es nicht erlaubt den Zugangsschlüssel öffentlich bekannt zu machen, ist die Programmierung einer solchen Extension überhaupt nicht mehr möglich, da die Hürden (sich bei AWS anzumelden) für einen "normalen" Endanwender zu hoch sind.
Links
Info-Box:
Kategorie(n): Tutorial
Sonstiges: Trackback, RSS 2.0.

AgentSmith schrieb:
Montag 11. Mai 2009 um 23:01
Feinfein, Danke! Heute hab ich erfahren, dass dieses Wochenende an der Uni sogenanntes “Weekend of code” ist, wo sich lauter Irre drei Tage im Rechnerraum einsperren, um konzentriert an kleinen Projekten zu basteln. Ich bin sehr versucht, hinzugehen und meine Idee umzusetzen.
Chrisostomos schrieb:
Montag 11. Mai 2009 um 23:04
Bleib lieber zuhause uns mach es Dir gemütlich um Deine Idee umzusetzen
Ne, im Ernst, wenn Du die Idee schon konkret im Kopf hast und Du denkst, in ein paar Tagen was stehen zu haben, dann tu es einfach. Schlimmstenfalls hast Du ein paar Tage an der Amazon API rumgespielt, aber ich bin sicher, dass da was Gutes bei rumkommt!
AgentSmith schrieb:
Dienstag 12. Mai 2009 um 00:25
Du wirst lachen, ich hab grade bemerkt, dass der Part, der mir mehr Sorgen im Vorfeld bereitet hat, sich im Wesentlichen mit _einer_ Zeile Code erledigen lässt. Jetzt fang ich an, am Amazon-Teil zu basteln. Vielleicht hab ich schon morgen (Uni-frei.. harr!
) eine rudimentäre Testversion der wichtigsten Funktionalität fertig.. du hörst von mir.
fuchzga schrieb:
Dienstag 12. Mai 2009 um 01:08
Ich danke ebenso. Schöne Zusammenfassung! Ich glaube ich muss mal wieder meinen AWS-Account rauskramen.
AgentSmith schrieb:
Dienstag 12. Mai 2009 um 03:23
Arrrr, Weekend of Code is für Anfänger. Die absoluten Grundlagen stehen. Harr. Göttlich. Morgen hab ich frei, wunderbar. *händreib*
Du bekommst Post.
Chrisostomos schrieb:
Dienstag 12. Mai 2009 um 07:51
@fuchzga: Gerne! Und immer raus mit dem AWS-Account, schadet ja keinem
@AgentSmith: Sehr schöne Idee, da werden wir uns den Kuchen wohl teilen müssen
Marco schrieb:
Donnerstag 21. Mai 2009 um 17:26
Wirklich schöne Übersicht, danke… Habe bislang noch nicht wahnsinnig viel Erfahrungen mit den Amazon Services gemacht, mir scheint das aber eine wirklich interessante Angelegenheit zu sein, von daher werde ich mich jetzt wohl übers lange Wochenende auch mal eingehender damit beschäftigen. Bin mal gespannt, was man bzw. ich damit alles schönes anfangen kann…
Leon schrieb:
Montag 25. Mai 2009 um 10:35
Da muss ich auch erst mal Danke sagen. Werde mir das gleich mal genauer anschauen und mal sehen, ob auch ich wirklich etwas damit anfangen kann.
Amazon Web Services nur noch mit Signatur - Amazon, Signatur, Nutzung, Product, Advertising, Tutorial - Guido Mühlwitz schrieb:
Mittwoch 27. Mai 2009 um 10:33
[...] das Ganze nun wieder aufzuarbeiten, verweise ich auf dieses gute Tutorial zur Nutzung einer geeigneten Signatur für die Kommunikation mit der Product Advertising AP…. Bookmarken bei: Diese Icons verlinken auf Bookmark Dienste bei denen Nutzer neue Inhalte [...]
Alexander schrieb:
Sonntag 28. Juni 2009 um 15:07
Randy schrieb:
Montag 26. Oktober 2009 um 13:52
Hat jemand ein Beispiel in Objective-C (fürs iPhone)? Vielen Dank, Randy
Chrisostomos schrieb:
Donnerstag 29. Oktober 2009 um 00:59
Ein Beispiel habe ich nicht, aber einen Hinweis
Die Nutzung der Amazon API auf Mobilgeräten wurde von Amazon vor kurzem eingeschränkt: https://affiliate-program.amazon.com/gp/advertising/api/detail/agreement.html (Punkt 4e).