Einloggen auf einer Website (mechanize)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Hallo,

ich hab ein bisschen im Forum rumgesucht, aber nix passendes gefunden - bis auch das Modul mechanize, bei dem ich aber keine Doku finde, die mir hilft.
Was ich machen möchte: Ich will mich auf Webseiten einloggen, um mir bestimmte Informationen ausgeben zu lassen :wink: Da ich keine Lust habe immer wieder ne andere Seite aufzurufen, wollte ich mir ein Skript schreiben, dass das erledigt.
Leider scheitere ich schon beim login :lol:
Nehmen wir einfach mal als Beispiel www.wetl1.travian.de (ist ein Browsergame) dort will ich mich einloggen und schauen, ob ich eine PN bekommen habe bzw angegriffen werde.
Ich habe in dem Beitrag, in dem ich mechanize gefunden habe, ein kurzes Bsp von Gerold gefunden. Leider komme ich, wenn ich es ausführe nicht in das Spiel rein, sondern lande wieder auf der Login-Seite.
Die einzige Doku, die ich zu mechanize gefunden habe hat mir nicht viel geholfen (http://wwwsearch.sourceforge.net/mechanize/doc.html).
Hier mal das Skript:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import mechanize
import urllib

# Login
loginurl = "http://welt1.travian.de/login.php"
logindata = urllib.urlencode(
    {
        "e42e285": "Nidhöggr",
        "eee3ed2": "2b34nd",
        "e0073f5": "4eac5ffe42",
        "login": "1180269803",
        "w": "",
        "s1": "login",
        "autologin": "ja"
    }
)
response = mechanize.urlopen(loginurl, logindata)
response.read() # wichtig

posteingangurl = "http://welt1.travian.de/nachrichten.php"
response = mechanize.urlopen(posteingangurl)
#schreibe den htmloutput in eine Datei,
#damit man das Ergebniss anschauen kann
f = file('output.html','w')
f.write(response.read())
f.close()
Ich hoffe, ihr habt ne Idee, wie ich das zum Laufen bekommen kann.
LG
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

CrackPod hat geschrieben:Leider scheitere ich schon beim login :lol:
Nehmen wir einfach mal als Beispiel www.wetl1.travian.de (ist ein Browsergame) dort will ich mich einloggen und schauen, ob ich eine PN bekommen habe bzw angegriffen werde.
Hallo CrackPod!

Im Quelltext der Seite http://welt1.travian.de/login.php steht das hier:

Code: Alles auswählen

<form method="post" name="snd" action="dorf1.php">
Das sagt aus, dass beim Klicken auf den Submit-Button die Seite "dorf1.php" aufgerufen wird. Dabei wird an diese Seite alles mitgegeben, was in das Formular eingegeben wurde.

Du musst also "dorf1.php" mit den Logindaten aufrufen und nicht "login.php". Danach kannst du "nachrichten.php" zum Lesen der Nachrichten aufrufen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Pass aber auf da Bots untersagt sind.
Also nicht zuviel, zuschnell klicken und Browser Header vom IE oder Mozilla mit senden :-D

Wenn mechanize das nicht standard mäßig eh schon macht.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo CrackPod!

Code: Alles auswählen

        "e42e285": "Nidhöggr",
        "eee3ed2": "2b34nd",
        "e0073f5": "4eac5ffe42",
Diese Zeilen machen mir mehr Sorgen. Falls diese unsichtbaren Felder, deren Name und Wert sich ändert, dazu da sind, einen Bot abzuwehren, dann würde ich das als ernsthafte Aussage gegen eine automatische Anmeldung ansehen.

Man könnte das Login-Formular parsen, bevor man zur nächsten Seite weiter geht, aber lass es lieber. Du kannst dir damit nur Ärger einhandeln. Ausgenommen natürlich, wenn du dir die Erlaubnis der Seitenbetreiber einholst. Du könntest ja ausmachen, dass dein Programm eine bestimmte Signatur hinterlässt und sich nicht als IE oder Firefox ausgibt...

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Ich habe damals bei meinem Browsergame mal den LoginButton durch eine Grafik ersetzt um die Koordinaten des Clicks auszulesen. Ohne Koordinaten -> Bot :)
Die Änderung hab ich natürlich über Nacht durchgeführt und etliche Bots gefunden.

Es war aber immer dasselbe. Irgendjemand hat irgendetwas automatisiert, ich musste es ändern, jemand hat was anderes automatisiert, ich habs geändert, jemand hat .......

lgherby
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ich würde fast vermuten, dass bei der Benutzung von Enter oder Tab+Space auch keine Koordinaten gesendet werden...
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Jap die Enter bestätigung ist garnicht so selten.
100% melde ich mich mit Enter an wenn ich Username und Passwort eingeben muss andernfalls wenns ausgefüllt ist klicke ich auch mal.

Aber wie lese ich die Koords des Klicks aus? Geht doch nur per JS und bei der nächsten Seite die Daten auswerten und ggf speichern und JS kann deaktiviert sein.

Spontan eingefügte unsichtbare Felder finde ich besser. ;-)
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Bei "enter" waren die koordinaten x=0 und y=0
Und das lief ohne JS, scheint so als ob der Browser so "freundlich" ist und die erstellt.

Hier die PHPFAQ, sollte in Python auch möglich sein.

http://www.php-faq.de/q/q-formular-image.html

lgherby
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich gebe zu - das kannte ich noch nicht. Ich halte sowas auch für von eher geringem Nutzen.
Nun, aber was hindert jetzt jemanden, der einen Bot schreibt auch diese Koordinaten mitzuschicken? Klar, es verkompliziert das ganze etwas, aber nicht sonderlich. Spätestens mit einem Sniffer weiß man, was man welche Daten man an den Server schicken muss, um sich einzuloggen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Naja, wie ich schon geschrieben habe hilft es ja nicht ;)
Ich hab halt solche Bereiche immer von Zeit zu Zeit geändert um die Botbesitzer zu überraschen :)

lgherby
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Sehr geil danke.
(Ab zu den Lesezeichen)

Das soetwas ohne JS Möglichist wundert mich.

Das fairste ist wenn das Browsergame ne API rausbringt ;-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Bei einem Formular, das über einen Submit-Button vom Typ "image" abgesendet wird, werden die Parameter x und y mitgesendet - notfalls jeweils mit dem Wert 0.

Das habe ich vor Jahren mal verwendet, damit man so den eigenen Wohnort auf einer Landkarte markieren kann.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Erstmal: Danke für eure Hilfe bisher :)
Ich muss sagen, das Ding zu knacken wird ein hartes Ei, da extrem viele Steine im Weg liegen.
Mittlerweile seh ich die Sache mehr als Übungszweck, bei der ich mehr lern, als dass ich aus dem Ding großen Nutzen hätte =D
LG
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

CrackPod hat geschrieben:Mittlerweile seh ich die Sache mehr als Übungszweck, bei der ich mehr lern, als dass ich aus dem Ding großen Nutzen hätte
Hallo CrackPod!

Dann sieh dir mal ClientForm an. Das ist inzwischen in Mechanize integriert.

Die Vorgehensweise ist die:
- mit ClientForm das Login-Formular öffnen
- Benutzername und Passwort übergeben
- submitten

Das lässt sich alles mit ClientForm machen. Damit musst du dich nicht selber um das Parsen der TAGs kümmern. Beispiele sollten auf der Website von ClientForm zu finden sein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Hallo,

danke für die Hilfe bisher, aber bei einem Problem weiß ich nicht, wie ich es lösen soll:
Das Image, das als Submitbutton fungiert, übergibt ja die Koordinaten des Klicks. Wie sehen da die Postdaten aus? Sprich, wie übergebe ich diese dem Script, was meinen Request verarbeitet?
LG
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Y0Gi hat geschrieben:Bei einem Formular, das über einen Submit-Button vom Typ "image" abgesendet wird, werden die Parameter x und y mitgesendet - notfalls jeweils mit dem Wert 0.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Ok, den Login hab ich jetz schon gemeistert =)
Aber eines Frage ich mich: Wenn ich das hier durchlaufen lasse:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import ClientForm
from urllib2 import urlopen

response = urlopen('http://welt1.travian.de/login.php')
form = ClientForm.ParseResponse(response, backwards_compat=False)[0]
response.close()
print form
Dann bekomm ich folgenden print:
<snd POST http://welt1.travian.de/dorf1.php application/x-www-form-urlencoded
<HiddenControl(w=) (readonly)>
<HiddenControl(login=1181149541) (readonly)>
<TextControl(e6fafb6=)>
<PasswordControl(ebab27a=)>
<HiddenControl(e6d172f=) (readonly)>
<ImageControl(s1=login)>
<CheckboxControl(autologin=[*ja])>>
Das letzte HiddenControl Feld hat keinen Wert. Wenn ich jedoch die Seite automatisch aufrufe und mir den Quellcode ansehen, hat dieses Feld einen Wert(jetz z.B.:

Code: Alles auswählen

<input type="hidden" name="e6d172f" value="4eac5ffe42">
) Wieso wird der von ClientForm nicht ausgelesen? Ich hab in der JS Datei keine Funktion gefunden, die das Feld automatisch beschreibt, was ja von ClientForm wahrscheinlich nicht gelesen werden könnte, wenns nach dem Laden beschrieben wird.
Gibts ne Möglichkeit dieses Feld trotzdem noch auszulesen?
LG
Itsjustme
User
Beiträge: 13
Registriert: Mittwoch 5. März 2008, 16:40
Wohnort: Köln
Kontaktdaten:

hi ich habe grade das gleiche problem aber kriege den login irgendwie nicht hin wär cool wenn du deins klappend nochmal postest oder jemand mir sagen kann was hier falsch ist

Code: Alles auswählen

###!/usr/bin/env python
### -*- coding: iso-8859-15 -*-

import mechanize
import urllib

# Login
loginurl = "http://www.jappy.de/start"
logindata = urllib.urlencode(
    {
        "login[u]": "User",
        "login[p]": "Password",
        "Submit": "login",
        "<None>":"[*on]",
        
    }
)
response = mechanize.urlopen(loginurl, logindata)
response.read() # wichtig

posteingangurl = "http://www.jappy.de/"
response = mechanize.urlopen(posteingangurl)
#schreibe den htmloutput in eine Datei,
#damit man das Ergebniss anschauen kann
f = file('output.html','w')
f.write(response.read())
f.close()
mfg Itsjustme
Antworten