eBay-Artikelsuche mit Access

Access steuert alles fern, was nicht bei Drei auf dem nächsten Baum ist – und diesmal ist eBay dran. Zwar liefert die Handelsplattform keine VBA-Schnittstelle, aber der versierte Access-Entwickler scheut auch nicht vor dem Anzapfen eines Webservice zurück. Der von eBay bietet alle Möglichkeiten, die auch die Benutzeroberfläche im Browser liefert – und mehr. So können Sie den Webservice beispielsweise dazu nutzen, Artikel aus der Tabelle einer Warenwirtschaft in einem Rutsch online zu stellen. In diesem Beitrag beschäftigen wir uns jedoch erstmal mit der Suche nach Artikeln.

Wer schon einmal mit Webservices kommuniziert hat, kennt die eine oder andere Methode, mit der man dies erledigt. Die einfachste heißt REST und liefert auf eine HTTP-Anfrage, deren Parameter die Anfragedetails enthalten, ein XML-Dokument als Antwort.

Ebenfalls oft verwendet wird die Variante, bei der man bereits die Anfrage in ein XML-Dokument verpackt, das der Webservice auswertet und ebenfalls mit einem XML-Dokument beantwortet. In diesem Beitrag lernen Sie beide Varianten kennen, wobei REST sich einfacher testen lässt: Sie brauchen dazu nur die URL in den Browser einzutippen und erhalten direkt die passende Antwort im XML-Format.

REST ist allerdings kein Allheilmittel: Wer Artikel bei eBay einstellen möchte, wird schnell feststellen, dass eine URL-Zeile schnell unhandlich wird. An dieser Stelle versendet man seine Anfrage dann doch lieber als XML-Request.

Nur für Developer

Für den Zugriff auf die Webservices von eBay brauchen Sie in der Regel einen Developer-Account. Als Ausgangspunkt für das Anlegen eines solchen Kontos dient die Webadresse http://developer.ebay.com/. Hier klicken Sie auf den großen Join Now!-Link und gelangen zum Formular aus Bild 1, dem Sie Ihre Daten anvertrauen müssen, um an einen eBay-Developer-Account zu gelangen. Was Sie hier mitnehmen, ist die Developer-User-ID und Ihr Kennwort.

pic001.png

Bild 1: Anlegen eines eBay-Developer-Accounts

Nach dem Registrieren landen Sie auf Ihrer Account-Page, von wo aus Sie alle weiteren Schritte durchführen können, die für den Zugriff auf den eBay-Webservice nötig sind (siehe Bild 2).

pic002.png

Bild 2: Die Steuerzentrale für eBay-Developer

Im Bereich application keys können Sie nun zwei Sätze von Schlüsseln erstellen. Das erste Paar dient dem Zugriff auf die Sandbox von eBay, die prinzipiell eine Kopie von eBay ist und alle dort enthaltenen Funktionen zum Testen zur Verfügung stellt. Das zweite Paar verschafft Ihnen Zutritt zur echten eBay-Welt.

Ein Klick auf generate sandbox keys erstellt die drei Schlüssel DEVID, AppID und CertID in Form von GUIDs und zeigt diese direkt in Ihrer Schaltzentrale an. Mit der Schaltfläche generate production keys beschaffen Sie sich den Schlüsselsatz für den produktiven Betrieb.

Nun fehlen nur noch wenige Details und Sie können den ersten Zugriff starten (genaugenommen könnten Sie das schon jetzt – aber wenn wir schon einmal dabei sind …): Klicken Sie dazu auf den Link Configure Settings (erst für die Sandbox Keys, dann für die Production Keys) und dann im Bereich User Tokens auf den Link User Tokens. Der nächste Dialog informiert Sie darüber, dass noch keine User Tokens erzeugt wurden, und bietet dementsprechend einen Link namens Generate Token an.

Dieser führt Sie überraschenderweise zu einem Anmeldedialog, den Sie wahrscheinlich in deutscher Sprache schon einmal gesehen haben – mit dem Unterschied, dass dort kein Titel wie Sign in to link your eBay account to <Firmenname> steht. Der Token wird nämlich im Kontext eines existierenden Benutzers vergeben.

