Seite 1 von 1
Login auf einer Webseite
Verfasst: Dienstag 23. Dezember 2008, 17:43
von Teabag
Hallo, ich will mich auf einer Webseite einloggen.. hier der Quellcode der Webseite:
Code: Alles auswählen
<fieldset>
<label for="Login_email">E-Mail</label><br />
<input onfocus="this.hasfocus='yes';" class="fieldText" type="text" name="email" id="Login_email" value="" /><br />
<label for="Login_password">Passwort</label><br />
<input onfocus="this.hasfocus='yes';" class="fieldText" type="password" name="password" id="Login_password" value="" /><br />
<input onfocus="this.hasfocus='yes';" class="fieldBtnSubmit" type="submit" name="login" value="Einloggen" />
<input type="hidden" name="jsEnabled" id="jsEnabled" value="false" />
<script type="text/javascript">
document.getElementById('jsEnabled').value = 'true';
</script>
<input type="hidden" name="formkey" value="39676914ee20e8ab0e787abeb5a67c2edb68c4c8458e784e5a74c81ef53c52d1aee84b85fa32bac46fd959949e4657991fb0780877524189c29f7e3d5499f6ac" />
<input type="hidden" name="iv" value="909e9b827a4e3d4bd49c03139d32d02c" />
<input type="hidden" name="checkcode" value="da9bcd35c32d9062e79dff7457cb43cb" />
</fieldset>
jetzt habe ich folgenden script geschrieben :
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import sys
import mechanize
import urllib
import urllib2
sys.stderr = file("zerrors.log", "w")
def login():
# Login
loginurl = "webseite"
logindata = urllib.urlencode(
{
"email": "email",
"password": "passwort",
"login": "Einloggen",
"jsEnabled": "false",
"formkey": "39676914ee20e8ab0e787abeb5a67c2edb68c4c8458e784e5a74c81ef53c52d1aee84b85fa32bac46fd959949e4657991fb0780877524189c29f7e3d5499f6ac",
"checkcode": "da9bcd35c32d9062e79dff7457cb43cb",
}
)
response = mechanize.urlopen(loginurl, logindata)
response.read()
login()
jedoch funktionert das nicht... ich bin mir auch nicht ganz sicher mit den ganzen input feldern.. Kann mir da jemand weiterhelfen ?
schon mal vielen Dank
Teabag
Verfasst: Dienstag 23. Dezember 2008, 17:54
von Birne94
du hast imo das
form-tag vergessen, falls ich dich richtig verstanden habe...
Code: Alles auswählen
<form action="script.py" method="POST">
[FELDER]
</form>
Verfasst: Dienstag 23. Dezember 2008, 17:57
von Teabag
ähm.. versteh ich jetzt nicht ganz.. was soll ich mit dem form action machen ?
Verfasst: Dienstag 23. Dezember 2008, 18:00
von snafu
Muss man das wirklich so kompliziert machen? Du musst doch - wenn ich dich jetzt nicht völlig missverstehe - einfach nur Email und Passwort von Mechanize eintragen lassen und dann submit() ausführen...
Verfasst: Dienstag 23. Dezember 2008, 18:11
von Birne94
Teabag hat geschrieben:ähm.. versteh ich jetzt nicht ganz.. was soll ich mit dem form action machen ?
Du schreibst:
Code: Alles auswählen
<form action="script.py" method="POST">
<fieldset>
<label for="Login_email">E-Mail</label><br />
<input onfocus="this.hasfocus='yes';" class="fieldText" type="text" name="email" id="Login_email" value="" /><br />
<label for="Login_password">Passwort</label><br />
<input onfocus="this.hasfocus='yes';" class="fieldText" type="password" name="password" id="Login_password" value="" /><br />
<input onfocus="this.hasfocus='yes';" class="fieldBtnSubmit" type="submit" name="login" value="Einloggen" />
<input type="hidden" name="jsEnabled" id="jsEnabled" value="false" />
<script type="text/javascript">
document.getElementById('jsEnabled').value = 'true';
</script>
<input type="hidden" name="formkey" value="39676914ee20e8ab0e787abeb5a67c2edb68c4c8458e784e5a74c81ef53c52d1aee84b85fa32bac46fd959949e4657991fb0780877524189c29f7e3d5499f6ac" />
<input type="hidden" name="iv" value="909e9b827a4e3d4bd49c03139d32d02c" />
<input type="hidden" name="checkcode" value="da9bcd35c32d9062e79dff7457cb43cb" />
</fieldset>
</form>
so werden dann die Daten an dein Script weitergeleitet.
Du musst nur oben bei action den Dateinamen zum Python-script angeben!
Verfasst: Dienstag 23. Dezember 2008, 18:27
von Teabag
der code ist ja auf der webseite... den kann ich ja nicht verändern
Verfasst: Dienstag 23. Dezember 2008, 18:35
von Birne94
ja, aber ohne das FORM-Tag kannst du die Daten nicht an das Python-Script übermittelt...
Verfasst: Dienstag 23. Dezember 2008, 18:44
von Teabag
aber ich kann den tag ja nicht einfügen.. es muss doch irgend eine andere Lösung geben sich auf einer webseite einzuloggen.. ohne dort ein form tag zu haben..
Verfasst: Dienstag 23. Dezember 2008, 18:48
von snafu
Wie bereits angedeutet: Nutze den Parser von ClientForm, damit du weißt wie du in die einzelnen Felder kommst, lass diese vom Skript ausfüllen und lasse Mechanize dann den Submit-Button drücken. Ich bin mir ziemlich sicher, dass dies genau das ist, was du eigentlich willst. Wenn du etwas daran nicht verstehst, kannst du gerne nochmal im Detail fragen. Aber dies wäre wie gesagt der "übliche Weg" (wie man auch an einer ganzen Reihe von Beiträgen hier im Forum zum Thema "Einloggen auf einer Website" belegen könnte).
Verfasst: Dienstag 23. Dezember 2008, 19:08
von Teabag
hm versteh ich jetzt nicht ganz.. hab mal mit der forumsuche gesucht..
und bin dadrauf gestossen..
aber verstehen tu ich das nicht ganz.. wo muss man jetzt die login daten angeben..
hinter name =
oder in den string davor...
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import mechanize
import ClientForm
from ClientForm import ParseResponse
# Call html document and store cookie
request = mechanize.Request("http://www.stooq.pl/")
response = mechanize.urlopen(request)
# Read the form here form[2]
forms = ParseResponse(response, backwards_compat=False)
form = forms[2]
# Set login and password
form.set_value("######", name="login")
form.set_value("######", name="haslo")
# Send form
request = form.click()
response = mechanize.urlopen(request)
request = mechanize.Request("http://stooq.pl/bazy/waluty.html")
response = mechanize.urlopen(request)
forms = ParseResponse(response, backwards_compat=False)
form = forms[3]
# Set values for file
...
# Hier wird die Datei erzeugt die ich speichern möchte
request = form.click()
#response = mechanize.urlopen(request)
print request
response.close()
und wo wird da geklickt..
wäre super nett wenn mir das jemand erklären könnte..
Verfasst: Dienstag 23. Dezember 2008, 19:28
von snafu
Ich verdeutliche dir das mal an ein paar Auszügen aus dem Interpreter am Beispiel von Freemail:
Code: Alles auswählen
In [1]: from ClientForm import ParseResponse
In [2]: from urllib import urlopen
In [3]: response = urlopen('http://freemail.de/')
In [4]: forms = ParseResponse(response, backwards_compat=False)
In [5]: print forms[0]
<s GET http://suche.web.de/search/web/ application/x-www-form-urlencoded
<HiddenControl(mc=hp@suche.suche@home) (readonly)>
<HiddenControl(mc=hp@suche.suche@home) (readonly)>
<TextControl(su=)>
<ImageControl(<None>=Suchen)>>
In [6]: print forms[1]
<fm POST https://login.web.de/intern/login/ application/x-www-form-urlencoded
<HiddenControl(service=freemail) (readonly)>
<HiddenControl(server=https://freemail.web.de) (readonly)>
<HiddenControl(onerror=https://freemail.web.de/msg/temporaer.htm) (readonly)>
<HiddenControl(onfail=https://freemail.web.de/msg/logonfailed.htm) (readonly)>
<TextControl(username=)>
<PasswordControl(password=)>
<SubmitControl(rv_dologon=Login) (readonly)>>
Wie du siehst, wird dir eine Liste zurückgeliefert, die ich an "forms" gebunden habe. Diese Liste gehe ich in der Regel solange durch bis ich auf's Login-Feld stoße. Hier also das zweite Element der Liste. Und dann würde es mit einer Browser-Sitzung weitergehen:
Code: Alles auswählen
import mechanize
br = mechanize.Browser()
br.open('http://freemail.de/')
br.select_form(nr=1) # denn es war ja das Element mit dem Index 1
br['username'] = 'xyz@web.de' # die Bezeichnung "username" ist von oben übernommen
br['password'] = 'pw123'
br.submit() # drückt den Submit-Button zum Senden der Daten
Und dann kannst du wieder br.open() benutzen, um dich im internen Bereich des Anbieters zu bewegen.
Jetzt einigermaßen klar geworden?

Verfasst: Dienstag 23. Dezember 2008, 19:42
von Teabag
ja vielen Dank

Verfasst: Dienstag 23. Dezember 2008, 19:55
von Teabag
hm also ich hab das jetzt mal ausprobiert..
Code: Alles auswählen
# -*- coding: cp1252 -*-
from ClientForm import ParseResponse
from urllib import urlopen
import mechanize
response = urlopen('http://schuelervz.net/')
forms = ParseResponse(response, backwards_compat=False)
so müsste der erste teil doch stimmen.. dem "importieren" vom formular oder ?
doch wenn ich mir jetzt forms[1] printen lass.. kommt index out of range..
zweiter teil müsste doch das sein ..
Code: Alles auswählen
br = mechanize.Browser()
br.open('http://schuelervz.net/')
br.select_form(nr=1) # denn es war ja das Element mit dem Index 1
br['email'] = 'email' # die Bezeichnung "username" ist von oben übernommen
br['password'] = 'pw'
br.submit() # drückt den Submit-Button zum Senden der Daten
wenn ich das kombiniere kommt der error:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Teabag\Desktop\login.py", line 12, in <module>
br.select_form(nr=1) # denn es war ja das Element mit dem Index 1
File "D:\Programme\Python25\lib\site-packages\mechanize\_mechanize.py", line 510, in select_form
raise FormNotFoundError("no form matching "+description)
FormNotFoundError: no form matching nr 1
?? versteh ich jetzt nicht ganz..
danke
Verfasst: Dienstag 23. Dezember 2008, 20:18
von snafu
Die Liste hat in dem Fall eben nur ein Element. Und das erste Element hat bei Python den Index 0 und nicht 1. Das ganze wird dir auch an zwei Stellen von Python deutlich gemacht. Meine Kommentare im Quelltext hatten schon einen gewissen Sinn. Vielleicht wäre es besser, wenn du dich erstmal grundlegend mit Python beschäftigst. Ich habe das Gefühl, da besteht noch ein bißchen Nachholbedarf. Ist ja auch nicht weiter schlimm. Du könntest z.B. mal das oft empfohlene Python Tutorial durcharbeiten und dich dann nochmal an die Aufgabe wagen. Denn Code stumpf übernehmen und hier und da eine URL ändern wird dich nicht wirklich weiterbringen. Das ist nicht böse gemeint, aber du willst ja auch irgendwie etwas lernen, oder nicht?
Teabag hat geschrieben:so müsste der erste teil doch stimmen.. dem "importieren" vom formular oder ?
Da wird nichts importiert, da wird ein Element - bzw dessen Rückgabewert - an einen Namen gebunden. Wie gesagt: Das sind Grundlagen und sowas musst du dir einfach selber aneignen, wenn du eine Programmiersprache lernen willst...
Verfasst: Mittwoch 24. Dezember 2008, 11:40
von Teabag
also das das erste Element den Index 0 hat weis ich, doch ich bei
print forms[0] kommt auch der "index out of range" Fehler, also gibt es garkeine Elemente in der Liste.
und ich denke schon dass ich mich einigermasen mit python auskenne, jedoch habe ich noch nie etwas gemacht was in diese Richtung geht.. Also mit Webseiten...einloggen... formulare ausfüllen lassen..etc..
Verfasst: Mittwoch 24. Dezember 2008, 12:10
von Leonidas
Dann enthält eben die Seite die du ausfüllen willst keine Kommentare. Lass dir mal den HTML-Code ausgeben und finde heraus warum das so ist.
Verfasst: Mittwoch 24. Dezember 2008, 12:18
von snafu
Also bei meinem Versuch mit SchülerVZ (welches du ja genannt hattest) bekam ich genau ein Element zurück und die Felder "email" und "password" sind auch ansprechbar.
Verfasst: Mittwoch 24. Dezember 2008, 12:25
von Leonidas
Na wir hoffen mal dass SchuelerVZ nur ein Beispiel war, denn in deren
AGBs verbieten sie solche Crawler (Punkt 9.2, zweiter Auflistungspunkt) und im Forum wollen wir nicht zum Verstossen gegen AGBs aufrufen.