Einloggen mit Session-ID

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
guter_hund
User
Beiträge: 19
Registriert: Montag 4. Dezember 2006, 13:25

Hi.

Habe mal wieder ein kleines Problem. Ich möchte mich mit meinem Script auf eine Website einloggen die Session-IDs benutzt und auf der selbigen auch Sachen mit meinem Account anderen etc.

Leider habe ich bis her nur eine sehr mühsehlige Methode, die sich den Quellcode der Seite, nach dem man manuel eingelogt hat, runterläd und in einer Textdatei speichert. Von da aus nutz das Script nur noch diese (und ggf. andere) Textdatei(en). :roll:


Vielleicht fällt einem eine bessere Variante ein. Währe nett. :oops:


MFG. Guter_Hund
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also entweder wird die Session-ID mit einem Cookie übergeben, dass kannst du mit Python auslesen oder die Session-ID wird an jeden Link angehängt, da müsstest du einfach die Seite nach einem Link mit Session-ID durchsuchen.

Gruss
guter_hund
User
Beiträge: 19
Registriert: Montag 4. Dezember 2006, 13:25

Es wird ein Session-Link benutzt.

Code: Alles auswählen

<frameset framespacing="0" border="0" cols="190,*" frameborder="0">
  <frame name="Inhalt" target="Hauptframe" src="leftmenu.php?session=e29550f32433" noresize marginwidth="0" marginheight="0">
  <frame name="Hauptframe" src="overview.php?session=e29550f32433&w=0&lgn=1" target="_blank">
  <noframes>
  <body>
  <p>Diese Seite verwendet Frames. Frames werden von Ihrem Browser aber nicht
  unterstützt.</p>

  </noframes>
</frameset>
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Du musst etwa so vorgehen:
1. Schicke dem Server mit der urllib einen Request mit den Formulardaten (deine Anmeldedaten)
2. Suche in der Antwort vom Server nach "?sessionid=" und lies die Sessionid aus
3. Jeder Request von dir muss nun als GET-Parameter die Session-ID mitschicken.

Gruss
guter_hund
User
Beiträge: 19
Registriert: Montag 4. Dezember 2006, 13:25

:oops: :lol: :oops:
GET-Parameter? Kenn ich gar nicht. Währe super nett wenn du mir das, vielleicht auch mit code-aufbau, erläuterst.

MFG
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

such mal im Forum nach GET und POST...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Und lies dir mal das HTTP-Protocol durch:http://de.wikipedia.org/wiki/Hypertext_ ... r_Protocol

Gruss
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Hallo,
ich habe nun ein ähnliches Problem. Ich möchte mich mit einem Account einloggen (mein skript funktioniert bis dahin gut), nur speichert der Webdienst meinen Nick und mein Passwort in einer Session. Wie kann ich mein Pythonprogramm diese Session "auslesen" lassen und diese auf irgendeine Art speichern, damit nicht die Fehlermeldung kommt dass bei mir Sessions deaktiviert seinen und mein Programm unter dieser Session eingeloogt bleibt?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Xabyt hat geschrieben:Wie kann ich mein Pythonprogramm diese Session "auslesen" lassen und diese auf irgendeine Art speichern, damit nicht die Fehlermeldung kommt dass bei mir Sessions deaktiviert seinen und mein Programm unter dieser Session eingeloogt bleibt?
Hängt ab, wie die Session gespeichert wird. Ich tipe mal darauf, dass die Session auf dem Server gespeichert wird und du ein Cookie bekommst, in dem die Session-ID hinterlagt ist. Dieses Cookie müsstest du also auslesen und bei jedem Request auf die Seitemitschicken.

