Login auf einer Webseite

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

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
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

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>
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

ähm.. versteh ich jetzt nicht ganz.. was soll ich mit dem form action machen ?
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

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!
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

der code ist ja auf der webseite... den kann ich ja nicht verändern
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

ja, aber ohne das FORM-Tag kannst du die Daten nicht an das Python-Script übermittelt...
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

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..
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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).
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

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..
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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? ;)
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

ja vielen Dank :-)
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

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
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

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..
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten