aicher1998
Goto Top

Inhalte einer Webseite programgesteuert ansprechen

Hallo,
ich möchte mir ein kleines eBay-Programm schreiben.

Dazu muss ich ja ständig Werte von der Webseite entnehmen. Zum Beispiel prüfen, ob ich noch Höchstbietender bin.
Ich mach das ganze mit einem Webbrowser, der für den User nicht sichtbar ist.

das ständige DocumentCompoleted hat mich aufgeregt (bitte nicht fragen warum...), hab deshalb das ganze über AddHandler gemacht, aber egal...

das Problem:
Mich stört der Webbrowser mit seinen Scriptfehler (ich weiß, kann man deaktivieren), dem Navigatonssound und dass die Cookies dann ja gespeichert sind und der User bei Verwendung des Webbrowsers gleich wieder eingeloggt ist.

Ich hab mir deshalb eine kleine Funktion geschrieben, mit der man den String einer WebResponse direkt in ein HtmlElement umwandeln kann.

Was ich nicht bedacht hab: Wenn man sich den eBay-Quellcode holt, dann enthält dieser ja noch nicht alle Inhalte, die man angezeigt bekommt, wenn man direkt mit dem Browser auf die Seite geht, da einige Elemente wohl nachgeladen werden.

Deshalb meine Frage:
Wie löse ich das am besten?

- Ich möchte keinen WebBrowser verwenden.
- Ich benötge aber den kompletten Quellcode, der auch im Browser zu sehen ist (den, den man erhält, wenn man auf "Element untersuchen" geht, nicht den, den man bekommt wenn man auf "Seitenquelltext anzeigen" geht)
- Ich muss folgendes trotzdem noch aufrufen können:

(bezieht sich auf das Document)
  .GetElementById("maxbid").SetAttribute("value", CStr(_maxBid))  
                    .Forms(0).InvokeMember("submit")  


Gruß Chris

Content-ID: 289521

Url: https://administrator.de/forum/inhalte-einer-webseite-programgesteuert-ansprechen-289521.html

Ausgedruckt am: 22.12.2024 um 15:12 Uhr

122990
122990 27.11.2015 aktualisiert um 17:37:42 Uhr
Goto Top
Moin,
Ich benötge aber den kompletten Quellcode, der auch im Browser zu sehen ist (den, den man erhält, wenn man auf "Element untersuchen" geht, nicht den, den man bekommt wenn man auf "Seitenquelltext anzeigen" geht)
das geht nur mit einer Browser-Instanz, ob jetzt mit den IE oder der Mozilla- oder der Webkit-Engine. Da JavaScripts und Ajax-Requests ja irgendwie ausgeführt werden müssen !
Ich muss folgendes trotzdem noch aufrufen können:
Geht ebenfalls nur mit einem Browser-Object. Oder eben komplett nur via POST/GET-Requests, wozu man dann die gesamte Kommunikation per Browser-Tools (Netzwerk-Tab) analysieren muss um entsprechend gültige Requests formen und abschicken zu können.

Ist nunmal Arbeit um die du nicht herum kommst, wenn du keine API nutzt.

Gruß grexit

p.s. für unabhängige Browser-APIs gibt es genügend APIs z.B. WebKit.Net
Aicher1998
Aicher1998 27.11.2015 um 17:41:58 Uhr
Goto Top
Zitat von @122990:

Moin,
Ich benötge aber den kompletten Quellcode, der auch im Browser zu sehen ist (den, den man erhält, wenn man auf "Element untersuchen" geht, nicht den, den man bekommt wenn man auf "Seitenquelltext anzeigen" geht)
das geht nur mit einer Browser-Instanz, ob jetzt mit den IE oder der Mozilla- oder der Webkit-Engine. Da JavaScripts und Ajax-Requests ja irgendwie ausgeführt werden müssen !
Kann ich die Mozilla- oder der Webkit-Engine einbinden, OHNE dass die Cookies speichert (sollen nur im Arbeitsspeicher bleiben und bei Schließung des Programms weg sein)?
Und ist da die Syntax bezüglich dem Ansprechen von HTMl-Elementen ähnlich wie beim IE?

Ich muss folgendes trotzdem noch aufrufen können:
Geht ebenfalls nur mit einem Browser-Object. Oder eben komplett nur via POST/GET-Requests, wozu man dann die gesamte Kommunikation per Browser-Tools (Netzwerk-Tab) analysieren muss um entsprechend gültige Requests formen und abschicken zu können.
Soweit ich weiß, kann man doch auch POST/GET-Requests senden, ohne ein WB Object zu haben, sondern nur über das HtmlElement, das die Form enthält?
122990
122990 27.11.2015 aktualisiert um 17:47:27 Uhr
Goto Top
Zitat von @Aicher1998:
Kann ich die Mozilla- oder der Webkit-Engine einbinden, OHNE dass die Cookies speichert (sollen nur im Arbeitsspeicher bleiben und bei Schließung des Programms weg sein)?
Und ist da die Syntax bezüglich dem Ansprechen von HTMl-Elementen ähnlich wie beim IE?
Kannst du beides in deren Doku nachlesen. Jede API hat nunmal seine Varianten, aber das sollte für einen Programmierer kein Hindernis sein, ist ja sein täglich Brot, das lesen von APIs. Lernen muss man sein Leben lang.
Soweit ich weiß, kann man doch auch POST/GET-Requests senden, ohne ein WB Object zu haben, sondern nur über das HtmlElement, das die Form enthält?
Sag ich doch, damit du aber alle nötigen Eigenschaften mit in den POST-Request aufnimmst muss man eben die Kommunikation beim Abschickender Formulare wie oben geschrieben analysieren ...
Und eben in vielen Fällen die Cookies etc. vorher in Petto abgerufen haben!
Aicher1998
Aicher1998 27.11.2015 um 17:50:36 Uhr
Goto Top
Zitat von @122990:

Zitat von @Aicher1998:
Soweit ich weiß, kann man doch auch POST/GET-Requests senden, ohne ein WB Object zu haben, sondern nur über das HtmlElement, das die Form enthält?
Sag ich doch, damit du aber alle nötigen Eigenschaften mit in den POST-Request aufnimmst muss man eben die Kommunikation beim Abschickender Formulare wie oben geschrieben analysieren ...
Und eben in vielen Fällen die Cookies etc. vorher in Petto abgerufen haben!
Ich glaub wir haben uns missverstanden.
Du meintest - sofern ich das richtig gelesen hab - man brauche einen WebBrowser um ein Form abzusenden. das funktioniert ja auch, wenn man keinen WebBrowser hat, sondern nur das entsprechende HtmlElement, dessen quellcode man über eine HttpReponse erhalten hat.
122990
Lösung 122990 27.11.2015 aktualisiert um 20:06:19 Uhr
Goto Top
Zitat von @Aicher1998:
Ich glaub wir haben uns missverstanden.
Du meintest - sofern ich das richtig gelesen hab - man brauche einen WebBrowser um ein Form abzusenden.
Nein das meinte ich nicht.
das funktioniert ja auch, wenn man keinen WebBrowser hat, sondern nur das entsprechende HtmlElement, dessen quellcode man über eine HttpReponse erhalten hat.
Eben man muss die Seite abrufen die Cookies aufheben und mit dieser Session weitere entsprechende Requests abschicken. Sei aber gewarnt, viele Websites generieren Codes die es erschweren diese Dinge zu automatisieren so dass zum Beispiel mehrere Requests mit ein und der selben Daten verhindert werden. Wenn dann noch JavaScript mit ins Spiel kommt bist du damit wieder gearscht.
Gerade bei den großen wie "ebay/google/facebook" musst du schon eine gehörige Portion Wissen und Geduld mitbringen die Prozesse zu analysieren. Besser du nutzt direkt deren sehr gut dokumentierte APIs mit oAuth Authentifizierung , was sie alle ausnahmslos anbieten, alles andere ist unzuverlässiges Gebastel und nicht von Dauer.

Denn, ändert sich die Webseite, und das tun sie sehr oft, kannst du sonst deine Anwendung sofort wieder in die Tonne kloppen. APIs existieren meist in Revisionen, so dass man genug Zeit hat seine Anwendung entsprechend anzupassen, sollte eine ältere Version alsbald als "deprecated" gekennzeichnet werden.

Nutzt du keine APIs, kann deine Anwendung urplötzlich seinen Dienst einstellen und das ist eigentlich ein NO-GO, oder willst du periodisch diesen Analyse-Prozess wiederholen müssen damit deine Anwendung wieder ein paar Wochen halbwegs funktioniert ??
Aicher1998
Aicher1998 27.11.2015 um 20:11:51 Uhr
Goto Top
Vielen Dank!
Gerade bei eBay gibt es sehr viele hidden-Werte, die ich alle regexen müsste... Das spar ich mir lieber.
Aber ich hab noch nicht gesehen, dass es auch eine API zum Bieten gibt.
Wobei das ganz einfach selbst zu machen geht:

Code innerhalb der DocumentCompleted:
(StringToCC ist meine eigene Function, eigentlich ganz nützlich)

With DirectCast(sender, WebBrowser).Document
            CC = StringToCC(.Cookie)

            Select Case bid_State
                Case bidState.SendBid
                    .GetElementById("maxbid").SetAttribute("value", CStr(_maxBid))  
                    .Forms(0).InvokeMember("submit")  

                    bid_State = bidState.ConfirmBid

                Case bidState.ConfirmBid
                    .Forms(0).InvokeMember("submit")  

                    bid_State = bidState.AfterConfirmBid 'Sollte das VOR oder NACH dem Senden des Formulars?  

                Case bidState.AfterConfirmBid

                        'Sollte man noch besser prüfen, aber fürs erste:  
                        MsgBox("OK, das hat geklappt!")  
                    End If
            End Select

        End With
122990
122990 27.11.2015 aktualisiert um 21:49:48 Uhr
Goto Top
Für private Spielereien OK, aber der Zweck ist fraglich, wo es doch AutoBieter en masse schon gibt, und bei der nächsten Anpassung bumms musst du wieder an den Quellcode, alles andere als komfortabel. Nette Spielerei also mehr nicht.

Aber ich hab noch nicht gesehen, dass es auch eine API zum Bieten gibt.
Die gibt es, unter bestimmten Voraussetzungen schon
http://developer.ebay.com/devzone/xml/docs/reference/ebay/placeoffer.ht ...
Aicher1998
Aicher1998 28.11.2015 um 11:06:59 Uhr
Goto Top
Da ist das was ich mir schon programmiert hab, wesentlich einfacher.
Function Bid(id,price) as boolean
122990
122990 28.11.2015 aktualisiert um 15:33:58 Uhr
Goto Top
Zitat von @Aicher1998:

Da ist das was ich mir schon programmiert hab, wesentlich einfacher.
Function Bid(id,price) as boolean
Hält eben nur nicht lange face-wink
"Einfach" ist doch langweilig face-big-smile