Wie man mit Session-IDs in Cookies umgehen kann, siehst du in changesig.py, einem alten Programm von mir, welches phpBB-Signaturen modifiziert. Das Vorgehen ist analog, lediglich die Beschaffung des Cookies kann anders sein. Das hängt aber ab, ob du das Cookie vom Browser auslesen willst oder das Programm das Cookie direkt anfordern soll.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Ich bin wie bereits erwähnt noch Anfänger, könntest du mir den Code ein wenig erläutern, oder ggf. die Adresse zu einer Erklärung/ einem Tutorial geben? Es handelt sich um einen Cookie, das ganze wird über PHP gemanaged. Nick und Passwort werden wie erwähnt darin gespeichert. Die Namen unter denen die Cookies gespeichert werden habe ich
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Xabyt hat geschrieben:könntest du mir den Code ein wenig erläutern, oder ggf. die Adresse zu einer Erklärung/ einem Tutorial geben?
Naja, ein Python-Tutorial solltest du schon gelesen haben und optimalerweise verstanden haben.
An sich ist der Code ziemlich einfach (und wenn ich so bedenke auch gar nicht so besonders gut. Immerhin funktioniert er), daher wäre es mir lieber wenn du konkrete Fragen stellst - so muss ich nicht Sachen erklären die du sowieso schon weißt. Also wenn du konkrete Fragen hast - schiess los, ich antworte gerne.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Leonidas hat geschrieben: Also wenn du konkrete Fragen hast - schiess los, ich antworte gerne.
Hallo,
Also:
Für was ist das Modul "BeautifulSoup" zuständig?
Welche Funktion dieses Skriptes ist für direkte Speicherungen des/eines Cookies verantwortlich? D.h. sowas wie Cookie = addCookie("soheisstdercookie", "So soll sein Ihnalt sein")?
Wie schicke ich dem Server die Cookies so, dass er denkt, dass ich mich eingeloggt hätte? D.h. sowas wie CookieSenden = encodecookie(Cookie)
und das man "CookieSenden" dann an das Skript sendet, so mein ich das.

Dein Skript ist sehr spezialisiert auf das Phpbb, deshalb kann ich das ehrlich gesagt nicht gut ordnen, dazu kommt dass ich Py seit ca. 5 Tagen lerne, danke für jegliche Hilfe.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Xabyt hat geschrieben:Für was ist das Modul "BeautifulSoup" zuständig?
Fürs HTML-Scraping. Würde zwar auch "von Hand" gehen, aber BeautifulSoup macht es einfach viel einfacher und angenehmer.
Xabyt hat geschrieben:Welche Funktion dieses Skriptes ist für direkte Speicherungen des/eines Cookies verantwortlich? D.h. sowas wie Cookie = addCookie("soheisstdercookie", "So soll sein Ihnalt sein")?
Gespeichert wird der Inhalt des Cookies im Arbeitsspeicher. Und das Cookie an den Request zu hängen ist in der Zeile

Code: Alles auswählen

req.add_header('Cookie', self.returncookie)
Xabyt hat geschrieben:Wie schicke ich dem Server die Cookies so, dass er denkt, dass ich mich eingeloggt hätte? D.h. sowas wie CookieSenden = encodecookie(Cookie)
und das man "CookieSenden" dann an das Skript sendet, so mein ich das.
So wie in der Funktion ``change``.
Xabyt hat geschrieben:Dein Skript ist sehr spezialisiert auf das Phpbb, deshalb kann ich das ehrlich gesagt nicht gut ordnen, dazu kommt dass ich Py seit ca. 5 Tagen lerne, danke für jegliche Hilfe.
Es ist spezialisiert auf phpBB, aber das Konzept Cookie auslesen, Cookie bei Requests mitsenden ist sehr allgemein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Xabyt hat geschrieben:dazu kommt dass ich Py seit ca. 5 Tagen lerne
Hi Xabyt!

Du suchst dir ja auch nicht unbedingt ein einfaches Thema für den Beginn aus. Webprogrammierung ist eine Sache für sich. Es genügt nicht, nur Python zu verstehen, man muss auch das Web und die darin eingesetzten Techniken verstehen. HTTP, GET, POST, <form>, CGI, RESPONSE, REQUEST, usw.

Wenn ich mich irgendwo im Web anmelden muss, bevor ich zu den gesuchten Informationen komme, dann nehme ich meistens
http://wwwsearch.sourceforge.net/ClientCookie/
oder
http://wwwsearch.sourceforge.net/ClientForm/

ClientCookie ist jetzt in http://wwwsearch.sourceforge.net/mechanize/ integriert worden. Wie genau, weiß ich nicht, da ich mechanize noch nie eingesetzt habe. Es ist schon länger her, dass ich ClientCookie angewendet habe.

Wie auch immer. ClientCookie merkt sich die Cookies automatisch, die vom Server geschickt wurden und gibt diese bei jeder weiteren Anfrage an den Server automatisch an diesen zurück. Jetzt musst du nur zuerst die Seite aufrufen, mit der du dich anmelden kannst. Findest raus, wie die Anfrage an den Server lauten muss, damit du angemeldet bist und nachdem du dich angemeldet hast, kannst du jeden URL der Website aufrufen, ohne dich wieder anmelden zu müssen.

Du musst einfach ein bischen probieren und den Quellcode der Anmeldeseite studieren. Die Kombination von ClientCookie und ClientForm ist noch produktiver. Mit ClientForm findest du sehr schnell Formularfelder raus. Du könntest sie damit sogar "virtuell" ausfüllen und den daraus resultierenden Request wieder an den Server schicken. Usw.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

@Gerold: Ich programmiere seit 2 Jahren in PHP und habe auch in Webdesign gut Erfahrungen. Ich weiß was GET (in PHP $_GET[]) und die anderen Requests sind, habe mit MySQL programmiert und auch in Dingen wie AJAX (ein wenig) Erfahrung. Ein absoluter Anfänger bin ich demnach nicht, nur möchte ich jetzt in Python einsteigen und mit einer solchen Art der Programmierung wurde ich bisher noch nicht konfrontiert.

@Leonidas:
Also ist der Teil, in dem dann die Daten meines Cookies gespeichert werden, also der Teil den ich um die Daten meines Cookies umändern muss folgender?

Code: Alles auswählen

    def get_cookie(self):
        # open the loginpage
        http = urllib2.urlopen(self.loginpage)
        # read the contents of Set-Cookie
        httpcookies = http.headers['Set-Cookie']
        # close the connection
        http.close()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Xabyt hat geschrieben:Also ist der Teil, in dem dann die Daten meines Cookies gespeichert werden, also der Teil den ich um die Daten meines Cookies umändern muss folgender?
Richtig.

Allerdings könntest du erwägen das von Gerold angesprochende mechanize und ClientForm zu verwenden. Meine Lösung ist eben eher "low-level", mit mechanize würden sich da sicher interessante Dinge machen lassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Ich schaue mir Gerolds Lösung nochmal an. Aber in dieser get_cookie Funktion, wo muss ich da die Namen der Cookies der Seite abändern und unter was für einer Variable, die ich dann abrufen kann und an das skript versenden muss, wird der Wert des Cookie gespeichert? Oder habe ich da was falsch verstanden?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Xabyt hat geschrieben:Aber in dieser get_cookie Funktion, wo muss ich da die Namen der Cookies der Seite abändern und unter was für einer Variable, die ich dann abrufen kann und an das skript versenden muss, wird der Wert des Cookie gespeichert?
``get_cookie()`` liest einfach alle Cookies aus, die der Server per Set-Cookie-Direktive schickt (und in denen ein Bodenstrich ist) und gibt sie im Returnwert zurück. Das ist im Fall von phpBB ein Datacookie und ein SID-Cookie (siehe ``SignatureCanger.__init__()``, wo die Cookies ausgelesen werden und dann in ``self.returncookie`` verkettet werden).

Ich würde dir raten, den Quellcode einfach mal ausprobieren und mit einigen ``print``-Statements dir den aktuellen Inhalt der Variablen anzuzeigen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Hallo,
Ich habe die Teile des Codes herausgenommen von denen ich dachte dass sie für meinen Bot, also für die Cookies notwendig sind. Nun wird aber immer folgender Fehler ausgegeben:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python24\tubot.py", line 14, in -toplevel-
    httpcookies = einbot1.headers['Set-Cookie']
  File "C:\Python24\lib\rfc822.py", line 390, in __getitem__
    return self.dict[name.lower()]
KeyError: 'set-cookie'
Ich habe nun auch die urllib2 importiert, hier der betroffene Teil meines Codes:

Code: Alles auswählen

...
benutzer = "xabyt"
passwort = "***"
parameter1 = urllib.urlencode({'benutzer': benutzer, 'passwort': passwort, 'action': "Submit"})
einbot1 = urllib2.urlopen ("http://www.team-ulm.de/login.php", parameter1)
httpcookies = einbot1.headers['Set-Cookie']
httpcookies = httpcookies.split()
httpcookies = [cookie[:-1] for cookie in httpcookies if '_' in cookie]
...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

In denen Login-Parametern fehlt noch das Hidden-Field. Außerdem Musst du schauen, welche Header denn Überhaupt übermittelt wurden. In phpBB ist es so, dass man immer ein Cookie hat und dieses Cookie durch den Login zu einem authentifizierten Cookie gemacht wird. Du musst schauen wie das auf Team-Ulm gemacht wird.
Du solltest sowieso erstmal schauen, welche Header überhaupt geschickt werden. Werden Cookie-Header geschickt? Oder wird eine Fehlerseite ausgegeben weil der Login nicht geklappt hat?

Wenn man auf ``http://www.team-ulm.de/login.php`` geht, wird man auf ``http://www.team-ulm.de/login_no.php?mode=userdenied`` umgeleitet. Redirects sollte man vermeiden, da dabei die POST-Daten verloren gehen können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten