Python3 Webseiten Login

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
osys
User
Beiträge: 9
Registriert: Dienstag 4. August 2015, 18:14

Hallo Leute,

ich versuche mich mit Python3 bei folgendem Login-Form anzumelden:

Code: Alles auswählen

<form method="post" style="display:inline" id="login" action="login.php?modul=do_login">
		Benutzername: <input type="text" name="FSusername" class="inputbox" style="width:70;" />
		Passwort: <input type="password" name="FSpassword" class="inputbox" style="width:70;" />
         <input type="submit" name="login" value="GO" class="button" style="width:23; height:16;" />
</form>
Folgende Skripte brachten keinen Erfolg:

Code: Alles auswählen

import sys
import urllib.request
import urllib.parse
class happy(urllib.request.FancyURLopener):
    def __init__(self, proxies=None, **args):
        urllib.request.FancyURLopener.__init__(self, proxies, **args)

    def prompt_user_passwd(self, host, realm):
        return {"FSusername": "Meinnutzername", "FSpassword": "meinpasswort"}

opener = happy()
f = opener.open("http://www.meineseite.de/login.php")
print(f.read())

Code: Alles auswählen

import sys
import urllib.request
import urllib.parse
datas = urllib.parse.urlencode({"FSusername": "Meinnutzername",
                               "FSpassword": "meinpasswort"})
try:
    u = urllib.request.urlopen \
        ("http://meineseite.de/login.php", datas)

except:
    print ("Keine Verbindung")
    sys.exit(0)


ant = u.readlines()
print(ant)
u.close()
Ergebnis:

Skript 1: Kein Login --> Seitenausgabe, dass PW sei falsch
Skript 2: "Keine Verbindung" und sys.exit(0)

Da ich in Python3 schreibe konnte ich "requests" und "mechanize" nicht importieren. Mein Wunsch ist es, dieses Problem mittels Boardmitteln zu lösen. Habt ihr ne Idee?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

osys hat geschrieben:Da ich in Python3 schreibe konnte ich "requests" und "mechanize" nicht importieren.
Das ist jetzt zwar nicht dein eigentliches Problem, aber warum kannst du requests nicht mit Python 3 verwenden?
BlackJack

Der ``modul=do_login``-Teil taucht in keinem der beiden Versuche auf und manchmal muss man wirklich alle Eingaben übermitteln, also auch das 'login' und 'GO' vom 'submit'-<input>.

Beim zweiten Skript ist die Fehlerbehandlung kaputt. Die gibt auch 'Keine Verbindung' aus wenn andere Fehler als Verbindungsfehler aufgetreten sind. Sogar wenn Du Dich bei einem Namen vertippt hast wird diese Meldung ausgegeben. Viel Spass dabei solche Fehler dann zu finden. :-P

Ansonsten → `requests` installieren. :-)
osys
User
Beiträge: 9
Registriert: Dienstag 4. August 2015, 18:14

BlackJack hat geschrieben:Der ``modul=do_login``-Teil taucht in keinem der beiden Versuche auf und manchmal muss man wirklich alle Eingaben übermitteln, also auch das 'login' und 'GO' vom 'submit'-<input>.

Beim zweiten Skript ist die Fehlerbehandlung kaputt. Die gibt auch 'Keine Verbindung' aus wenn andere Fehler als Verbindungsfehler aufgetreten sind. Sogar wenn Du Dich bei einem Namen vertippt hast wird diese Meldung ausgegeben. Viel Spass dabei solche Fehler dann zu finden. :-P

Ansonsten → `requests` installieren. :-)
Danke für die Hilfe, habe sogar eine elegante Methode gefunden, die ich hier einmal erläutern will, für Google:

Login mit Cookie auf Webseiten:

Code: Alles auswählen

import urllib.request
import urllib.parse
import http.cookiejar

#---------------------------------------------------
#-Login auf der Seite

datas = urllib.parse.urlencode({"FSusername": "Username", #// Hier werden die Log-In Daten eingetragen
                               "FSpassword": "Password"})

binary_data = datas.encode() #// Aus dem Dic wird byte
cj = http.cookiejar.CookieJar() #// wir binden cookiejar an cj
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) #// Es wird der opener deklariert
r = opener.open("http://happy-security.de/login.php?modul=do_login", binary_data) #// Wir bauen eine Verbindung auf und senden die Log-In Daten.
content = r.read() #// Wir lesen die Antwort vom Server
r.close()#//Wir beenden die Verbindung
Trotz "r.close()" bleibt der Cookie erhalten und wir können erneut eine Verbindung aufbauen und uns auf der Seite weiterbewegen und bleiben natürlich eingeloggt. Die Variable für einen neuen Log-In ist frei wählbar. Die nächste Verbindung kann also auch "z=opener.open(#####)" sein. Have Fun!

Anregung?! Immer her damit!
/me hat geschrieben:
osys hat geschrieben:Da ich in Python3 schreibe konnte ich "requests" und "mechanize" nicht importieren.
Das ist jetzt zwar nicht dein eigentliches Problem, aber warum kannst du requests nicht mit Python 3 verwenden?
Ich nutze die Standard Installation unter Linux Kali und habe dieses Modul leider nicht.

Code: Alles auswählen

>>> import requests
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import requests
ImportError: No module named requests
BlackJack

@osys: Na dann installiert das Modul/Package halt. :roll:
osys
User
Beiträge: 9
Registriert: Dienstag 4. August 2015, 18:14

Ist ja nun nicht mehr nötig. Ich habe ja eine, wie gesagt elegante Lösung, gefunden.

Mal eine andere Frage:

Wie macht ihr dass, wenn ihr Module nachinstallieren müsst und das Skript jemandem weitergeben wollt. Packt ihr die Module gleich mit dazu oder schreibt ihr ne README mit den nachzuinstallierenden Modulen?
BlackJack

@osys: Elegant ist das nicht wirklich denn nur weil die API in der Standardbibliothek so etwas wie Eleganz vermissen lässt, gibt es doch überhaupt `requests`. So dass man eben nicht jeden Kleinkram selber machen muss, mit über zig Module verteilten Funktionen und Klassen. Ungetestet:

Code: Alles auswählen

import requests


def main():
    with requests.session() as session:
        response = session.post(
            'http://happy-security.de/login.php',
            {'FSusername': 'Username', 'FSpassword': 'Password'},
            params={'modul': 'do_login'},
        )
        content = response.content  # Oder `response.text`/`response.json()`.
        # 
        # Das `session`-Objekt sorgt für die Cookieverwaltung.
        # 


if __name__ == '__main__':
    main()
Antworten