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 (s. Abb. 1).

pic001.tif

Abb. 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 (s. Abb. 2).

pic002.tif

Abb. 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 Abb. 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 Abb. 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

Abb. 2: Ergebnis einer REST-Anfrage im Internet Explorer

pic004.tif

Abb. 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

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar