Amazon per API auf die eigene Webseite bringen

Verkaufsfördernde Maßnahmen
Kommentare

Ein Katalog zum Blättern
Haben Sie eine Vorstellung davon, wie viele Artikel auf http://www.amazon.de im gesamten Produktkatalog bereitstehen? Eingenommen nicht nur diejenigen Produkte, die von Amazon

Ein Katalog zum Blättern

Haben Sie eine Vorstellung davon, wie viele Artikel auf http://www.amazon.de im gesamten Produktkatalog bereitstehen? Eingenommen nicht nur diejenigen Produkte, die von Amazon selbst angeboten werden, sondern auch von tausenden weiteren Onlinehändlern, die die Webseite nur als Verkaufsplattform nutzen. Gemessen an der zehnstelligen ASIN, die aus alphanumerischen und numerischen Zeichen bestehen kann, sind es theoretisch bis zu 3,6 Billiarden. Nun gut, ganz so viele werden es in der Realität nicht sein.

Um Ordnung im Produktkatalog zu halten, sind die Artikel in (derzeit 44) disjunkten Suchindizes kategorisiert. Die reichen von den klassischen Geschäftsfeldern Bücher, DVDs und Elektronik über Musik und Musiktitel bis hin zu Gartenzubehör und Nahrungsmittel. Zumal jeder Index immer noch eine beträchtliche Größe annehmen kann (führen Sie sich die Menge aller veröffentlichten Bücher vor Augen), existiert in jedem Index eine weitere mehrstufige Kategorisierung, die sich von Index zu Index unterscheidet. Artikel sind dazu in so genannte BrowseNodes zusammengefasst. Jeder BrowseNode wird durch eine eindeutige Nummer identifiziert. Der Suchindex Bücher umfasst direkt ein gutes Dutzend BrowseNodes für beispielsweise Neuheiten, Gebraucht, Homepage oder Kategorien. Unterhalb von Kategorien steht dann die Einteilung, die man vielleicht schon auf oberster Ebene erwartet hätte: Belletristik, Computer & Internet, Kochen & Genießen und derer mehr. Schon jetzt wird klar, dass es mehrere Wege zu einem Artikel gibt: Ein Buch wie „PHP 5.3 und MySQL 5.5“ findet sich eine Zeitlang zum einen unter Neuheiten und gleichzeitig – und langfristig – unter Computer & Internet. Die BrowseNodes sind entgegen der Indizes nicht disjunkt.

Außerdem gibt es bei der Verwendung der BrowseNodes in API-Aufrufen zu bedenken, dass sich die IDs gegebenenfalls mit der Zeit ändern können. Auf oberster Ebene sind die eindeutigen Nummern laut API-Dokumentation als stabil im Sinne von langfristig gleich bleibend anzusehen, je weiter man in der Hierarchie der BrowseNodes jedoch nach unten absteigt, desto instabiler werden sie. Aus diesem Grund enthält unsere Klasse Amazon eine Methode BrowseNodeLookup(), mit der sich die aktuelle Hierarchie nachvollziehen lässt (Listing 2). An dieser Methode ist der idealtypische Aufbau einer public-Methode für die Klasse Amazon sichtbar: Sie besteht nur aus der Validierung der Eingabeparameter, dem Aufbau des Parameter-Arrays ( $url_params ) und dem Aufruf der private-Methoden.

Listing 2
public function BrowseNodeLookup($node){

    if(empty($node) || ($node !== filter_var($node,FILTER_VALIDATE_INT))) die("$node ist keine Nummer");
    
    $url_params = array(
    'Operation'=>'BrowseNodeLookup',
    'ResponseGroup'=>'BrowseNodeInfo',
    'BrowseNodeId'=>$node
    );

    return ($this->buildRequest($url_params))? $this->sendRequest():false;
  
  }
  
  public function ItemSearch($keywords, $item_page=1, $search_index='All', $browse_node=null, $response_group = array()){
  
    if($keywords == '') return false;
    if($search_index == '') $search_index = 'All';
    if(is_array($response_group) && !empty($response_group)){
      $response_group = implode(',',$response_group);
    } else {
      $response_group = 'ItemAttributes,Images,OfferFull,EditorialReview,Reviews,SalesRank,BrowseNodes';
    }
    if(!is_integer($item_page)) $item_page = 1;
    
    $url_params = array(
      'Operation'=>'ItemSearch',
      'ItemPage'=>$item_page,
      'AssociateTag'=>$this->associate_tag,
      'Version'=>'2010-09-01',
      'ResponseGroup'=>$response_group,
       'SearchIndex'=>$search_index,
       'Keywords'=>rawurlencode($keywords)
    );
    if(!is_null($browse_node)) $url_params['BrowseNode']=$browse_node;
    
    return ($this->buildRequest($url_params))? $this->sendRequest():false;
    }

Das Kernstück zur Suche im Produktkatalog ist die Funktion ItemSearch. Damit lassen sich für einen gewünschten Begriff häppchenweise Artikeldaten von den Amazon-Servern laden. Häppchenweise deshalb, weil bereits eine Aufteilung in Seiten, mit jeweils zehn Artikeln, in den Suchergebnissen enthalten ist. Aus diesem Grund ist der Operation ItemSearch die gewünschte Seitenzahl stets mitzugeben. Geschieht dies nicht, wird 1 als Standard verwendet. Maximal sind 400 Seiten pro Suche möglich. Übersteigt die Anzahl der Suchergebnisse die damit maximale Menge von 4000 (400 Seiten mit je zehn Ergebnissen), hat man Pech gehabt. Wenig überraschend schlägt Amazon in der Dokumentation vor, eine genauere Suche durchzuführen. So viel zu der eingebauten Begrenzung zum Massendownload von Artikeldaten.

Das Kleingedruckte

Wer das Product Advertising API nutzt, akzeptiert selbstverständlich Amazons Nutzerbedingungen. Es empfiehlt sich, diese genau zu lesen, weil die darin explizit genannten Bedingungen Konsequenzen für selbst geschriebene Applikationen haben. Anbei das Wichtigste in Kürze – was nicht vom Lesen der gesamten Nutzerbedingungen entbindet.

Das Caching von API-Daten ist generell erlaubt, solange es sich dabei nicht um Artikelbilder handelt. Die Links zu den Bildern dürfen bis zu 24 Stunden lang gespeichert werden. Sämtliche andere Daten, die per Product Advertising API abgerufen werden, sind ebenfalls maximal 24 Stunden nachzuhalten. Die einzige Ausnahme ist die ASIN: Sie darf auf unbestimmte Zeit gecacht werden.

Bei Informationen zu Preisen oder zur Verfügbarkeit gilt weiterhin: Werden sie länger als eine Stunde zwischengespeichert, so ist bei der Anzeige auf der eigenen Webseite Datum/Zeitpunkt mitzuliefern, wann diese Daten von Amazon bezogen wurden. Hinzuzufügen ist ein vorformulierter Text aus den Nutzerbedingungen.

Davon abgesehen verpflichtet man sich dazu, nicht mehr als einen API Request pro Sekunde an Amazon abzusetzen. Das gilt pro Instanz der eigenen Applikation, haben Sie also mehr als eine Seite, von der Requests abgehen, müssen diese API-Aufrufe nicht synchronisiert und zur Not ausgebremst werden.

Husch ins Körbchen

Genauso einfach wie das Herunterladen von Artikeln über die API, ist es auch, sie in einem Warenkorb zu sammeln. Dazu teilt man Amazon lediglich mit, wie viele Stücke einer ASIN aufzunehmen sind. Der Warenkorb selbst wird über eine Kombination einer Warenkorb-ID (bestehend aus Nummern und Bindestrichen) und einem korrespondierenden Hash-Wert identifiziert. Vor dem Füllen steht aber bekanntlich das Erzeugen eines Warenkorbs. In Listing 3 sind die dazugehörigen Operationen umgesetzt: CartCreate() wird nur indirekt über CartAdd() aufgerufen. Besteht beim Hinzufügen also noch keine Cart-ID, wird erst einmal eine erzeugt. Mit CartModify() lässt sich der Inhalt eines Warenkorbs aktualisieren. Was in Listing 3 nicht vorhanden ist, sind zusätzliche Funktionen wie das Löschen eines Warenkorbs. Übrigens: Um das Löschen kann man, muss man sich aber nicht explizit kümmern. Ein Warenkorb wird bei Amazon sieben Tage lang gespeichert, gemessen am letzten Aufruf. Nach sechs Tagen Stillstand kann man also einen neuen Artikel hinzufügen oder einen bestehenden Löschen und verlängert damit die Lebensdauer des Korbs um weitere sieben Tage.

Listing 3
private function CartCreate($asin=null,$quantity=1){
  
    if(!$this->checkAsin($asin)) return false;
    $url_params = array(
      'Operation'=>'CartCreate',
      'AssociateTag'=>$this->associate_tag,
      'Item.1.ASIN'=>$asin,
      'Item.1.Quantity'=>$quantity
    );
    
    return ($this->buildRequest($url_params))?$this->sendRequest():false;
  }
  
  public function CartAdd($cid,$chmac,$asin,$quantity=1){
  
    if(!$this->checkAsin($asin)) return false;
    $quantity = (int) $quantity;
    
    if($cid === null) {
      return $this->CartCreate($asin, $quantity);
    }
    
    $url_params = array(
      'Operation'=>'CartAdd',
      'AssociateTag'=>$this->associate_tag,
      'CartId'=>$cid,
      'HMAC'=>$chmac,
      'Item.1.ASIN'=>$asin,
      'Item.1.Quantity'=>$quantity  
    );
    
    return ($this->buildRequest($url_params))? $this->sendRequest():false;
  }
  
  public function CartModify($cid,$chmac,$citem,$quantity=1){
  
    if(!$this->checkAsin($asin)) return false;
    $quantity = (int) $quantity;
  
    if($cid === null){
      return $this->CartCreate($asin,$quantity);
    } else {
      $url_params = array(
        'Operation'=>'CartModify',
        'AssociateTag'=>$this->associate_tag,
        'CartId'=>$cid,
        'HMAC'=>$chmac,
        'Item.1.CartItemId'=>$citem,
        'Item.1.Quantity'=>$quantity  
      );
      
      return ($this->buildRequest($url_params))? $this->sendRequest():false;
    }  
  }

Im zurückgelieferten XML String der Operationen CartCreate() und CartAdd() befindet sich neben den IDs/Hashes übrigens noch die so genannte PurchaseURL , also diejenige Internetadresse, mit der der Webseitenbesucher zu Amazon gelangt und dabei seinen Warenkorb behält (Abb. 1).

Abb. 1: Beim Wechsel zu Amazon bleibt der Warenkorb erhaltenAbb. 1: Beim Wechsel zu Amazon bleibt der Warenkorb erhalten

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -