Amazon Webservices per VBA nutzen

Der Amazon Associates Web Service bietet den Zugriff auf die in Amazon gespeicherten Produktdaten an. Dazu gehören längst nicht mehr nur Bücher, CDs und DVDs, sondern auch Elektrogeräte, Kleidung und vieles mehr. Der Zugriff darauf ist nicht nur interessant, wenn man Amazon-Partner ist und die Artikel gegen Provision auf seiner eigenen Webseite feilbietet, sondern auch zum reinen automatischen Einlesen von Produktdaten – zum Beispiel für die ebenfalls in dieser Ausgabe vorgestellte Bücherverwaltung.

Webservices

Webservices sind Anwendungen, die man über eine URL ansprechen kann und über die man eine Anfrage schickt, um eine bestimmte Information zu erhalten. Prinzipiell kann man diese mit einer Internetseite im Browser vergleichen: Sie tragen die URL in das entsprechende Textfeld ein und erhalten als Antwort eine Internetseite. Webservices sind nun noch eine Stufe einfacher geschnitzt, denn ihre Antwort kommt nicht in Form einer formatierten Webseite, sondern als XML-Dokument, das man noch auswerten muss. Auch ist die Anfrage keine einfache URL, sondern sie enthält noch weitere Parameter, welche die eigentliche Anfrage ausmachen. Auch für das Zusammenstellen und Versenden der Anfrage sowie das Empfangen und Auswerten der Antwort muss man selbst durch geeigneten Code Sorge tragen.

Es gibt verschiedene Möglichkeiten, eine Anfrage zu formulieren; im Falle des Amazon Associates Web Services in Kombination mit Access/VBA geschieht dies am einfachsten über eine sogenannte REST-Anfrage (Representational State Transfer). Dies bedeutet, dass die Parameter einfach an die URL des Webservice angehängt werden. Die Antwort erhält man von Amazon dann in Form eines XML-Dokuments.

Amazon Web Services

Den einfachsten Einstieg in die Amazon Webservices finden Sie über das deutsche Internetangebot unter http://www.amazon.de, wo Sie links im Bereich Entdecken einen Eintrag Für Entwickler|Amazon Web Services finden. Der deutschsprachige Segen findet hier allerdings ein abruptes Ende, denn bereits der Verweis zum Web Services Software Developer€s Kit (http://www.amazon.com/webservices) führt zu einer englischsprachigen Seite, die einen überdies nicht gerade mit der Nase auf den Download stößt.

Das ist aber auch nicht schlimm, denn wenn man einmal dort ist, besorgt man sich am besten direkt einen Amazon Web Services account. Dafür brauchen Sie eine E-Mail-Adresse und einige Daten wie Ihre Adresse et cetera. Amazon sendet Ihnen eine Bestätigung des neuen Accounts, der unter anderem einen Link zu einer Seite mit einer Access Key ID enthält. Auf dieser Seite finden Sie das wichtigste Element für Ihren Zugang zu den Amazon Web Services (siehe Bild 1).

pic001.tif

Bild 1: Für den Zugriff auf die Amazon Web Services benötigen Sie eine Access Key ID.

Wenn Sie die Beispieldatenbank mit dem Amazon Associates Web Service ausprobieren möchten, müssen Sie sich übrigens zwangsläufig einen eigenen Account besorgen – die Beispieldatenbanken enthalten keinen gültigen Schlüssel.

Beispieldatenbank

Mit dieser ID bewaffnet können Sie eine erste Beispieldatenbank erstellen. Die Access Key ID speichern Sie der Einfachheit halber in einer global zugänglichen Konstanten in einem Standardmodul namens mdlGlobal:

Public Const cDeveloperToken As String = _
"ABCDEFGHIJ0123456789"

Bedingungen

Die Benutzung der Amazon Webservices ist nur unter bestimmten Bedingungen erlaubt und kostenlos. Dazu gehört, dass der Zugriff hauptsächlich dazu gedacht sein muss, Kunden auf die Webseiten von Amazon zu lenken, und dass man die von Amazon gewonnenen Daten nicht ohne schriftliche Genehmigung weiterveräußert oder verteilt oder diese für mobile Endgeräte aufbereitet. Außerdem ist nur eine Anfrage pro Sekunde pro Access Key ID möglich.

Die genauen Nutzungsrechte müssen Sie aber ohnehin bei der Anmeldung an den Amazon Associates Web Service absegnen. Die ebenfalls in dieser Ausgabe von Access im Unternehmen vorgestellte Bücherverwaltung kann daher also nur ein Beispiel für den Zugriff auf den Amazon Associates Web Service sein.

Anfragen senden mit REST

Wenn man eine Anfrage mit REST versenden und das Antwort-XML-Dokument entgegennehmen möchte, braucht man nur wenige Zeilen Code. Ein einfacher Test sieht beispielsweise wie folgt aus:

http://ecs.amazonaws.de/onca/xml
Service=AWSECommerceService
&AWSAccessKeyId=ABCDEFGHIJ0123456789
&Operation=ItemSearch
&SearchIndex=Books
&Title=Access
&Version=2008-08-19

Dieser Aufruf enthält zunächst die URL des Webservices und dahinter eine ganze Reihe Parameter. Der erste Parameter namens Service besitzt immer den Wert AWSECommerceService. Danach folgt die Access Key ID, die für jeden Benutzer eindeutig sein muss. Wenn Sie am Partnerprogramm von Amazon teilnehmen, sollten Sie auch diese in die URL einfließen lassen – auf diese Weise erhalten Sie im Falle eines Verkaufs die entsprechende Provision. Der passende Parameter lautet AssociateTag.

Operation gibt die gewünschte Aktion an, in diesem Falle mit ItemSearch die Suche nach einem Artikel. SearchIndex legt fest, nach welcher Art von Artikel der Service suchen soll. Hier sind die Bücher, also Books, das Ziel der Anfrage. Title markiert nur einen von mehreren möglichen Suchparametern und steht für den Titel eines Buchs. Unter Version geben Sie die Version des Amazon Associates Web Services an.

Eine REST-Anfrage können Sie bequem über den Webbrowser absetzen. Dieser liefert das Antwort-XML-Dokument als neue Seite zurück (siehe Bild 2).

pic002.tif

Bild 3: Anlegen eines Verweises auf die Microsoft XML-Bibliothek

Neben den hier sichtbaren XML-Elementen folgen einige weitere mit den eigentlichen Informationen zu den gefundenen Artikeln.

Ergebnis beeinflussen mit Response Groups

Amazon liefert dabei die wichtigsten Informationen wie den Titel, den oder die Autoren oder den Hersteller, aber auch eine Reihe von Links zu verschiedenen produktbezogenen Seiten auf Amazon – nicht nur zur Produktseite selbst, sondern auch zu Seiten, auf denen Sie das Produkt zu Wunschlisten hinzufügen oder seine Bewertung durch andere Käufer einsehen können.

Diese Informationen können Sie erheblich erweitern. Dazu verwenden Sie den ResponseGroup-Parameter mit einer der unter [1] angegebenen Response-Groups.

Wenn die Produktliste beispielsweise Links zu den Produktbildern enthalten soll, fügen Sie folgenden Parameter zum REST-Aufruf hinzu:

&ResponseGroup=Images

Weitere Response Groups geben Sie durch Komma getrennt wie folgt an:

&ResponseGroup=Images,Reviews

Diese Variante würde nicht nur die Links zu Bildern, sondern auch noch die Bewertungstexte anderer Käufer zurückliefern. Weitere Parameter und ihre Bedeutung finden Sie unter obigem Link.

REST-Anfrage per VBA

Für den VBA-Entwickler ist es natürlich viel interessanter, eine REST-Abfrage per VBA abzusetzen und das Ergebnis in verarbeitbarer Form zurückzuerhalten. Die Amazon-Dokumentation liefert leider überwiegend Material für andere Programmiersprachen wie die .NET-Sprachen, PHP, Perl oder Java – Sprachen, denen man gegenüber VBA eine weit höhere Web-Affinität einräumt.

Die Routine aus Listing 1 zeigt beispielhaft, wie das Verwenden einer REST-Anfrage und die Auswertung der Antwort erfolgt. Dabei setzen die ersten Zeilen zunächst die URL mit den Parametern für die Anfrage zusammen. Hier kommen zunächst nur die oben angegebenen Parameter zum Einsatz, später kümmern wir uns um weitere Parameter wie etwa zusätzliche Suchkriterien.

Listing 1: Ein einfacher Amazon-Request

Public Sub AmazonRequest()
Dim objXML As MSXML2.DOMDocument
Dim strRequest As String
Dim strDeveloperToken As String
Dim strErrorCode As String
Dim strErrorDescription As String
Dim bolSuccess As Boolean
strDeveloperToken = cDeveloperToken
strRequest = "http://ecs.amazonaws.de/onca/xml€
strRequest = strRequest & "Service=AWSECommerceService€
strRequest = strRequest & "&AWSAccessKeyId=€ & strDeveloperToken
strRequest = strRequest & "&Operation=ItemSearch€
strRequest = strRequest & "&SearchIndex=Books€
strRequest = strRequest & "&Title=Access€
strRequest = strRequest & "&Version=2008-08-19€
Set objXML = New MSXML2.DOMDocument
With objXML
.async = False
.preserveWhiteSpace = False
.validateOnParse = True
.resolveExternals = False
End With
bolSuccess = objXML.Load(strRequest)
If bolSuccess = True Then
    On Error Resume Next
    strErrorCode = objXML. _
    selectSingleNode("ItemSearchResponse/OperationRequest/Errors/Error/Code€).Text
    If Err.Number = 0 Then
        strErrorDescription = objXML. _
        selectSingleNode("ItemSearchResponse/OperationRequest/Errors/Error/Message€).Text
        MsgBox strErrorDescription, vbOKOnly + vbCritical, strErrorCode
    Else
        Debug.Print objXML.XML
    End If
Else
    MsgBox "Error!€ & vbCrLf & objXML.parseError.reason
End If
End Sub

Nach dem Erstellen des URL-Strings erzeugt die Routine ein DOMDocument-Objekt (MSXML-Bibliothek, Verweis siehe Bild 3) und stellt einige Eigenschaften ein. Die Load-Methode dieses Objekts liefert beim Aufruf mit der Anfrage entweder den Wert True für eine erfolgreiche Anfrage oder den Wert False zurück. Letzterer Fall wird mit einer entsprechenden Meldung inklusive Fehlermeldung quittiert, dies sollte jedoch in der Regel nicht passieren. Eher kann es sein, dass ein fehlerhafter Aufruf ein valides XML-Dokument zurückliefert, das selbst die Fehlerbeschreibung enthält. Dies deckt die If…Then-Bedingung ab, welche prüft, ob beim Zugriff auf das Element, das üblicherweise Fehlerinformationen enthält (siehe markierter Bereich in Bild 4), ein Fehler aufgetreten ist. Das Auslesen erfolgt dabei mithilfe eines XPath-Ausdrucks (XPath ist die Abfragesprache für XML-Dokumente). Die übergeordnete Errors-Auflistung ist nur in einer XML-Response enthalten, wenn der Aufruf fehlerhaft ist, sonst fällt sie komplett weg. Liefert das Dokument Fehlerinformationen, gibt ein Meldungsfenster die Informationen aus.

pic003.tif

Bild 2: Ergebnis einer REST-Anfrage im Internet Explorer

pic004.tif

Bild 4: Ein XML-Dokument mit einer Fehlermeldung weist meist auf eine fehlerhafte Anfrage hin.

Liegt kein Fehler vor, enthält dieser Teil des XML-Dokuments die Informationen über die gefundenen Produkte. Diese fallen meist wesentlich umfangreicher als Fehlerinformationen aus, dementsprechend haben wir auch deren Verarbeitung zunächst aus Listing 1 ausgeklammert und nur einen Kommentar platziert, der anzeigt, wo die Verarbeitung stattfindet.

Inhalt der XML-Antwort

Der wesentliche Teil einer fehlerlosen Antwort sieht etwa wie in Listing 2 aus und enthält die Items-Auflistung als Unterelement des Root-Elements ItemSearchResponse.

Listing 2: Aussehen der Beschreibung eines Buchs

...
<Items>
<Request>
<IsValid>True</IsValid>
<ItemSearchRequest>
<SearchIndex>Books</SearchIndex>
<Title>Access</Title>
</ItemSearchRequest>
</Request>
<TotalResults>1051</TotalResults>
<TotalPages>106</TotalPages>
<Item>
<ASIN>3827322650</ASIN>
<DetailPageURL>http://www.amazon.de/...</DetailPageURL>
<ItemLinks>
<ItemLink>
<Description>Add To Wishlist</Description>
<URL>http://www.amazon.de/...</URL>
</ItemLink>
... more <ItemLink>-Elements
</ItemLinks>
<ItemAttributes>
<Author>Andre Minhorst</Author>
<Creator Role="Autor">Andre Minhorst</Creator>
<Manufacturer>Addison-Wesley, München</Manufacturer>
<ProductGroup>Book</ProductGroup>
<Title>Das Access 2003-Entwicklerbuch</Title>
</ItemAttributes>
</Item>
... more <Item>-Elements
</Items>
...

Diese Auflistung wiederum besteht aus einigen allgemeinen Informationen wie der Wiederholung der in der REST-Anfrage gemachten Angaben sowie der Angabe der Anzahl der Ergebnisse und der Seiten, auf welche die Ergebnisse aufgeteilt sind.

Schließlich folgen einige Item-Elemente (standardmäßig sind es zehn Stück je Seite). Diese enthalten einen Link zur Detailseite bei Amazon, weitere Links zum Hinzufügen des Items zu den verschiedenen Listen und unter ItemAttributes die eigentlichen Eigenschaften des Item-Elements.

Im Rahmen der Bücherverwaltung aus Beitrag Bücherverwaltung (s. Shortlink 633) soll der WebService Bücher liefern, die einem oder mehreren Kriterien entsprechen. Dafür brauchen Sie eine spezielle Art der ItemSearch-Operation, die nur für Bücher funktioniert und die den Suchparameter Search erwartet. Diesen füllt man wiederum mit einem Ausdruck, der die gewünschten Suchkriterien enthält. Ausgiebige Informationen zu diesem Parameter liefert [2].

Zu Beispielzwecken beschränken wir uns hier auf die folgenden Kriterien:

  • ASIN: amazonweit eindeutige Produktnummer, entspricht bei Büchern der ISBN-Nummer
  • author: Autor des Buchs
  • keywords: Im Titel oder in der Beschreibung eines Buchs vorkommende Wörter
  • pubdate: Veröffentlichungsdatum
  • title: Im Titel vorkommende Wörter

Sowohl die einzelnen Kriterien als auch die für ein Kriterium angegebenen Schlüsselbegriffe können durch and und or verknüpft werden; auch der Einsatz von Klammern ist möglich. Wichtig ist, dass eventuell auftretende Leerzeichen durch den Ausdruck %20 ersetzt werden. Dies entspricht dem hexadezimalen Wert für 32, dem ASCII-Wert des Leerzeichens.

Mehrere Ergebnisseiten

Die Anzahl der Bücher überschreitet gelegentlich die in einem Zug vom Webservice zurückgelieferten zehn Bücher. In diesem Fall muss man den gleichen Aufruf mehrere Male durchführen, um Informationen zu allen Büchern zu erhalten – mit einer kleinen Ausnahme: Der Aufruf soll jeweils die nächsten zehn Bücher zurückliefern.

Dies erledigt der Parameter ItemPage, den man per VBA auf die jeweilige Seite einstellt:

strRequest = strRequest & "&ItemPage=" & intPage

Wie viele Seiten und wie viele Einträge es gibt, erfährt man aus zwei Elementen, die sich unterhalb des Items-Knotens befinden und etwa wie folgt aussehen:

<TotalResults>12</TotalResults>
<TotalPages>2</TotalPages>

Um alle, auch über mehrere Seiten verteilte Bücher einzulesen, braucht man also nur eine Schleife von 2 (den ersten Aufruf braucht man, um überhaupt die Seitenzahl zu erfahren) bis zur Anzahl der Seiten laufen zu lassen und die enthaltenen Einträge zu verarbeiten.

Mehr Eigenschaften

Im obigen Beispiel liefert das XML-Dokument nur wenige Informationen zu den jeweiligen Büchern zurück. Viel mehr Informationen erhält man, wenn man eine oder mehrere der unter [1] angegebenen Response Groups angibt. Dies geschieht zum Beispiel mit dem folgenden Parameter:

&ResponseGroup=Medium

Medium repräsentiert bereits eine Zusammenfassung mehrerer anderer Response Groups. Wenn Sie eine andere, individuelle Zusammenstellung von Response Groups wünschen, können Sie diese durch Kommata getrennt angeben. Die folgenden Elemente entsprechen beispielsweise denen, welche die Response Group Medium zusammenfasst:

&ResponseGroup=EditorialReview,Images,ItemAttributes,OfferSummary,Request,SalesRank,Small

Für unsere Zwecke reicht die Response Group Medium voll aus. Sie liefert diese Informationen:

  • ASIN
  • DetailPageURL
  • Diverse Links zu Wishlist, Tell A Friend, All Customer Reviews oder All Offers
  • Verkaufsrang
  • Links zu Bilddateien inklusive Abmessungen
  • Author
  • Binding
  • Creator Role
  • EAN
  • ISBN
  • Label
  • Manufacturer
  • NumberOfPages
  • PackageDimensions: Abmessungen des Buchs (Länge, Höhe, Breite, Gewicht inklusive Einheiten)
  • ProductGroup
  • ProductTypeName
  • PublicationDate
  • Publisher
  • Studio
  • Title
  • Preise: Neupreis und günstigster Preis für gebrauchtes Buch inklusive Währung

Abfrage und Verarbeitung der Daten

Eine interessante Frage ist die nach den Möglichkeiten der Weiterverarbeitung der Daten nach dem Einlesen des XML-Dokuments beziehungsweise der XML-Dokumente.

Da laut Amazon ohnehin nur ein Zugriff pro Access Key ID und Sekunde möglich ist, macht es durchaus Sinn, jeweils nur die zehn Einträge des aktuellen Suchergebnisses in einer Liste anzuzeigen und Schaltflächen anzubieten, mit denen der Benutzer zwischen den Seiten blättern, einen bestimmten Eintrag in der Detailansicht anzeigen oder diesen zur Bücherverwaltung hinzufügen kann.

Die Vorgehensweise sieht also etwa so aus: Zunächst gibt der Benutzer in einem Formular seine Suchbegriffe ein und startet die Abfrage des XML-Dokuments mit den ersten zehn Ergebnissen sowie der Seitenanzahl. Die zehn Ergebnisse werden temporär in einer Tabelle gespeichert, deren Inhalt in einem geeigneten Steuerelement – einem Listenfeld oder einem Unterformular in der Datenblattansicht – angezeigt wird.

Springt der Benutzer über eine entsprechende Schaltfläche zur nächsten Seite, wird auch diese in der temporären Tabelle gespeichert – freilich ohne die ersten Einträge dieser Suche zu löschen. Nun soll das Formular die neuen zehn Einträge anzeigen. Will der Benutzer weitere Einträge sehen, lädt die Anwendung das XML-Dokument mit den nächsten zehn Einträgen. Will er die vorherigen zehn Einträge sehen, erfolgt keine erneute Abfrage, sondern einfach die Anzeige der bereits gespeicherten Bücher.

Die folgenden Abschnitte beschreiben nun die folgenden notwendigen Elemente:

  • die drei Tabellen zum Speichern der gefundenen Informationen,
  • das Formular zum Eingeben der Suchkriterien und zum Anzeigen des Ergebnisses sowie
  • die Prozeduren, mit denen die Anwendung die Anfrage an Amazon schickt und das Ergebnis auswertet.

Datenmodell

Das kleine Datenmodell zum Speichern der Suchergebnisse umfasst drei Tabellen, wobei die Tabelle tblSearchresults die wesentlichen Informationen aufnimmt. Es gibt nur eine Information, die dort nicht so recht reinpasst, und das sind die Autoren. Da es je Buch mehrere Autoren geben und jeder Autor auch mehrere Bücher geschrieben haben kann, gibt es eine eigene Autorentabelle, die per m:n-Beziehung mit der Tabelle der Suchergebnisse verknüft ist (siehe Bild 5).

pic006.tif

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar