Website hinter Login-Bereich via Python über Kommandozeile abrufen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Statt Python würde ich eher ein Shellskript bauen, und dann die Einzelrequests per "curl" abfeuern. Es wird wahrscheinlich auf folgende Sequenz hinauslaufen:

  1. Einen POST auf die Loginseite abfeuern, wobei dann Benutzer/Passwort mitgegeben werden müssen.
  2. Die Ausgabe von der Loginseite wird a) eine Meldung enthalten, ob das Login überhaupt erfolgreich war, und b) vermutlich einen Cookie ausspielen. Also prüfen, ob a) gegeben, und b) den Cookie aus dem Header des Outputs holen.
  3. Jetzt kannst Du die Folgeseite rufen. Und da muss dann als Zusatzheader der aus Schritt 2b gewonnene Cookie wieder mit eingeworfen werden. Denn nur so erkennt die Anwendung auf dem Server, dass Du der gerade angemeldete Benutzer bist.

Falls die Serveranwendung nicht per Cookies, sondern per Session-ID in der URL arbeitet, gleiches Prinzip. Nur eben dann Session-ID extrahieren und in Folgerequest wieder reinschnipseln.

Wenn Du doch schon die nötigen Schritte kennst, worin besteht denn dann Dein Problem?

https://docs.python.org/3/library/http.html

Man nehme die http client lib, setze den Request ab, hole die Unterseite usw. usf. .

BruderTopf 
Fragesteller
 15.02.2018, 08:56

Eines der Probleme bestand darin, dass ich mir nicht mal sicher war, mit welcher Bibliothek ich arbeiten sollte. Das Problem scheint ja jetzt abgehakt zu sein. Danke!

Kann ich nach dem POST-Request einfach die andere Unterseite aufrufen (bleibe ich eingeloggt)?

Und gibt es eine andere Möglichkeit als das Passwort für den Login-Bereich im Klartext abzulegen?

Danke :-)

edit: Ich hab mich mit http(s)-Modulen bisher nicht viel auseinandergesetzt.

0
Isendrak  15.02.2018, 09:11
@BruderTopf
Kann ich nach dem POST-Request einfach die andere Unterseite aufrufen (bleibe ich eingeloggt)?

Ohne weiteres? Nein.

Je nachdem, wie das Login-System aufgebaut ist, erhälst du vom Server in den Response-Headern z.B. eine Session-ID per HTTP-Cookie. Dieser Cookie muss dann natürlich auch bei jeder Aktion, die im eingeloggten Zustand durchgeführt werden soll wieder an den Server übermittelt werden, ansonsten wird dieser dich nich "wiedererkennen".

Und gibt es eine andere Möglichkeit als das Passwort für den Login-Bereich im Klartext abzulegen?

Nein. Zumindest keine, bei der das Passwort nicht früher oder später (spätestens beim Absenden des Requests) zumindest kurzzeitig im Klartext vorliegt.

1
BruderTopf 
Fragesteller
 15.02.2018, 09:13
@Isendrak

Alles klar. Das hilft mir schon sehr weiter, damit ich weiß, in welche Themen ich mich einlesen werde. Vielen Dank!

0
KarlRanseierIII  15.02.2018, 09:15
@BruderTopf

HTTP ist generell erstmal Zustandslos - Die Erkennung, ob jemand angemeldet ist, erfolgt im Prinzip über eine Sitzung auf Seiten des Servers und diese wird entweder in die URI codiert oder in einem Cookie. D.h.

Du müßtest für die Seite entsprechend mal schauen, ob die einen Sessioncookie verwendet und wenn ja, nimmst Du der Einfachheit halber die http cookie Bibliothek. Ein wenig wirst Du Dich einlesen müssen (Ich habe die Python-Bibliotheken und Schnittstellen auch nicht im Kopf).

Eigentlich gab es ja mal sowas wie HTTP-Authentisierung, nur ist das mit dem ganzen PHP-Gerotze aus der Mode gekommen.

