URLDownloadToFile und POST Methode
-
Hallo Freunde,
arbeite im Moment an einem Automatisierungssystem, was mir erlaubt automatisch unsere Verwaltungsseite zu bedienen. Im Moment geht es mir darum, eine Seite runter zu laden, Inhalt zu extrahieren und in ein Datenbank zu legen. Dabei werden gleich Suchkriterien übertragen und die notwendigen Daten geladen. Hier finde ich aber nur beschränkt eine Lösung.
Im Moment arbeite ich sehr bequem mit URLDownloadToFile
Wenn z.B. hinter der URL http://www.verwaltung.de/suche?wort=blau eine GET Methode sich verbirgt, so funktioniert die Funktion URLDownloadToFile prima. Wenn sich dahinter jedoch eine POST Methode verbirgt, so wird der Inhalt einfach nicht geladenWas kann ich in diese Situation machen? Gibt es ähnliche bequeme Funktionen wie URLDownloadToFile jedoch für die POST Methoden?
Viele Dank!
-
Dein Problem ist, dass URLDownloadToFile an den Webserver nur die Webadresse weitergibt. D.h. der Webserver kann nicht riechen, dass du dort POST-Variablen drin verpackt haben möchtest und gibt dir nur das aus, was du ohne POST auch bekommen würdest (in deinem Fall anscheinend dann nichts). POST hat einfach den Sinn, dass man erstmal z.B. Login-Formulare nicht einfach manipulieren kann bzw. ein Dritter die übersendeten Daten nicht einfach auslesen kann (sonst bräuchte man im Webdesign kein Passwort-Feld mehr) und dann gibt es bei einem übersendeten Formular mit vielen Daten keine ewig lange Adresse (würde das Forum hier mit GET arbeiten, würde die gesamte Nachricht nach einem Klick auf 'Absenden' an die Adresse angehängt werden). Bei GET jedenfalls sieht das in deinem Fall anders aus, da kann der Webserver die GET-Variablen verarbeiten, da er die über URLDownloadToFile auch übergeben bekommt.
Schaue dir mal WinSock und das HTT-Protokoll an, damit könntest du dir deine eigene Funktion basteln, mit der du Websites mit POST-Variablen downloaden kannst.
Alternativ lese dir mal das durch: http://msdn.microsoft.com/en-us/library/aa384270(VS.85).aspx#Downloading_resource
-
Danke für die Antwort. Ist es in der Tat so, dass ich mich zuerst einloggen muss. Doch das Einloggen wird ebenfalls über die GET Methode durchgeführt, was auch mit URLDownloadToFile einfach zu realisieren ist. Anschließend jedoch, wird meine Suchanfrage in dem Server bearbeitet und ich bekomme eine Datei als Download, wo sich aber eine POST Methode versteckt.
Ich habe mir eine Funktion jetzt gebastelt, in dem ich durch einfache Vorgänge zuerst ein Socket zum Server aufbaue, dann eine Anfrage senden und anschließend auf die Antwort warte, was auch recht gut funktioniert. Das Problem ist nur, dass nach dem Einloggen auf den Rechner ein Cookie mit meiner SessionID geschrieben wird. Wenn ich also über Socket die Daten abfrage, muss ich zuerst die SessionID extrahieren und diese bei jeder späteren Anfrage manuell anhängen. Worauf ich aber hinaus wollte, ist eine einfache schon vorprogrammierte Funktion wie URLDownloadToFile jedoch für POST. Ob so etwas überhaupt gibt???
Es muss mal mit der Funktion URLDownloadToFile auch interagieren können, damit die SessionID von der HD ebenfalls erkannt und bei jeder Anfrage mitangegeben wird.
Viele Grüße
-
Dein Hauptproblem ist also, du möchtest schon eine fertige Funktion, die alles für dich macht, damit du keine Arbeit daran hast. Ich zumindest kenne keine, die sowas für POST realisiert und habe auch keine gefunden. Vllt. weiß ja jemand mehr dazu als ich, ist immer möglich. Ansonsten heißt es wohl: do it yourself.
Falls ich das richtig verstanden habe, hast du ansonsten noch das Problem, dass du mit der SessionID arbeiten musst, die in einem Cookie steht wo du zurzeit noch nicht rankommst. Dafür schaue mal in diese Übersicht: http://msdn.microsoft.com/en-us/library/windows/desktop/aa385473(v=vs.85).aspx
-
Es ist nicht so, dass ich mir keine Arbeit machen möchte. Ich möchte nur, dass es alles im Einklang funktioniert. Weil ich benutze für die GET Methoden die URLDownloadToFile, die auch das Cookie setzt, und ich wünsche einfach, dass die Funktion für POST ebenfalls auf diesen Cookie zugreift und automatisch die Daten anhängt. Sonst muss ich alles über Socket und send/recv machen, was meistens aufwendiger ist.
-
Schreibe dir doch einfach eine Funktion, die sowohl mit GET und mit POST arbeiten kann, das dauert zwar u.U. bis alles so klappt wie du das möchtest und du erfindest auch zumindest für GET das Rad ein wenig anders, aber neu, im Endeffekt hast du dann aber eine Funktion die für beides funktioniert, also praktisch dein Einklang.
Ansonsten kannst du ja mal warten, vllt. kennt ja jmd. eine bereits fertige Funktion und meldet sich hier in dem Thread
-
Jetzt habe ich noch ein Problem. Wenn ich nach dem Socketaufbau die Daten per recv() empfange, kann ich das Inhalt nicht sehen, außer dem Header. Das Hängt damit zusammen, dass der Seriver die Daten noch verpackt (Content-Encoding: gzip) bei URLDownloadToFile gibt es das Problem nicht. Wie würdet Ihr jetzt vorgehen?
-
Nachtrag: Das Problem mit gzip wurde behoben, ich habe bei der Anfrage dem Server gesagt, dass ich gzip nicht akzeptiere :p
Die Frage des ersten Beitrages ist aber immer noch offen. Experten, Ihr seid gefragt
-
Was für eine Datei willst du denn runterladen? Wenn das eine *.gzip-Datei ist, ist es denkbar ungünstig, diese einfach zu blocken.
Ansonsten einfach den "kryptischen" Inhalt nehmen und mit CreateFile/WriteFile in eine Datei packen, oder was ist das Problem?
-
Das war nur so, dass ich über den Header die Anfrage mit
Accept-Encoding: gzip, deflate
gemacht habe. Wenn die Daten größer sind, die von dem Server übertragen werden, werden die noch einmal verpackt. Dies habe ich nicht bedacht und kam am Ende an einen verschlüsselten Inhalt. Jetzt habe ich diese Zeile aus meiner Anfrage entfernt und bekommen offene Daten von dem Server.Noch einmal an die Community, gibt es Spezialisten hier, die bei einer Frage behilflich sein können? Ich habe zwar eine Lösung programmiert, das Problem ist aber, dass solche fertiggestellten Funktion besser programmiert sind und viele unterschiedliche Einflüsse beinhalten und abdecken. Ich als laie kann nicht alles bedenken und später wird es immer und wieder zu Fehlern oder Abweichungen im System kommen, die wieder viel Zeit kosten werden es alles zu analysieren und dann auszubessern.
Viele Dank