Wenn Sie gerade einen User Token für den Sandbox-Betrieb erstellen möchten (davon zeugt in diesem Fall die URL signin.sandbox.ebay.com), müssen Sie zunächst einen Benutzer anlegen, in dessen Kontext Sie dann den User Token erstellen. Das gelingt am schnellsten über einen Mausklick auf die Schaltfläche Register und anschließendes Eintragen der gewünschten Daten. Prinzipiell legen Sie nun einen gewöhnlichen Benutzer an – mit der Besonderheit, dass dieser nur in der Sandbox tätig werden darf.

Wenn Sie den User Token für die produktive Umgebung erstellen möchten, brauchen Sie ebenfalls einen eBay-Account – diesmal allerdings einen, der auch in der realen Welt kaufen und verkaufen darf.

Nach dem Anmelden mit dem Sandbox- oder Production-Account erscheint nicht etwa die übliche Begrüßung durch eBay, sondern ein weiterer Dialog, der nach einer Bestätigung für das Erstellen des User Tokens im Kontext der für die Anmeldung verwendeten Benutzerdaten verlangt. Der nächste Dialog liefert dann die benötigten Schlüssel und den User Token im Überblick (siehe Bild 3).

Optionen-Tabelle

Wohin nun mit den gewonnenen Informationen Immerhin werden Sie diese in den folgenden Beispielen gelegentlich benötigen und wollen sie nicht immer wieder von der Account-Webseite kopieren. Keine Frage: Als Access-Entwickler erstellen Sie natürlich auf die Schnelle eine kleine Tabelle zum Speichern von Optionen. Dies geschieht oft in der Form, dass eine Tabelle nur die beiden Felder Optionsname und Optionswert enthält und jeder Datensatz ein Wertepaar aufnimmt. Sie können natürlich auch eine Tabelle erstellen, in der jedes Feld eine Option aufnimmt. Da die Anzahl der Optionen in diesem Fall konstant ist, kommt diese Variante hier zum Einsatz. Die Tabelle sieht in der Entwurfsansicht so aus wie in Bild 4. Für die einfache Verwaltung dieser Informationen legen Sie ein Formular wie in Bild 5 an.

pic003.png

Bild 3: Schlüssel und User Token

pic004.png

Bild 4: Tabelle mit den für den Zugriff auf die eBay-Webservices nötigen Daten

pic005.png

Bild 5: Formular für die Verwaltung der Accountdaten

Für die spätere Verwendung der in der Tabelle tblOptionen gespeicherten Werte legen Sie vier kleine Funktionen an, die in Abhängigkeit vom Wert des Felds Sandbox entweder den Sandbox- oder den Production-Wert der gefragten Option zurückliefern. Diese Routine sieht beispielsweise so aus:

Public Function GetAppID() As String
    If DLookup("Sandbox", "tblOptionen") = 1 Then
        GetAppID = Nz(DLookup("AppID_Sandbox", _
        "tblOptionen"), "")
    Else
        GetAppID = Nz(DLookup( _
        "AppID_Production", _
        "tblOptionen"), "")
    End If
End Function

Ob Sie im Sandbox- oder im Production-Modus arbeiten, stellen Sie mit der entsprechenden Optionsgruppe im Formular frmOptionen ein; die Funktionen GetAppID, GetCertID, GetDevID und GetUserToken liefern dann jeweils den dafür vorgesehenen Schlüssel beziehungsweise Token.

Damit ausgerüstet können wir uns nun dem eigentlichen Ziel dieses Beitrags zuwenden: Dem Fernsteuern von eBay mittels Access-Anwendung und Webservice.

Artikel suchen

Die wohl meistgenutzte Funktion ist das Suchen von Artikeln. Damit Sie nicht denken, alles sei so einfach wie nachfolgend dargestellt, weisen wir an dieser Stelle darauf hin, dass es durchaus mehrere Möglichkeiten gibt, um die eBay-Artikel nach bestimmten Merkmalen zu durchsuchen.

So gibt es beispielsweise zwei unabhängige APIs namens Trading-API und Shopping-API (es gibt noch mehr, aber die sind in diesem Kontext eher uninteressant). Wir konzentrieren uns auf die Shopping-API, weil sie alle Anforderungen für die nachfolgenden Beispiele erfüllt.

Zusammensetzen der Anfrage-URL

Die URL zum Übermitteln der Anfrage an den eBay-Webservice setzt sich aus der eigentlichen Webadresse sowie aus den Parametern zusammen, die jeweils aus Parameter-Wertpaaren bestehen. Parameter und Wert trennt jeweils ein Gleichheitszeichen, die einzelnen Parameter-Wertpaare hält man durch das Kaufmanns-Und auseinander.

Es gibt jeweils einige Pflichtparameter und solche Parameter, welche den eigentlichen API-Aufruf betreffen. Informationen über die Pflichtparameter finden Sie in Kurzform in Tab. 1 sowie in ausführlicher Fassung unter [1].

Parameter

Beschreibung

Tab. 1: Einige der Parameter beim Aufruf von Funktionen der Shopping-API

Die Basis-URL heißt http://open.api.ebay.com/shopping. Dahinter fügen Sie, getrennt durch ein Fragezeichen (), die Parameterliste ein.

Beginnen wir mit einem einfachen Suchauftrag nach allen Artikeln, die Access Entwicklerbuch im Namen führen. Dafür verwenden wir die API-Funktion FindItems, die in [2] mit allen Parametern erläutert wird.

Die URL sieht anschließend so aus:

http://open.api.ebay.com/shopping
callname=FindItems&version=535&siteid=77&
appid=mossSOFT-xxxx-xxxx-xxxx-xxxxxxxxxxxx&
responseencoding=XML&
QueryKeywords=Access Entwicklerbuch

Die URL geben Sie im Browser ein und rufen die Seite auf. Das Ergebnis finden Sie in Bild 6. Es sieht wenig erbaulich aus: Zwar enthält der Aufruf für den Parameter responseencoding den Wert XML, aber irgendwie sehen die Suchergebnisse der richtigen eBay-Anwendung doch besser aus.

pic006.png

Bild 6: Das Ergebnis einer Abfrage mit bestimmten Suchbegriffen

XML-Antwort in lesbare Form bringen

Nun denn: Bringen wir ein wenig Licht ins Dunkel und lesen die relevanten Informationen aus diesem XML-Dokument heraus. Dazu brauchen Sie einen Verweis auf die Bibliothek Microsoft XML, v3.0 oder höher und ein wenig Grundkenntnisse in der Behandlung von XML-Dateien mit dem Document Object Model. Die finden Sie in konzentrierter Form im Beitrag XML-Dokumente mit VBA erstellen und lesen (Shortlink 522).

Webservice-Anfrage per VBA

Bevor wir uns auf den XML-Code der Antwort des Webservice stürzen, müssen wir diesen zunächst einmal in den (VBA-)Griff bekommen. Wie schicken wir die Anfrage an den Webservices, und wo speichern wir die Antwort

Wer schon einmal unter VBA mit XML-Dokumenten gearbeitet hat, weiß, dass diese in einem Objekt des Typs DOMDocument gespeichert werden. Also deklarieren wir ein solches:

Dim objDocument As New MSXML2.DOMDocument

Die URL speichern wir in einer einfachen String-Variablen, die wir folgendermaßen deklarieren:

Dim strRequest As String

Für den Beginn soll die URL ganz einfach im Ganzen als Zeichenkette zugewiesen werden:

strRequest = "http://open.api.ebay.com/µ
shoppingcallname=FindItemsµ
&version=535&siteid=77µ
&appid=mossSOFT-f3da-4585-a088-125f0728ec55µ
&responseencoding=XMLµ
&QueryKeywords=Access Entwicklerbuch"

Mit diesen beiden Werten füttern wir die kleine Funktion aus Listing 1, und zwar mit folgender, in eine If…Then-Abfrage verpackten Anweisung:

Listing 1: Ermitteln eines XML-Dokuments als Ergebnis einer Webservice-Anfrage

Public Function eBayRequest(strRequest As String, objResponse As MSXML2.DOMDocument) As Boolean
    With objResponse
    .async = False
    .preserveWhiteSpace = False
    .validateOnParse = True
    .resolveExternals = False
    End With
    eBayRequest = objResponse.Load(strRequest)
End Function
If eBayRequest(strRequest, objDocument) = _
True Then
Debug.Print objDocument.XML
Else
Debug.Print "Aufruf gescheitert."
End If

Die Funktion eBayRequest erledigt nichts anderes, als das übergebene DOMDocument-Objekt mit einigen Eigenschaften zu versehen – unter anderem die Request-URL – und das Ergebnis einzulesen. Dieses gibt die aufrufende Routine dann über die Eigenschaft XML des Objekts objDocument im Direktfenster aus.

Suchergebnis auswerten

Da wir nun ein brauchbares Ergebnis im XML-Format haben, werten wir dieses gleich per VBA aus.

Das Root-Element des Ergebnisses heißt FindItemsResponse und enthält neben einigen allgemeinen Informationen wie dem Timestamp die eigentlichen Artikelinformationen, die jeweils in einem eigenen Item-Element untergebracht sind. Um die Eigenschaften der einzelnen Elemente zu ermitteln, müssen Sie diese per VBA-Code durchlaufen und die gewünschten Informationen abfragen.

Dies erledigt, in einfacher Form, die Funktion PrintArticles. Sie erwartet lediglich das XML-Dokument in Form der Objektvariablen objDocument als Parameter und wertet einige seiner Elemente aus. Dazu deklariert sie zwei Variablen des Typs IXMLDOMNode. Das erste soll das Root-Element des Dokuments aufnehmen, also das Element FindItemsResponse. Einen Verweis auf das Root-Element erhält man ganz einfach über die Eigenschaft documentElement des XML-Dokuments.

Listing 2: Ausgabe der ermittelten Artikel

Public Function PrintArticles(objDocument As MSXML2.DOMDocument) As Boolean
Dim objRoot As MSXML2.IXMLDOMNode
Dim objItem As MSXML2.IXMLDOMNode
Set objRoot = objDocument.documentElement
Debug.Print "Anzahl Items: " & objRoot.selectNodes("Item").length
For Each objItem In objRoot.selectNodes("Item")
Debug.Print objItem.selectSingleNode("ItemID").nodeTypedValue, _
objItem.selectSingleNode("Title").nodeTypedValue
Next objItem
End Function

Dieses Element wiederum enthält die Item-Elemente, von denen jedes genau einen Artikel repräsentiert. Mit der Abfrage selectNodes("Item") des Root-Elements erhalten Sie eine Referenz auf die Auflistung aller im Root-Element enthaltenen Elemente namens Item. Die Eigenschaft length dieser Auflistung liefert die Anzahl der Einträge.

Über eine For Each-Schleife durchläuft die Routine alle Einträge und ermittelt weitere Unterelemente, nämlich ItemID (dies entspricht der Artikelnummer bei eBay) und Title, also den Überschriftstext, den Sie bei eBay zu jedem Artikel finden. Die Eigenschaft nodeTypedValue fördert den Inhalt von ItemID und Title zu Tage, was zu einem Ergebnis wie dem folgenden führt:

Anzahl Items: 3
120339177375 ANDRE MINHORST: Das Access 2003 µ
Entwicklerbuch
220322044300 Das Access 2003 Entwicklerbuch - µ
Andre Minh(Kein Porto)
390015315509 Das Access 2003 Entwicklerbuch - µ
Andre Minh(Kein Porto)

Ihnen als Leser von Access im Unternehmen brauchen wir nicht zu erklären, wie Sie diese Informationen statt ins Direktfenster direkt in eine Tabelle der Datenbank schreiben – stattdessen widmen wir uns interessanteren API-Funktionen.

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