Amazon Product Advertising API mit PHP 5

15. September 2009 von Stephan Erdmann [permalink]

Die Amazon Product Advertising API ermöglicht die Nutzung von Amazons Produktkatalog für eigene Zwecke. So können beispielsweise Produktinformationen, Produktbilder, Preise oder Kundenrezensionen abgefragt und auf der eigenen Website angezeigt werden. Zudem ist es möglich, dass Produkte direkt in den Amazon-Warenkorb gelegt werden können. Innerhalb dieses Blogeintrags möchte ich alle Notwendigkeiten präsentieren, um die API für eigene Zwecke mit Hilfe von PHP 5 nutzen zu können. Zwar gibt es hierzu z.B. innerhalb des Zend-Frameworks schon elegante Möglichkeiten, allerdings möchte ich persönlich nicht mehrere Megabyte große Frameworks runterladen müssen, um nur einen Bruchteil der Funktionalität wirklich zu nutzen. Da PHP 5 eigentlich bereits alles mitbringt, was man braucht, läßt sich ein entsprechender Rest-Client sehr zügig implementieren.

Als erstes benötigt man einen Amazon Web Services Account, der kostenlos unter aws.amazon.com erstellt werden kann.  Nach der Erstellung des persönlichen Accounts kann man im Bereich “Your account” unter den “Security Credentials” seine eigene AccessKeyID und den passenden SecretAccessKey herausbekommen. Beide Informationen werden später benötigt, um die Requests an die API zu legitimieren.

Für alle, die die Theorie nicht interessiert, habe ich ein Sourcecode-Packet mit einem einfachen Beispiel und allen notwendigen Klassen zusammengeschnürrt, mit dem sich zumindest schon die Basisoperationen “ItemLookup”, “ItemSearch” und “CartCreate” nutzen lassen. Für alle anderen wird in den folgenden Absätzen grob der Ablauf erklärt.

Für ein tiefgreifendes Verständnis der API gibt es eine vollständige API-Dokumentation von Amazon. Ganz neu hinzugekommen ist das signieren. Hierbei handelt es sich um einen Parameter, welcher seit dem 15.08.2009 zusätzlich bei jedem Request mit angegeben werden muss, um sich für den Service zu legitimieren. Die Erzeugung der Signature macht den kompletten Abfrageprozess etwas komplizierter und wird später genauer vorgestellt.

Der eigentliche Webservice zu der API wird über REST angesprochen. Im Zuge meiner Recherchen gibt es mit der Klasse SimpleXMLElement eine sehr elegante Möglichkeit, um mit PHP 5 einen Rest-Client zu erzeugen. Der Konstruktor erlaubt, dass als erster Parameter eine URL übergeben werden kann. Allerdings gilt es hierzu zu beachten, dass in dem Fall als dritter Parameter ein true für $data_is_url übergeben wird. Ist die übergebene URL korrekt, so liegt die Antwort direkt als SimpleXMLElement vor:

  $xmlResult= new SimpleXMLElement($requestUrl,null,true);

Damit haben wir den eigentlichen Rest-Client schon mal verfügbar. Jetzt muss nur noch der Rest-Get-Request entsprechend zusammengebaut werden. Hierzu werfen wir einen Blick in die aktuelle API-Doku und nehmen uns die Operation ItemLookup vor, mit welcher wir alle Informationen zu ein Buch mit einer bestimmten ISBN herausbekommen möchten. Der EAN-13-Barcode ist bei Büchern idealerweise identisch zu der ISBN, weshalb in dem Request nach der EAN getypt wird. Der vollständige Request ist wie folgt aufgebaut:

http://webservices.amazon.de/onca/xml?
Service=AWSECommerceService&
AWSAccessKeyId=[AWS Access Key ID]&
Operation=ItemLookup&
IdType=EAN&
ItemId=[ISBN]&
SearchIndex=Books&
Timestamp=2009-09-15T07:10:05Z&
ResponseGroup=Large&
Version=2009-07-01&
Signature=[Signature]

Bis auf die Signature sind bereits alle Parameter bestimmt. Zur der Erzeugung der Signature müssen zunächst alle zu übergebenen Parameter alphabetisch sortiert werden, der kompletter Rest-Get-Request als String erzeugt, per SHA256 mit dem eingangs vorstellten SecretAccessKey verschlüsselt und abschließend als base64 codierter String als Attribut Signature mit an den Rest-Service übergeben werden. Die Signature wird in dem begleitenen Sourcecode zu diesem Blogeintrag in der Methode prepareOptions der Klasse AWSECommerceServiceClient durchgeführt. Hier eine kurze vereinfachte Zusammenfassung. die nicht(!) exakt der o.g. Methode entspricht, sondern nur als vereinfachtes Beispiel zum besseren Nachvollziehen des Vorgangs dienen soll. Der vollständige Get-Request lautet wie folgt:


$getRequest="GET
webservices.amazon.de
/onca/xml
AWSAccessKeyId=[AccessKeyId]
IdType=EAN&
ItemId=9783897218642&
Operation=ItemLookup&
ResponseGroup=Large%2CRequest&
SearchIndex=Books&
Service=AWSECommerceService&
Timestamp=2009-09-15T07%3A31%3A26Z&
Version=2009-07-01";

Dieser wird anschließend mit dem von Amazon herausgegebenen SecretAccessKey mit der Funktion hash_hmac, die seit PHP 5.1.2 zur Verfügung steht, verschüsselt:


$sha256GetRequest=hash_hmac("sha256",
$getRequest,
$secretAccessKey,
true);

Zum Schluss wird der verschlüsselelte Request noch base64 codiert und ist damit als Signature-Parameter verfügbar:


$signature=base64_encode($sha256GetRequest);

Die Verarbeitung der Ergebnisse erfolgt über das SimpleXMLElement relativ komfortabel. Ausgehend vom Beispiel lassen sich die Werte wie folgt abrufen:


$asin=$result->Items->Item->ASIN;
$booktitle=$result->Items->Item->ItemAttributes->Title;
$author=$result->Items->Item->ItemAttributes->Author;
...

Amazon stellt mit der Amazon Product Advertising API ein wirklich mächtiges Tool zur Verfügung, um Produktinformationen und Bildern, Rezensionen etc. zu verschiedensten Produktgruppen herauszubekommen und für eigene vielfältige Zwecke zu gebrauchen. Neben offensichtlichen Anwendungen kann man z.B. mit Hilfe eines Barcodescanners sehr schnell eine Applikation schreiben, mit der man die eigenen Buchbestände mit Titel, Autor etc. sofort erfassen kann, ohne mühsam alles per Hand einzutragen.

Sourcecode downloaden

 

Tags: , , ,
Kategorie: PHP

Sie können die Kommentare für diesen Post mit diesem RSS 2.0 Feed verfolgen. Hinterlassen sie einen Kommentar oder einen Trackback von ihrem Blog.

Es gibt einen Kommentar zu diesem Post.

Sebastian [19. Januar 2011 16:58]

Herr im Himmel… endlich hat jeman mal ein vernünftiges Tutorial für AWS mit EAN bereitgestellt.

Danke dir vielmals dafür

Hinterlasse einen Kommentar: