Login auf Webseite; 2 cookies = problem ?

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.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

Hey, also ich komm hier grad nicht weiter.
Mein Problem ist dass ich mich auf einer Website einloggen möchte. Ich habe mir bereits eine Funktion geschrieben, welche dies für mich erledigt damit ich ganz normal mit urllib2.urlopen('url').read() den Quelltext auslesen kann.
Allerdings funktionierts bei einer Seite nicht. Ich hab mir sagen lassen die Seite legt 2 Cookies an . aber eigentlich sollte das ja kein Problem sein. In den Python docs steht ja heim Cookie Handling drin dass es mit cookieS umgeht...

Wie dem auch sei ich geb euch mal meinen bisherigen Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import urllib2
import cookielib
import urllib

def login(loginurl):
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

    headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8',
    'Accept' : ' text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
    'Accept-Language' : 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3',
    'Accept-Encoding' : 'gzip,deflate',
    'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
    'Keep-Alive' : '300',
    'Connection' : 'keep-alive',
    'Referer' : 'http://www.google.de',
    } 

    values = {'loginName':'blabla-name', 'password':'blabla-pass' }
    data = urllib.urlencode(values)
    request = urllib2.Request(loginurl, data, headers)
    url = opener.open(request)
    urllib2.install_opener(opener)
    print urllib2.urlopen(urllib2.Request('http://www.wer-kennt-wen.de/start', None, headers)).read()

login('http://www.wer-kennt-wen.de')
aus dem Code geht ja hervor dass es sich um wkw handelt. Nunja bei dem print in der Funktion (nur zu Testzwecken dort ;) ) sollte eigentlich dann der Quelltext ausgegeben werden von der wkw.../start seite. wird es aber nicht ich bekomme immer eine wo drauf steht, dass mein Browser keine Cookies akzeptieren würde. Was ja aber schlecht sein kann denn in Zeile 7/8 sorg ich ja dafür dass er damit umgeht.

Hat einer Rat ?

Danke schonmal,
mfg
Sunjy
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Willst du wirklich den Quelltext in deinem Python-Programm oder willst du nur automatisch einloggen?
Wenn es nur um das einloggen geht, kannst du das viel einfacher realisieren und direkt über deinen Browser machen.

Und dein CookieBeispiel funktioniert so natürlich noch nicht.
Was z.B. fehlt:

Code: Alles auswählen

cj.load(Filename)
Schau dir z.B. diese Seite mal noch an, finde es ziemlich gut beschrieben
http://www.voidspace.org.uk/python/arti ... elib.shtml
Den Teil mit ClientCookie kannst ja ignorieren.
Zuletzt geändert von ms4py am Donnerstag 16. April 2009, 23:09, insgesamt 1-mal geändert.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

es soll alles in python geschehen ( und ohne mechanize )
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Code: Alles auswählen

def login(loginurl):
    cj = cookielib.CookieJar()
    cj.load("test.dat")
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    urllib2.install_opener(opener)

    headers = { #dein code
    }

    values = {'loginName':'blabla-name', 'password':'blabla-pass' }
    data = urllib.urlencode(values)
    request = urllib2.Request(loginurl, data, headers)
    handle = urllib2.urlopen(request)
    print handle.read()
Ungetestet.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

ice2k3 hat geschrieben:Ungetestet.
geht auch leider nicht. ich weis auch nicht ganz was du versuchst. cj.load() kann nicht gehen laut docs gibt es nur bei FileCookieJar() ein load(). Ich habe mich aber von dir inspirieren lassen und habe das Cookie mit

Code: Alles auswählen

    cj = cookielib.FileCookieJar('test.dat')
    cj.load('test.dat')
in eine Datei geschrieben und geladen. Es war leider nicht erfolgreich.

Aber ich glaube nicht dass es daran liegt ob ich es in einer Datei speicher oder nicht. es muss etwas anderes sein ich hab aber leider absolut keine Ahnung was.

Sunjy
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Und so?
Ist alles aus dem Tutorial mit dem Link oben:

Code: Alles auswählen

cj = cookielib.LWPCookieJar()
cj.load('test.dat')
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

leider geht auch das nicht, ich bekomme die Fehlermeldung:
LoadError: 'test.lwp' does not look like a Set-Cookie3 (LWP) format file

allerdings habe ich nicht gesehen dass du in deinem Beitrag oben einen link hattest, bzw. editiert hast. den hab ich mir mal angeschaut.
Doch leider bringt mir auch das Tutorial nichts (welches ich übrigens nicht so gut finde. die ganzen try except else 's nerven ziemlich. ich meine man weis ja im Normalfall ob man etwas importieren kann / getan hat oder eben nicht. aber das ist ein anderes Thema.

Aber Irgendwie muss es ja gehen :/
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Nimm doch einfach mal das gesamte Beispiel aus dem Tutorial und versuch es damit.
Das gibt es hier:
http://code.activestate.com/recipes/302930/

Das load darfst du übrigens nicht machen ;) Vielleicht geht es ja schon, wenn du das rausschmeißt. Ansonsten das Beispiel mal testen.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

okay ich habs mal versucht. das Gute ist ich bekomme nun eine andere errorpage zurück. nämlich dass meine Sitzung abgelaufen wäre (und ich cookies aktivieren solle ^^).
ich glaub ich mach mal nen tag pause...
weitere ideen sind trotzdem erwünscht für morgen dann ^^

Vielen dank für deine bisherige (und durchhaltende) Hilfe auch wenns leider nicht so klappt bisher.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Versuch's mal mit der Mechanize-Bibliothek. Die's eigentlich für solche Aufgaben gedacht... und ich hab sie auch immer benutzt.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

naja wie ich bereits sagt wollte ich es eigentlich ohne mechanize machen.
dafür gibts mehrere Gründe, einer davon wäre, dass ich damit noch absolut keine Erfahrung habe und nicht weis wie ich damit umgehen soll. und naja die Dokumentation ist... bescheiden...
sogar bei google find ich nicht wirklich ein brauchbares tutorial und zudem gibts da noch den kram mit "robots" und sehr viele seiten erlauben dies nicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn die ``robots.txt`` das nicht erlauben, dann solltest du das auch nicht machen. Die sind ja nicht zum Spaß da.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cryzed
User
Beiträge: 82
Registriert: Samstag 28. März 2009, 15:53

Code: Alles auswählen

browser = mechanize.Browser()
browser.set_handle_robots(False) # "robots.txt" ignorieren
browser.open("http://www.wer-kennt-wen.de/start") # Seite öffnen
browser.select_form(nr=0) # Erste (und einzige) Form auf der Seite anwählen
browser["loginName"] = "blabla-name" # Die Werte für die Form setzen
browser["pass"] = "blabla-pass"
browser.submit() # Die form mit den Werten abschicken
Ab da an kümmert sich mechanize um alles weitere. Die ".open" Methode gibt ein "file-like" Objekt zurück, d.h um den Source der resultierende Seite zu bekommen kannst du einfach ".read()" aufrufen.
Zuletzt geändert von cryzed am Freitag 25. Dezember 2009, 20:27, insgesamt 1-mal geändert.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

Leonidas hat geschrieben:Wenn die ``robots.txt`` das nicht erlauben, dann solltest du das auch nicht machen. Die sind ja nicht zum Spaß da.
Da hast du schon recht. Aber ich weis im Grunde gar nicht so wirklich über diese robots.txt bescheid. Um ehrlich zu sein interessiert es mich auch nicht sonderlich, ich habe lediglich einmal etwas mit mechanize >versucht< und es klappte nicht, zusätzlich kam eben noch etwas mit rorbots.txt. Vllt sollt ich mir doch mal nen Artikel dazu durchlesen... naja is eben net mein Spezialgebiet.
cryzed hat geschrieben:Ab da an kümmert sich mechanize um alles Weitere. Die ".open" Methode gibt ein "file-like" Objekt zurück, d.h um den Source der resultierende Seite zu bekommen kannst du einfach ".read()" aufrufen.
Danke dein Code funktioniert genau so wie ich das wollte. Eigentlich wollte ich es zwar ohne mechanize machen aber wenn ich es anders nicht hinbekomme solls mir auch so recht sein. Danke :)


Falls allerdings noch irgendwer wirklich weis wieso mein ganz oben geposteter Code nicht funktioniert, kann er es mir ja mitteilen ^^.


Danke für die Hilfe :)
Sunjy
Benutzeravatar
cryzed
User
Beiträge: 82
Registriert: Samstag 28. März 2009, 15:53

