Amazon Product Advertising API mit PHP abfragen

amazon product advertising api logo

Die Amazon Product Advertising API (Teil der Amazon Webservices (AWS)) bietet einen Zugriff auf Amazon Produktdaten. Grundsätzlich gibt es mit SOAP und REST zwei Möglichkeiten, um auf die AWS zuzugreifen. Für die Amazon Product Advertising API wird da

Zum 15.08.2009 ändert sich das Authentifizierungsverfahren. Grund genug um den geänderten Zugriff in einem kleinen Beispiel einmal genauer zu betrachten.
Reichte früher ein API Key, sind jetzt ein öffentlicher und ein privater Zugangsschlüssel notwendig, die man während der Registrierung erstellt. Für SOAP Anfragen ist alternativ auch die Authentifizierung über X.509 Zertifikate möglich. Eine Übersicht über die s.g. „Request Identifiers“ gibt es hier.

Im Beispiel soll die Klasse AmazonService die Anfrage an die Amazon Product Advertising API übernehmen. Betrachtet wird nur der Fall, wenn alles gut geht. Im produktiven Einsatz muss natürlich noch das Fehlerhandling hinzugefügt werden.
Die bei der Registrierung erstellten Zugangsschlüssel werden in der Klasse als Konstanten hinterlegt. Die Variable xml benötigen wir für die Antwort von Amazon.

class AmazonService {
   const APIKEY='';
   const PRIVATE_KEY='';
   const ASSOCIATE_TAG='';
   private $xml;

Das wichtigste für die Anfrage ist der Aufbau der URL. In Ihr werden die Parameter der Anfrage und die mit dem privaten Zugangsschlüssel erstellte Signatur an Amazon übergeben. Diese Aufgabe übernimmt die Funktion buildURL.

private function buildURL($params
      ,$host='ecs.amazonaws.de',$path='/onca/xml') { 
   
   $head = "GETn$hostn$pathn"; 

   // filtern von Leerzeichen und 
   // hinzufügen des Zeitstempels und der Associates Tracking ID
   // zu den Parametern
   $params = array_filter($params
      , create_function('$x', 'return $x;')); 
   $params['Timestamp'] = gmdate('Y-m-dTH:i:sZ');
   $params['AssociateTag'] = self::ASSOCIATE_TAG; 
   ksort($params); 

   $body = implode('&'
      ,array_map(create_function('$x,$y', 'return "$x=".urlencode($y);')
      ,array_keys($params), $params)); 
   
   // erstellen der Signatur mit dem privaten Zugangsschlüssel
   $sig = urlencode(base64_encode(hash_hmac('sha256'
      ,$head.$body,self::PRIVATE_KEY,true))); 

   return "http://$host$path?$body&Signature=$sig";
}

So vorbereitet können wir uns nun daran machen Daten für ein Buch bei Amazon abzufragen. Der dafür notwendige Code wird in der Funktion getBookByIsdn( $isbn ) gekapselt. Zum Speichern der Abfrageergebnisse wird die Klasse Book benutzt, die ich an dieser Stelle nicht weiter betrachte, da sie nur Methoden zum Abfragen und Setzen von Variablen (getter und setter) beinhaltet. Ein assoziatives Array würde es an dieser Stelle genauso tun.

function getBookByIsdn( $isbn ) {
   $ch = curl_init();

   // Die URL des AWS-Aufrufes zusammenstellen
   $params=array("Service"=>"AWSECommerceService"
      ,"AWSAccessKeyId"=>self::APIKEY
      ,"Operation"=>"ItemLookup"
      ,"IdType"=>"ISBN"
      ,"ItemId"=>$isbn
      ,"ResponseGroup"=>"Medium"
      ,"SearchIndex"=>"Books");

   $url=$this->buildURL($params);
   
   // Daten holen
   curl_setopt( $ch, CURLOPT_URL, $url );
   curl_setopt( $ch, CURLOPT_HEADER, 0 );
   curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

   $result = curl_exec( $ch );
   curl_close( $ch );   
   
   // XML auslesen
   $xml=simplexml_load_string( $result );
   $this->xml=$xml;

   preg_match('/d+/'
      ,$xml->Items->Item->ItemAttributes->PublicationDate,$treffer);
   $jahr=$treffer[0];
   
   // abspeichern und Aufbereitung des Ergebnisses
   $book=new Book();
   $book->setBarcode(utf8_decode(
      $xml->Items->Item->ItemAttributes->EAN));
   $book->setAuthor(utf8_decode(
      $xml->Items->Item->ItemAttributes->Author));      
   $book->setJahr($jahr);
   $book->setVerlag(utf8_decode(
      $xml->Items->Item->ItemAttributes->Publisher));
   $book->setTitel(utf8_decode(
      $xml->Items->Item->ItemAttributes->Title));
   $book->setInhalt(utf8_decode(
      $xml->Items->Item->EditorialReviews->EditorialReview->Content));
   $book->setBildUrl($xml->Items->Item->MediumImage->URL);
   
   return $book;
}

Nachdem Erstellen der URL für die Anfrage (Zeile 13) und deren Aufruf mittels curl_exec (Zeile 20), wird die XML Antwort in Zeile 24 geparst und danach in einem Objekt der Klasse Book abgespeichert.

Bleibt nur noch der Aufruf und die Ausgabe.

getBookByIsdn($isbn));
?>
<!-- Ausgabe -->
<table>
   <tr>
      <th>Nr.</th>
      <th>Cover</th>
      <th>Titel</th>
      <th>Author (Jahr)</th>
      <th>Inhalt</th>
      <th>Verlag</th>
   </tr>
&lt;?php 
   for($i=0;$i
      <tr>
         <td></td>
         <td>&lt;img src=&quot;getBildUrl() ?&gt;" /&gt;</td>
         <td>getTitel() ?&gt;</td>
         <td>getAuthor() ?&gt;(getJahr() ?&gt;)</td>
         <td>getInhalt() ?&gt;</td>
         <td>getVerlag() ?&gt;</td>
      </tr>

</table>

Links:
Amazon Product Advertising API
Product Advertising API – Developer Guide
Registrierung
Tutorial Amazon Web Services mit PHP

Update:
Seit dem 01.11.2011 ist AssociateTag ein Parameter, der bei jeder Anfrage erforderlich ist.

An alphanumeric token that uniquely identifies an Associate. This token is the means by which Amazon identifies the Associate to credit for a sale. If a request is made without identifying an Associate, Associate fees are not paid by Amazon. If the AssociateTag is included in the CartCreate request, the value for AssociateTag is automatically included in the PurchaseURL, which is returned by CartCreate. To obtain an Associate Tag, go to https://affiliate-program.amazon.com. For more information, see Associate Tag.

Valid Values: An alphanumeric token distributed by Amazon that uniquely identifies an Associate. Use this value in all requests to receive credit for the customer’s purchase.

10 Kommentare

  1. Hallo,
    ich bin gerade durch Zufall auf Ihren Blog gestoßen, weil ich gerade vor diesem Problem stehe und es für nicht Cracks wie mich ganz gut verständlich ist. Leider ist mir unklar woher ich die Klasse Buch nehmen soll. Vielleicht könnten Sie mir da weiterhelfen.
    Mit freundlichen Grüßen
    Andy

    1. Entschuldigung, dass ich mich erst so spät melde. Die Klasse Book nimmt nur die Daten auf, ist also ein s.g. Data Transfer Object (DTO) und verfügt nur über die getter und setter Methoden für die Eigenschaften.

  2. Schade das es leider wieder ein AWS API Script ist, dass nicht unvollständig ist oder eben nicht ohne Probleme funktioniert. Amazon ist das leider noch weniger hilfreich.

  3. @Marco

    Das einzige was fehlt ist die Klasse Book, die aber nur zur Speicherung der Daten dient. Diese kann man durch eigene Variablen ersetzen oder sie innerhalb von 5 min schreiben, da sie nur aus Attibuten (wie z.B. titel) und den get und set Methoden für diese Attribute besteht.

    Da ich die Klasse AmazonService so wie sie hier ist selbst nutze, wäre ich für detailliertere Fehlerbeschreibungen dankbar.

  4. puuuh, schwere Stück für unsereins ohne Vorkenntnisse. Ich werde aber Deine Scripte mal nutzen und ausprobieren ob ich das hinbekommen. Vielen Dank erstmal für die ausführliche Auflistung!

  5. Ich sehe das ähnlich wie Mepo… das wird nicht einfach! Dank dir für die super Beschreibungen! Ich werde auch mal mein Glück versuchen!

  6. Hallo, weiß jemand ob es so etwas auch als WordPress Plugin gibt? Also das mir an Hand der ASIN die Daten oder die Bewertungen von Amazon holt?

    1. Mir ist leider keines bekannt.

  7. Hi Oliver,

    leider nicht. Ich kenne ein Plugin welches Dir anhand von Keywords und Artikel Tag passende Produkte von Amazon holt und diese in eine DB schaufelt. Von dort kann man diese dann weiterverarbeiten.

  8. Peter · · Antworten

    Hallo Oliver,

    ich bin völliger API Newbie. Sorry, Aber muss ich den kompletten Code in eine PHP-Datei schreiben oder in mehrere? Kannst du vielleicht die Dateien zum Download stellen?

    Danke für Deine Hilfe.
    Gruß
    Peter

Schreibe eine Antwort zu gklinkmann Antwort abbrechen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit deinem WordPress.com-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: