Mechanize: Browsersitzung abspeicherbar?

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

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?
BlackJack

Schon versucht den Browser zu `pickle`\n?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

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.
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.
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

BlackJack hat geschrieben:Der ist "safe" und nicht "save"
ups, peinlich :oops:

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 :lol:
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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? :?
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

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

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

@ 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()
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

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 ;)
Zuletzt geändert von epsilon am Montag 14. Juli 2008, 02:25, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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