Wie dem Auch sei, wenn Du Dir mal die Standardbibliothek von PYthon für Internet und Markup anschaust, damit hast Du vieles 'schlüsselfertig'.

-----

Ich gehe (Im Moment) davon aus, daß Du ein POST() mit PW+Login machst, einen Cookie bekommst, diesen dann einfach beim Aufruf der Unterseite wiederverwendest und dann mit dem simple html das Dokument parsen lässt und rausziehst was Du benötigst.

https://docs.python.org/3/library/index.html für 3.6

Beachte insbesondere Kapitel 19-21. Gutes gelingen!

Ergänzung noch zum Passwort, natürlich sollte die http client lib auch ssl unterstützen, davon gehe ich mal stillschweigend aus.

0
Isendrak  15.02.2018, 09:26
@BruderTopf

Zu den erwähnten Cookies noch ne Kleinigkeit:

Diese findest du in Response-Headern mit dem Key "Set-Cookie".

Für ne PHP-Session-ID sieht das z.B. so aus:

Set-Cookie: PHPSESSID=rj773vlcbk1v6485b80apq4lk7; path=/

Nach dem Login müsstest du dann z.B. für jeden Folgerequest diesen Header setzen:

Cookie: PHPSESSID=rj773vlcbk1v6485b80apq4lk7

Achtung: Der Name des Cookies muss nicht unbedingt PHPSESSID lauten.

Daher solltest du im Grunde bei jedem Response nach allen Set-Cookie Headern suchen, diese auswerten und beim nächsten Request mit zurückschicken.

Noch zum Aufbau eines Set-Cookie Headers:

Set-Cookie: <Name>=<Inhalt>; [path=<Gültigkeitsbereich ("/" = Gilt für die Gesamte Seite und alle Unterseiten)>;] [Expires=<Gültig bis zu diesem Datum>;] [Secure;] [HttpOnly]

Siehe auch: https://de.wikipedia.org/wiki/HTTP-Cookie

1
KarlRanseierIII  15.02.2018, 09:34
@Isendrak

Das Cookie-Handling überlässt man der http client lib, diese erzeugt unter anderem automatisch (automagisch?) ein Cookiejar (Kekse-Glas), das die Verarbeitugn erleichtert. Es benötigt, wie gesagt, etwas Einarbeitung, aber man bekommt wirklich fast alles auf dem Silbertablett.

Anmerkung:

Es gibt auch urllib request, die flexibler und erweiterbarer ist.

1
Isendrak  15.02.2018, 10:50
@KarlRanseierIII
Es benötigt, wie gesagt, etwas Einarbeitung, aber man bekommt wirklich fast alles auf dem Silbertablett.

Dann bin ich offenbar jemand, der sich seine Speisen auf einem eigenhandgeschmiedeten Eisentablett selbst serviert... ;)

Hab mich bisher eher weniger mit den "Komfortfunktionen" von http.client befasst, stattdessen weitestgehend manuell hantiert.

Man könnte also sagen, dass ich gelegentlich so programmiere, wie Klingonen Wellnessurlaub machen... ;)

P.S.: Man kann jetzt natürlich auch die http.* Libs komplett weglassen und mit socket.socket anfangen, aber wer will das schon (ausser evtl. n paar Verrückte wie z.B. Ich ;)?

2
KarlRanseierIII  15.02.2018, 10:57
@Isendrak

Ach, wenn man Protokolle verstehen möchte oder selbst implementiert, dann muß man schon auf sockets gehen (oder wenn man die Daten eines Raw-Sockets benötigt). Allerdings wäre das für den gefragten Fall dann doch etwas Overkill.

Ich neige manchmal auch dazu klingonisch zu programmieren, keine Frage :-D.

Manchmal ist es echt einfacher etwas unflexibles schnell runterzutippen, bei größeren Apps oder zukünftiger Wiederverwendung lohnt sich dann der Blick auf entsprechende Standardbibliotheken. Vor allem, wenn man die RFCs nicht kennt etc. ist es einfacher anderen diesen Kram zu überlassen.

2