Seite 1 von 1
Mechanize: Browsersitzung abspeicherbar?
Verfasst: Freitag 11. Juli 2008, 10:11
von snafu
Hallo!
Kann ich eine Browser-Session (bei der ich mich bspw. irgendwo eingeloggt habe) abspeichern? Zur Laufzeit kann man ja sowas in der Art machen:
Code: Alles auswählen
class foo(object):
def __init__(self):
self._browser = mechanize.Browser()
def login(self):
br = self._browser
[...]
br.submit()
def do_some_stuff_while_logged_in(self):
br = self._browser
br.open('secret_site')
[...]
Was aber, wenn das Programm beendet wurde und ich meine geheime Seite aufrufen will, ohne mich jedes Mal neu einloggen zu müssen? Kann ich sozusagen den Stand von self._browser dauerhaft "einfrieren" lassen?
Verfasst: Freitag 11. Juli 2008, 10:24
von BlackJack
Schon versucht den Browser zu `pickle`\n?
Verfasst: Freitag 11. Juli 2008, 10:55
von snafu
Ich kannte pickle bisher nicht und hab's mal so probiert:
Code: Alles auswählen
>>> try:
... f = open('browser.session', 'w')
... pickle.dump(foo._browser, f)
... finally:
... f.close()
Daraufhin erhalte ich:
Code: Alles auswählen
pickle.PicklingError: Can't pickle <function <lambda> at 0x8532aac>: it's not found as mechanize._response.<lambda>
Heißt das, ich muss mich von der Möglichkeit verabschieden?
Verfasst: Samstag 12. Juli 2008, 13:07
von epsilon
es gibt noch mehr Module zur Serialisation.
Versuch's mal mit
cerealizer. Laut deren Website ist cerealizer, im Gegensatz zu pickle, save (was auch immer das jetzt genau heißen soll).
Du kannst auch mal
hier nachschauen, da gibt's noch mehr solcher Module.
Verfasst: Samstag 12. Juli 2008, 13:51
von BlackJack
Der ist "safe" und nicht "save" und das bedeutet er ist "sicher". Man kann ihm keine manipulierten Daten zum deserialisieren unterjubeln, die beliebigen Code ausführen. Aber ob das jetzt hier so wichtig ist. Ausserdem muss man Klassen wohl explizit registrieren, damit sie serialisiert werden.
Verfasst: Samstag 12. Juli 2008, 14:02
von epsilon
BlackJack hat geschrieben:Der ist "safe" und nicht "save"
ups, peinlich
Dass safe sicher heißt, wusste ich. Unter 'sicher' kann man allerdings Verschiedenes verstehen, finde ich.
Edit: omg, ich hatte schon wieder 'save' statt 'safe' geschrieben

Verfasst: Sonntag 13. Juli 2008, 08:43
von Pekh
Ich dachte bislang immer, jede Session würde nach einer Weile vom Server beendet werden. Wie soll man dann clientseitig so etwas abspeichern / einfrieren können? Oder habe ich wieder mal die Aufgabenstellung nicht richtig verstanden?

Verfasst: Sonntag 13. Juli 2008, 14:34
von epsilon
Pekh hat geschrieben:Ich dachte bislang immer, jede Session würde nach einer Weile vom Server beendet werden. Wie soll man dann clientseitig so etwas abspeichern / einfrieren können? Oder habe ich wieder mal die Aufgabenstellung nicht richtig verstanden?
Ich denke es ging snafu nur um die Cookies, damit er sich nicht immer wieder einloggen muss.
@ snafu:
falls ich mit meiner Annahme richtig liege: schau dir mal die
Dokumentation von ClientCookie an (die lib, die Mech für die Cookie-Verwaltung verwendet). Dort steht:
There are also some CookieJar subclasses which can store cookies in files and databases. FileCookieJar is the abstract class for CookieJars that can store cookies in disk files.
Verfasst: Sonntag 13. Juli 2008, 20:38
von snafu
Zu cerealizer: Nachdem ich etliche Klassen von mechanize bei ihm registrieren musste, erhielt ich schließlich:
Code: Alles auswählen
cerealizer.NonCerealizableObjectError: Object of class/type '<type 'builtin_function_or_method'>' cannot be cerealized! Use cerealizer.register to extend Cerealizer support to other classes.
Die restlichen Vorschläge werde ich später noch durchgehen. Auf jeden Fall schon mal danke für die Tipps.

Verfasst: Sonntag 13. Juli 2008, 20:52
von snafu
@ epsilon: Ich weiß nicht ob wir eventuell aneinander vorbeireden. Also um die Cookies geht es eigentlich nicht. Ich kann mich ja problemlos einloggen und da dann diverse Sachen machen. Ich möchte sozusagen nur den Status des eingeloggt seins abspeichern, damit beim späteren Aufruf des Skripts nicht jedes Mal die Methode "login" durchgegangen werden muss. Hier mal zum (vielleicht) besseren Verständnis ein Snippet:
Code: Alles auswählen
class Myspace(object):
def __init__(self):
self._browser = mechanize.Browser()
self.login()
def login(self):
config = ConfigParser()
config.readfp(open('myspace.cfg'))
email = config.get('login', 'email')
password = config.get('login', 'password')
br = self._browser
print 'Opening myspace.com...'
br.open('http://myspace.com')
emailBox = 'ctl00$ctl00$Main$cpMain$LoginBox$Email_Textbox'
passwordBox = 'ctl00$ctl00$Main$cpMain$LoginBox$Password_Textbox'
try:
br.select_form(nr=1)
br[emailBox] = email
br[passwordBox] = password
except ClientForm.ControlNotFoundError: # manchmal geht das erste nicht
br.select_form(nr=2)
br[emailBox] = email
br[passwordBox] = password
print 'Submitting login data...'
br.submit()
Verfasst: Sonntag 13. Juli 2008, 21:35
von epsilon
snafu hat geschrieben:Also um die Cookies geht es eigentlich nicht. Ich kann mich ja problemlos einloggen und da dann diverse Sachen machen. Ich möchte sozusagen nur den Status des eingeloggt seins abspeichern, damit beim späteren Aufruf des Skripts nicht jedes Mal die Methode "login" durchgegangen werden muss. Hier mal zum (vielleicht) besseren Verständnis ein Snippet:
Bei cookies geht es doch (unter anderem) genau darum, dass ich mich nicht jedes mal neu einloggen muss. Wenn du hier in's Forum kommst und irgendetwas schreibst, loggst du dich ja auch nicht jedesmal (jeden Tag) ein, sondern dein Browser schickt dem Server ein Cookie, anhand welchem der Server dich wiedererkennt. Und das gleiche geht auch mit mechanize (um soetwas geht es ja bei der lib, ansonsten könntest du ja auch einfach nur urllib2 verwenden). Du musst dann eben jedes Mal, wenn du dein Programm startest die Cookie-File laden, in welche du das letzte mal die Cookies gespeichert hast.
Das Ganze funktioniert natürlich nur, wenn MySpace entsprechende Cookies verwendet, und man sich nicht jeden Tag neu einloggen muss (was ich allerdings bezweifle).
Nützlich zum debuggen, von solchen Sachen ist ein Netzwerk-Sniffer (
wireshark kann ich empfehlen) oder etwas wie
Paros (die Seite ist wohl gerade down). So kannst du dir ansehen, was dein Browser und was dein Programm macht und entsprechend Sachen ändern.
snafu hat geschrieben:Ich weiß nicht ob wir eventuell aneinander vorbeireden.
Das könnte gut möglich sein

Verfasst: Sonntag 13. Juli 2008, 21:57
von Leonidas
Und, ähm, was passiert beim Login? Der Server gibt dir ein Cookie.
Das Cookie musst du nun einfach irgendwo speichern und bei der nächsten Session wieder aus der Keksdose holen.