Ich vermute mal das du der Seite einen falschen Parameter übergibst. Der Bezeichner "password" heißt nämlich eigentlich nur "pass". Falls du den Mozilla Firefox benutzt empfehle ich dir das Add-on Firebug für solche Dinge.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

Danke das mit Firebug schau ich mir mal an!

Hast recht es ist nur "pass", das ist mir wohl ein Fehler unterlaufen, das blöde ist nur, auch wenn ichs änder in "pass" funktionierts nicht (also mein code, das mit mechanize funktioniert).
Benutzeravatar
cryzed
User
Beiträge: 82
Registriert: Samstag 28. März 2009, 15:53

Wenn ich mit meinem Browser die von dir genannte URL besuche (http://www.wer-kennt-wen.de/start) bekomme ich schon alleine beim Besuch der Seite folgende Meldung:
Du bist noch nicht oder nicht mehr bei wer-kennt-wen eingeloggt.
Bitte aktiviere die Cookies in Deinem Browser, wenn dieser Fehler öfter auftritt.
Wenn Du noch keinen Account bei wer-kennt-wen.de hast, kannst Du Dich hier einladen lassen.
Ich vermute mal das das Abschicken der Daten mit der urllib nicht ganz so funktioniert wie geplant und du deswegen fälschlicherweise davon ausgehst das du diesen Fehler nach dem login-Versuch bekommst der allerdings gar nicht statt gefunden hat. Bei der urllib kann ich dir leider aber nicht viel helfen, Ich benutze aus gutem Grund fast ausschließlich mechanize für solche Aufgaben.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

cryzed hat geschrieben:Wenn ich mit meinem Browser die von dir genannte URL besuche (http://www.wer-kennt-wen.de/start) bekomme ich schon alleine beim Besuch der Seite folgende Meldung
ja ich weis. ich habe deswegen beides versucht. die Daten an wkw ohne "/start.php" und an wkw mit "/start.php" und beide varianten lieferten das gleiche zurück aus diesem Grund gehe ich davon aus dass es keinen großen unterschied macht. sollte es auch nicht, das einloggen ist auf beiden Seiten gleich (möglich).
Also ich hab echt schon alle möglichen Varianten durch. Ich vermute mittlerweile, dass es kein Leichtsinnsfehler ist sondern intern etwas anders gemacht wird bei der urllib2/cookielib als ich das erwartet habe bzw., dass ich einfach etwas vergessen habe von dem ich gar nichts weis.
Meine Vermutung war/ist einfach, dass mein Code evtl. nicht mit 2 Cookies umgehen kann. Weil ich habe gesagt bekommen wkw setzt 2 Cookies, wenn der Login mit einem Cookie geschieht, geht mein Skript ja (habs bei einer anderen Seite getestet). Allerdings steht in den Docs von Python2.6 drin, dass cookiejar() mit Cookies umgeht...

Deswegen bin ich so verwundert, wieso es nicht funktioniert. Weil ich eben immer errorpages zurückbekam, dass Cookies aktiviert sein müssen im Browser.
Benutzeravatar
cryzed
User
Beiträge: 82
Registriert: Samstag 28. März 2009, 15:53

Anstatt jetzt Stunden lang den Fehler zu suchen würde ich dir einfach mechanize empfehlen. Was findest du an mechanize so schlimm? Es hat alles was man sich wünscht um mit Webseiten zu interagieren (Außer Javascript-Support :) ) und außerdem benutze ich mechanize schon verdammt lange und hatte nie ein Problem.
Benutzeravatar
Sunjy
User
Beiträge: 31
Registriert: Dienstag 3. März 2009, 19:13
Wohnort: 127.0.0.1
Kontaktdaten:

ich hab kein Problem damit ich hatte nur noch nie ein Tutorial oder zumindest ein Anfang, so wie du ihn mir geliefert hast. nun weis ich wie man zumindest startet. weil die Doku auf deren Seite find ich einfach nicht gut und übersichtlich.
Ich denke primär, werd ich mich dann jetzt weiter um mein Projekt kümmern aber trotzdem interessierts mich, wieso das nicht funktioniert hat ^^ Ich würd einfach nur gern wissen wie es funktioniert. Eben, was mechanize im Hintergrund alles macht... ^^

Aber naja. Jetzt schau ich erstmal Film.
Antworten