Automatischer Website login (headless)

  • Mein simples Vorhaben:
    Ein script, welches sich beim ausführen in eine website einloggt, und einige links aufruft. Das ganze soll auf dem Raspberry (Raspbian) ohne grafische Oberfläche geschehen.



    Mein aktueller Ansatz:
    Ein simples Python-script lässt Selenium mit Firefox (über Xvfb) die Website aufrufen und sich einloggen.
    Allerdings läuft dies nicht wirklich so wie ich es möchte und es kommt mir auch vor als würde ich mit Kanonen auf Spatzen schießen. Und mein raspberry ackert schon genug ;).


    Meine Fragestellung:
    Wie lässt sich das Vorhaben möglichst effizient umsetzten. (Das ganze soll regelmäßig etwa täglich stattfinden ich dachte an Cron).
    Am liebsten wäre mir ein bash script und ein Konsolenbrowser. Google hat mir schon w3m und lynx vorgeschlagen. Nur wie lässt sich (wenn url-login nicht möglich ist) das login automatisieren.
    Da ich von php java und Konsorten ebenso wie von Browsern in der Konsole leider wenig Ahnung habe, hoffe ich hier vielleicht einen guten, leichtverständlichen Tipp zu bekommen.
    Ich vermute das Login funktioniert über cookies, zumindest bin ich nach schließen des Browsers noch eingeloggt und nach dem löschen der Cookies oder dem Login über eine andere Instanz nichtmehr.


    Mit w3m kann ich mich über die Konsole einloggen, nur würde ich dies auch gerne automatisieren können.



    :Edit:
    Auszug aus dem Quelltext der Website:


    da sollte sich doch mit der input id was automatisch eingeben lassen ?!

    Edited once, last by sarbot ().

  • Hallo sarbot,


    du kannst die Daten für den Login auch mittels wget direkt von der Konsole oder aus einem Shell-Skript senden. Wenn der Login in einem Cookie gespeichert wird, kann wget ebenfalls ein Cookie anlegen und für weitere Zugriffe auf die Webseite verwenden.


    Wenn du Hilfe für den wget-Aufruf brauchst, wäre es nicht schlecht wenn du mehr von der Login-Seite preisgeben könntest. Der Ausschnitt zeigt ja nur strID (eventuell der Acccountname) und strPW (wohl das Passwort). An welches Skript und wie die Daten gesendet werden sehe ich da noch nicht.


    Gruß Georg

  • Oh da war ich wohl etwas hastig.
    Bei klick auf Login wird die funktion "function fnChkFrmLg()" ausgeführt, die in einer externen datei folgendermaßen definiert ist:



    Reicht das an Information ? zu "document.frmLogin.submit()" hab ich nichts weiteres gefunden.



    Bjoern:
    Danke für den Tip genau sowas habe ich im Prinzip gesucht, ich werde es aber erst einmal mit wget versuchen, da mir das als die schlichteste Lösung erscheint.


    p.s: mit wget --user=username --password=meinpasswort http://url gehts leider auch nicht.

    Edited once, last by sarbot ().

  • Hallo sarbot,


    Quote

    p.s: mit wget --user=username --password=meinpasswort http://url gehts leider auch nicht.


    Das kann auch nicht funktionieren. Mit "--user" und "--password" werden die Login-Informationen nicht über POST gesendet. Diese Parameter dienen für die Anmeldung wenn zum Beispiel ein .htaccess Zugriffsschutz eingerichtet ist.


    Damit die Accountdaten über POST gesendet werden musst du "--post-data" verwenden und die Daten in der entsprechenden Form übergeben.


    Code
    wget -q --post-data "strID=WasAuchImmer&strPW=StregGeheimesPasswort" http://www.domain.de/login.html -O /dev/null


    Gruß Georg

  • Er loggt sich auch mit --post-data nicht ein. Zumindest loggt er sich bei firefox nicht aus, wüsste nicht wie ich sonst sehen könnte, dass er eingeloggt ist.
    Ich habe das ganze auch noch um --cookies=on erweitert hat aber nichts geändert (ist glaub ich auch standart).


    Kann es eventuell sein, dass ich die --post-data noch mit dem login befehl füttern muss, dass also nicht nur die felder ausgefüllt werden, sondern auch der klick auf login simuliert wird ?
    Allerdings habe ich auch keine Ahnung, was ich dafür eintragen muss, damit es "angeklickt" wird.


    "strID=nickname&strPW=meinpasswort&checkBtn= ??? "


    Code
    <td align="left"><div class="cpBtn glob" id="checkBtn" onclick="return fnChkFrmLg();"><p>LOG IN</p></div></td>




    Folgende Zeile steht auch noch am Ende im <form></form>:


    Code
    <input type="submit" onclick="return fnChkFrmLg();" style="height:1px; width:1px; position:absolute; left:-9999px;" />

    Edited once, last by sarbot ().

  • Hallo sarbot,


    der Befehl von mir sollte nur ein Beispiel sein. Da du uns die Webseite bisher nicht genannt hast, musst du die notwendigen Daten schon selber herausfinden und den Befehl entsprechend anpassen. Anstelle von "--cookies" solltest du "--save-cookies" angeben damit das Cookie auch irgendwo gespeichert werden kann. Bei allen weiteren Befehlen musst du die Datei dann mit "--load-cookies" angeben.


    Ob du eingeloggt bist kannst du der heruntergeladenen HTML-Datei entnehmen. Durch "-O /dev/null" in meinem Befehl wird diese aber direkt gelöscht.


    Gruß Georg

  • Ich würde es mit Python lösen... ganz ohne browser.
    Dazu nutze ich die Module urllib, urllib2 und cookielib aus den Standardmodulen.
    Desweiteren ist das Modul htmldom noch nützlich (http://thehtmldom.sourceforge.net/). Htmldom läuft bei mir auch unter Python 2.7

  • Alternativ bietet es sich an einen Blick auf curl zu werfen.


    Benutze es selbst, um meine Arbeitszeiten aus unserem Intranet auszulesen und später in einer .ics-Datei auszugeben, dabei werden neben HTTPS und vor allem Cookies genutzt/unterstützt.


    Zusammen mit cron, grep, cut und awk ein tolles Tool. :)