Im Beitrag Amazon Webservices mit VBA nutzen (www.access-im-unternehmen.de/634) haben wir die technischen Grundlagen dazu geliefert, wie Sie unter VBA auf die Produktdatenbank von Amazon zugreifen können. Der Beitrag Bücherverwaltung (www.access-im-unternehmen.de/633) lieferte ein praktisches Beispiel für den Einsatz dieser Technik. In der Zwischenzeit hat sich einiges getan: Amazon hat eine zusätzliche Hürde eingebaut, die den Zugriff auf den Katalog verhindert. Der vorliegende Beitrag zeigt, wie Sie Anfragen an die Amazon Webservices signieren und wieder problemlos auf die Daten zugreifen können.
An dieser Stelle sei vorab erwähnt, dass Amazon den Zugriff auf seine Webservices an die Einhaltung der Nutzungsbedingungen knüpft. Diese besagen beispielsweise, dass die Abfrage von Produktdaten das Gewinnen von Kunden zum Ziel haben sollte – etwa, indem Sie die Produkte mithilfe dieser Informationen von Ihrer eigenen Webseite aus verlinken (damit ließe sich nebenher auch noch eine kleine Provision verdienen).
Ablauf
Bevor Sie die Dienste etwa über die Beispieldatenbank nutzen können, brauchen Sie einen Developer-Account, unter dem Sie die Anfragen absetzen können.
Der Rest ist prinzipiell das simple Zusammenstellen einer REST-Abfrage des Webservices, also das Versenden einer Abfrage, die wie ein Link aufgebaut ist und entsprechende Parameter enthält, und das Empfangen und Auswerten der Antwort des Webservices im XML-Format (bei diesem Vorgang kommen Methoden der Bibliothek Microsoft XML, vx.0 zum Einsatz – bitte daher die aktuellste verfügbare Version als Verweis hinzufügen). Gegenüber der Variante aus den oben erwähnten Beiträgen von 2008 kommt nun allerdings noch ein Schritt hinzu: Sie müssen die Parameterliste, also den wesentlichen Teil der Anfrage, signieren. Bei der Signatur handelt es sich um einen SHA256-verschlüsselten HMAC, also einen Hash-basierten Nachrichten-Authentifizierungs-Code. Diesen hängen Sie als weiteren Parameter an die Liste der Parameter an. Zum Erstellen der Signatur verwenden Sie neben der Parameterliste noch den nur Ihnen und Amazon bekannten geheimen Schlüssel. Amazon kann nach dem Erhalt Ihrer Anfrage anhand der Signatur prüfen, ob diese tatsächlich mit Ihrem geheimen Schlüssel signiert wurde.
Developer-Account holen
Amazon bietet eine ganze Reihe Webservices für die verschiedensten Bereiche an, zum Beispiel Anwendungs-Hosting, Backup und Speicherung, Datenbanken und E-Commerce. Alle werden mehr oder weniger beworben – nur Informationen über die Product Advertising API, die den Zugriff auf den Produktkatalog erlaubt, sind schwer zu finden. Sie finden über den folgenden Link direkt dorthin: aws.amazon.com/associates. Direkt dort können Sie sich auch registrieren und kurz danach auf Ihren Account zugreifen. Für den Zugriff auf den Produktkatalog benötigen Sie nur zwei Dinge: Ihre Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel.
Beides erhalten Sie, wenn Sie einem Link in der Begrüßungsmail nach der Anmeldung folgen. Wenn Sie einen Bereich wie den aus Bild 1 vorfinden, sind Sie richtig.
Bild 2: Daten für den Zugriff auf den Webservice
Request zusammenstellen
Der Kern der hier beschriebenen Lösung ist das Zusammenstellen eines Requests und die Auswertung der im XML-Format gelieferten Antwort. Der Request sieht beispielsweise wie folgt aus (in einer Zeile):
http://ecs.amazonaws.de/onca/xml AWSAccessKeyId=AKIAJJDXSEUYLWWOE27Q &Operation=ItemSearch &Power=Author%3Aminhorst &ResponseGroup=Medium &SearchIndex=Books &Service=AWSECommerceService &Timestamp=2011-09-11T10%3A37%3A55Z &Version=2009-01-06 &Signature=2Fu1PG8ojlEK6RSodV1sTQUyLzEQ8%2FeFLWFUbSsL1so%3D
Die Funktion GetRequest aus Listing 1 erwartet drei Parameter:
Listing 1: Zusammensetzen des Requests
Public Function GetRequest(strSearch As String, intPage As Integer, strRequest As String) As Boolean Dim strDeveloperToken As String Dim strSignatureBase As String Dim strSignatureKey As String Dim strSignature As String Dim db As DAO.Database Dim strParameterliste As String Dim strOAuthHeader As String Dim objXMLHTTP As MSXML2.XMLHTTP Dim objxml As MSXML2.DOMDocument Dim I As Integer Dim strDomain As String strDeveloperToken = cDeveloperToken strDomain = "ecs.amazonaws.de" Set db = CurrentDb db.Execute "DELETE FROM tblParameters", dbFailOnError AddParameter "Service", "AWSECommerceService" AddParameter "Operation", "ItemSearch" AddParameter "SearchIndex", "Books" AddParameter "ResponseGroup", "Medium" AddParameter "Version", "2011-08-01" AddParameter "Timestamp", TimeStamp_Amazon AddParameter "Power", strSearch AddParameter "AssociateTag", "amisoft" If intPage > 1 Then AddParameter "ItemPage", intPage End If strParameterliste = "AWSAccessKeyId=" & cDeveloperToken & "&" strParameterliste = strParameterliste & GetParameters strSignatureBase = "GET\n" & strDomain & "\n/onca/xml\n" & strParameterliste strSignatureKey = "<Geheimer Schlüssel>" strSignature = SignRequest(strSignatureKey, strSignatureBase) strRequest = "http://" & strDomain & "/onca/xml" & strParameterliste & "&Signature=" _ & URLEncode(strSignature) GetRequest = True End Function
- strSearch: Suchausdruck, zum Beispiel author:minhorst
- intPage: Nummer der Suchergebnis-Seite
- strRequest: Rückgabeparameter, erwartet den zusammengesetzten Request als String