Hallo Leute!
Ich habe ein kleines Problem und keine Ahnung wie ich anfangen kann, das zu lösen...
Es gibt ein Portal, bei dem ich ein Konto habe und bei dem ich einige Dateien regelmäßig herunterladen will. OK, curl wäre eine gute Idee, ABER, die Dateien kann ich herunterladen nur wenn ich eingeloggt bin (obwohl diese Dateien frei und open sind). Gut, das ist die Entscheidung der Betreiber des Portals und ich respektiere es.
Ich könnte curl die paar Cookies geben, die ich im Browser habe, und das so lösen, aber ich würde gern, dass das ganze vollautomagisch passieren würde, aber nicht dass ich mich erstmal mit dem Browser anmelde, die Cookie hole und in eine Datei speichere, dann das kleine Skript ausführe, dass alles herunterlädt...
Das Login ist allerdings eine relativ komplexe Form, die viel mit Javascript arbeitet, und curl kann kein Javascript...
Weiß jemand, ob ein kleines Browser existiert, die ich per Kommandozeile ansteuern kann? Bzw., weiß jemand, wie ich z.B. Firefox in "headless-Modus" starten kann und sagen, dass er sich einloggen soll und die paar Dateien herunterlädt?
Ich freue mich auf eure Vorschläge und Ideen.
Danke Luca Bertoncello (lucabert@lucabert.de)
Hallo,
Es gibt ein Portal, bei dem ich ein Konto habe und bei dem ich einige Dateien regelmäßig herunterladen will.
[...]
Das Login ist allerdings eine relativ komplexe Form, die viel mit Javascript arbeitet, und curl kann kein Javascript...
Weiß jemand, ob ein kleines Browser existiert, die ich per Kommandozeile ansteuern kann?
JS ist hier der falsche Ansatz. Werfe im Browser deiner Wahl die Developer Tools an. Du wirst sehen dass auch dieses Formular am Ende mit dem Server sprechen muss. Meist durch einen HTTP POST mit allesamt aus dem Formular hergeleiteten Daten. Die Antwort setzt das Session-Cookie und ggf. eine Weiterleitung. Beobachte diesen Request und stelle ihn per curl nach. In einigen Bowsern kann man die curl-Kommandozeile direkt herauskopieren. Mit curl musst du dann mit einem Cookie-File arbeiten, wie du schon erwähnt hast. Nur eben die Cookies speichern beim ersten Aufruf von curl zum einloggen.
Viel Spaß beim scripten, Andreas
Am 29.09.2020 12:57, schrieb Andreas Stieger:
Hallo Andreas
JS ist hier der falsche Ansatz. Werfe im Browser deiner Wahl die
Ich habe anscheinend falsch erklärt... Einige FELDER der Form werden per Javascript befüllt und die Namen diesen Felder ändern sich auch bei jedem Aufruf der Seite, sowie den Wert... Ich habe schon per curl die Seite aufgerufen und gesehen, welche Felder gibt, aber wenn einige sich immer ändern und per Javascript befüllt werden, muss ich auch das machen, sonst geht das Login nicht (schon probiert).
Warum so ein schweres Ding für solche Sachen, frage ich mich echt, aber so ist es...
Developer Tools an. Du wirst sehen dass auch dieses Formular am Ende mit dem Server sprechen muss. Meist durch einen HTTP POST mit allesamt aus dem Formular hergeleiteten Daten. Die Antwort setzt das Session-Cookie und ggf. eine Weiterleitung. Beobachte diesen Request und stelle ihn per curl nach. In einigen Bowsern kann man die curl-Kommandozeile direkt herauskopieren. Mit curl musst du dann mit einem Cookie-File arbeiten, wie du schon erwähnt hast. Nur eben die Cookies speichern beim ersten Aufruf von curl zum einloggen.
Das weiß ich schon! Aber in dem Fall muss ich mich immer vorher mit dem Browser einloggen, die Cookies speichern und mein curl-Skript aufrufen. Ich wollte das automatisieren...
Geht das?
Danke Luca Bertoncello (lucabert@lucabert.de)
Hallo Luca,
sowas lässt sich relativ simpel mit Test-Frameworks machen, die eigentlich zum durchtesten von Web-Frontends benutzt werden. Das ist im wesentlichen genau das was du suchst: Ein automatisiert steuerbarer Browser. Gemacht habe ich sowas ähnliches mal mit Selenium:
Einfach im normalen Browser das Addon "Selenium IDE" herunterladen. Dann ein neues Projekt anlegen, den Ablauf aufzeichnen (Start Recording) und zum Schluss alles als .side-File abspeichern.
Dann in der Kommandozeile `selenium-side-runner -c 'browserName=chrome goog:chromeOptions.args=[headless]' -w projectfile.side` und ab geht die Post. Hat natürlich ein paar Probleme:
- JS basiert, ist auch nicht programmiert sondern nur eine Liste von Events - braucht viele Abhängigkeiten (neben chromium chromium-driver und den selenium-side-runner, der nicht mal in den repos ist) - genauso Ressourcenhungrig wie chromium
Selenium kannst du auch direkt aus Python oder Java (?) heraus benutzen. Habe ich auch schon gemacht, war aber für meine Nutzfälle zu aufwändig.
Beste Grüße Hannes
PS: Wenn du aus dem call das "headless" weglässt, kannst du auf deinem lokalem System dem Browser beim Arbeiten zuschauen.
On 29.09.20 11:53, Luca Bertoncello wrote:
Hallo Leute!
Ich habe ein kleines Problem und keine Ahnung wie ich anfangen kann, das zu lösen...
Es gibt ein Portal, bei dem ich ein Konto habe und bei dem ich einige Dateien regelmäßig herunterladen will. OK, curl wäre eine gute Idee, ABER, die Dateien kann ich herunterladen nur wenn ich eingeloggt bin (obwohl diese Dateien frei und open sind). Gut, das ist die Entscheidung der Betreiber des Portals und ich respektiere es.
Ich könnte curl die paar Cookies geben, die ich im Browser habe, und das so lösen, aber ich würde gern, dass das ganze vollautomagisch passieren würde, aber nicht dass ich mich erstmal mit dem Browser anmelde, die Cookie hole und in eine Datei speichere, dann das kleine Skript ausführe, dass alles herunterlädt...
Das Login ist allerdings eine relativ komplexe Form, die viel mit Javascript arbeitet, und curl kann kein Javascript...
Weiß jemand, ob ein kleines Browser existiert, die ich per Kommandozeile ansteuern kann? Bzw., weiß jemand, wie ich z.B. Firefox in "headless-Modus" starten kann und sagen, dass er sich einloggen soll und die paar Dateien herunterlädt?
Ich freue mich auf eure Vorschläge und Ideen.
Danke Luca Bertoncello (lucabert@lucabert.de)
Am 29.09.2020 13:38, schrieb Hannes T.:
Hallo Hannes,
sowas lässt sich relativ simpel mit Test-Frameworks machen, die eigentlich zum durchtesten von Web-Frontends benutzt werden. Das ist im wesentlichen genau das was du suchst: Ein automatisiert steuerbarer Browser. Gemacht habe ich sowas ähnliches mal mit Selenium:
Ugh, so ein riesiges Ding soll ich installieren?!? Gibt es keine andere Möglichkeit?
Einfach im normalen Browser das Addon "Selenium IDE" herunterladen. Dann ein neues Projekt anlegen, den Ablauf aufzeichnen (Start Recording) und zum Schluss alles als .side-File abspeichern.
Dann in der Kommandozeile `selenium-side-runner -c 'browserName=chrome goog:chromeOptions.args=[headless]' -w projectfile.side` und ab geht die Post. Hat natürlich ein paar Probleme:
- JS basiert, ist auch nicht programmiert sondern nur eine Liste von
Events
Soll es also bedeuten, dass es nicht die JS der gerade geladenen Seite benutzt wird? Oder verstehe ich falsch?
- braucht viele Abhängigkeiten (neben chromium chromium-driver und den
selenium-side-runner, der nicht mal in den repos ist)
- genauso Ressourcenhungrig wie chromium
Grüße Luca
Hallo Luca,
On 29.09.20 13:46, Luca Bertoncello wrote:
Am 29.09.2020 13:38, schrieb Hannes T.:
Hallo Hannes,
sowas lässt sich relativ simpel mit Test-Frameworks machen, die eigentlich zum durchtesten von Web-Frontends benutzt werden. Das ist im wesentlichen genau das was du suchst: Ein automatisiert steuerbarer Browser. Gemacht habe ich sowas ähnliches mal mit Selenium:
Ugh, so ein riesiges Ding soll ich installieren?!? Gibt es keine andere Möglichkeit?
Naja, toll finde ich das auch nicht. Aber ich kenne keinen anderen Ansatz, wie eine Webseite vollständig gerendert und mit JS verwendet werden kann.
Theoretisch kannst du natürlich direkt mit dem Treiber des Browsers reden (s. https://w3c.github.io/webdriver/ ) -- aber Selenium macht unter der Haube auch nix anderes.
Ansonsten müsstest du halt auf das zurückgreifen was Andreas schon vorgeschlagen hat, aber das geht bei dir ja leider nicht. Jehnseits der zwei Wege "kein JS" (wie Andreas meinte) und "mit JS" (das was z.B. Selenium macht) erschließt sich mir auch kein dritter Weg. ("Mit ein bisschen JS"?)
Einfach im normalen Browser das Addon "Selenium IDE" herunterladen. Dann ein neues Projekt anlegen, den Ablauf aufzeichnen (Start Recording) und zum Schluss alles als .side-File abspeichern.
Dann in der Kommandozeile `selenium-side-runner -c 'browserName=chrome goog:chromeOptions.args=[headless]' -w projectfile.side` und ab geht die Post. Hat natürlich ein paar Probleme:
- JS basiert, ist auch nicht programmiert sondern nur eine Liste von
Events
Soll es also bedeuten, dass es nicht die JS der gerade geladenen Seite benutzt wird? Oder verstehe ich falsch?
War etwas unklar ausgedrückt, die Binary selenium-side-runner kommt aus NPM und ist in JS geschrieben.
Von der geladenen Seite wird natürlich das komplette JS ausgeführt, allerdings nicht durch Selenium sondern durch den angesteuerten Browser (hier chromium).
"Nicht Programmiert" sind die Abläufe die Selenium durchgeht, d.h. die .side-Datei die ausgeführt wird. Das ist einfach nur ne JSON-Liste mit Events.
- braucht viele Abhängigkeiten (neben chromium chromium-driver und den
selenium-side-runner, der nicht mal in den repos ist)
- genauso Ressourcenhungrig wie chromium
Grüße Luca
An der Stelle will ich noch anmerken dass mir dieser JS-für-alles-Hype gehörig gegen den Strich geht. Selenium benutze ich nicht, weil ich das so toll finde, sondern weil es sehr effizient der nervigen Teil wegkapselt. Da nehme ich auch in kauf, dass das eben auf einem Raspi nicht effizient läuft.
Grüße Hannes
Am 29.09.2020 um 19:46 schrieb Hannes T.:
Hallo Hannes,
Naja, toll finde ich das auch nicht. Aber ich kenne keinen anderen Ansatz, wie eine Webseite vollständig gerendert und mit JS verwendet werden kann.
Theoretisch kannst du natürlich direkt mit dem Treiber des Browsers reden (s. https://w3c.github.io/webdriver/ ) -- aber Selenium macht unter der Haube auch nix anderes.
Mmmm... ich muss etwas überlegen...
Ansonsten müsstest du halt auf das zurückgreifen was Andreas schon vorgeschlagen hat, aber das geht bei dir ja leider nicht. Jehnseits der zwei Wege "kein JS" (wie Andreas meinte) und "mit JS" (das was z.B. Selenium macht) erschließt sich mir auch kein dritter Weg. ("Mit ein bisschen JS"?)
Vielleicht habe ich einen dritten Weg... Etwas versteckt in dem Forum der Seite habe ich ein Post von vor zwei Jahren gelesen, wo ein anderer Nutzer genau dasselbe Problem hatte. Ein der Administratoren der Seite hat ihm gesagt, dass es doch eine Möglichkeit gibt, und er soll ihn privat kontaktieren.
Ich habe es heute auch gemacht, vielleicht stellen sie auch ein FTP oder was anderes zur Verfügung, so dass ich automatisiert mein Problem lösen kann...
Mal sehen, was der Typ antwortet...
Danke trotzdem Luca Bertoncello (lucabert@lucabert.de)
lug-dd@mailman.schlittermann.de