Seite 1 von 1

cookielib.CookieJar extrahiert nicht alle Cookies

Verfasst: Sonntag 16. August 2009, 14:18
von droptix
Habe Verständnisprobleme mit cookielib.CookieJar. Ich automatisiere einen Websitebesuch, wobei ich Cookies benötige. Ich mache also:

Code: Alles auswählen

# use default policy (policy=None causes the same results)
cookiePolicy = cookielib.DefaultCookiePolicy()
cj = cookielib.CookieJar(policy=cookiePolicy)
# activate Cookie handling for all urllib2 handles
handler = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)

if data:
    data = urllib.urlencode(data)
# create HTTP request
request = urllib2.Request(url, data, headers)
# add correct Cookie headers
cj.add_cookie_header(request)
# get HTTP response
response = urllib2.urlopen(request)
# read HTML source code
source = response.read()
# should extract Cookies from response and add them to CookieJar
cj.extract_cookies(response, request)
# prints only PHPSESSID but not other returned Cookies
print cj.make_cookies(response, request)
Problem: wenn ich mit HttpFox (AddOn für Mozilla Firefox) oder anderen HTTP Sniffern den Traffic mitschneide, beinhaltet die HTTP Response mehr Cookies als von CookieJar erkannt.

Was mache ich falsch? Stimmt was mit der Policy nicht?

Verfasst: Montag 17. August 2009, 19:57
von droptix
Hum, hat da niemand ne Idee?

Nach weiterem Testen noch folgende Bemerkungen, die ich ebenfalls nicht wirklich verstehe:

1) Wie schon erwähnt, passiert dasselbe, wenn ich ohne Policy arbeite:

Code: Alles auswählen

#cookiePolicy = cookielib.DefaultCookiePolicy()
cj = cookielib.CookieJar()
2) Es kommt auch dasselbe raus, wenn ich folgende Zeilen weg lasse:

Code: Alles auswählen

cj.add_cookie_header(request)
cj.extract_cookies(response, request)
Sind diese Zeilen überhaupt nötig?

Hier liest man auch was über sog. "Session Cookies":

Note that the save() method won’t save session cookies anyway, unless you ask otherwise by passing a true ignore_discard argument.

Könnte es sein, dass nicht nur `FileCookieJar` Session Cookies nicht speichert, sondern das auch für `CookieJar` zutrifft? Dort habe ich allerdings keine Möglichkeit das Speichern von Session Cookies zu beeinflussen...

Verfasst: Montag 17. August 2009, 21:25
von HWK
Mechanize möchtest Du nicht verwenden?
MfG
HWK

Verfasst: Dienstag 18. August 2009, 07:32
von Snoda
Falls du "__utma__" und so ähnliche Cookies meinst... die kommen von google - und nicht von der Website. Nur eine Vermutung...

Verfasst: Dienstag 18. August 2009, 20:21
von droptix
HWK hat geschrieben:Mechanize möchtest Du nicht verwenden?
MfG
HWK
Nein, ist für die Sache wie mit Kanonen auf Spatzen zu schießen. Ich muss hintereinander nur 3 URLs besuchen, benötige aber alle Cookies von der ersten und zweiten URL, um die dritte erfolgreich zu besuchen.

Andererseits... wenn das auf Anhieb funktioniert. Tut es das?
Snoda hat geschrieben:Falls du "__utma__" und so ähnliche Cookies meinst... die kommen von google - und nicht von der Website. Nur eine Vermutung...
Gut vermutet, auch solche Cookies sind dabei! Cookie ist wohl nicht gleich Cookie? Sind die Dinger sog. Session Cookies? Es sind aber nicht nur diese __utma__ & Co. Cookies, sondern auch ganz gewöhnliche andere Werte.

Verfasst: Mittwoch 19. August 2009, 21:55
von snafu
droptix hat geschrieben:Andererseits... wenn das auf Anhieb funktioniert. Tut es das?
Wie wär's mit Ausprobieren? :)

Verfasst: Mittwoch 26. August 2009, 20:53
von droptix
snafu hat geschrieben:Wie wär's mit Ausprobieren?
Gut, hab ich nun getan. Derselbe Effekt. Wie ich nachlesen konnte arbeitet mechanize ebenfalls mit `CookieJar`. Naheliegend, dass dasselbe Ergebnis rauskommt.

Irgendwie ist der Wurm drin mit den Session-Cookies... doof!

Leider ist mir damit nicht geholfen. Hat noch wer ne Idee?

Verfasst: Montag 31. August 2009, 09:06
von Snoda
Ich hatte dir vor ewig ne PN geschrieben. Ohne konkrete Aspekte kann ich dir nicht weiterhelfen. Aber da ich mich seit einiger Zeit damit befasse könnte ich dir bestimmt am konkreten Beispiel weiterhelfen...

Verfasst: Montag 31. August 2009, 09:52
von snafu
Ist evtl. JavaScript im Spiel?

Verfasst: Dienstag 1. September 2009, 18:01
von droptix
snafu hat geschrieben:Ist evtl. JavaScript im Spiel?
Sicher, das auch. Du meinst dass JavaScript zusätzliche Cookies setzt?
Snoda hat geschrieben:Ich hatte dir vor ewig ne PN geschrieben. Ohne konkrete Aspekte kann ich dir nicht weiterhelfen. Aber da ich mich seit einiger Zeit damit befasse könnte ich dir bestimmt am konkreten Beispiel weiterhelfen...
Gern, aber wäre das nicht für alle interessant, also wert es öffentlich ins Forum zu schreiben? Siehe Antwort-PN...

Verfasst: Mittwoch 2. September 2009, 09:50
von snafu
droptix hat geschrieben:Du meinst dass JavaScript zusätzliche Cookies setzt?
Ja, richtig. Die SELFTHTML-Doku sagt jedoch:
Es ist nur möglich, diejenigen Cookies auszulesen, die man selbst gesetzt hat.
Quelle

Vielleicht kannst du aber zumindest aus dem Quelltext der Seite erkennen, ob Cookies mit JS gesetzt werden.

Also zur Erklärung: Mechanize und erst recht Pythons urllib verstehen kein JavaScript und sollten demzufolge auch keine mit JavaScript gesetzten Cookies verarbeiten können. Ich bin aber kein Experte auf dem Gebiet.

Es gibt zwar die Möglichkeit, über Browser-Engines wie WebKit oder dem Firefox Remotedings (da kenn ich den Befehl allerdings nicht) JS auszuführen, aber wenn der zitierte Satz zutrifft, hast du da ja auch nichts von.

Ein weiterer Versuch wäre, PycURL als Ersatz für die urllib zu verwenden und zu gucken, welche Cookies da rauskommen.

Verfasst: Mittwoch 2. September 2009, 21:23
von droptix
snafu hat geschrieben:Die SELFTHTML-Doku sagt jedoch:
Es ist nur möglich, diejenigen Cookies auszulesen, die man selbst gesetzt hat.
Quelle

Vielleicht kannst du aber zumindest aus dem Quelltext der Seite erkennen, ob Cookies mit JS gesetzt werden.
Im HTML-Quelltext steht massenweise Cookie-Kram, z.B. Inline-JavaScript:

Code: Alles auswählen

document.cookie = "...";
Die Frage ist, wieso Browser wie Firefox diese Cookies dann verwalten können, wenn sie doch nicht vom Firefox gesetzt wurden, sondern durch JavaScript... oder müsste man sagen: JavaScript veranlasst den Browser Cookies zu setzen, daher kann er sie auch wieder lesen... ?

Mich wundert allerdings schon, dass der Browser als HTTP-Header Antwort einen Cookie zurück bekommt, den ich mittels urllib/mechanize nicht kriege. Diesen HTTP Header bekommt der Browser zurück:

Code: Alles auswählen

Date: Wed, 02 Sep 2009 20:26:42 GMT
Server: Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 PHP/5.2.6-5 with Suhosin-Patch
X-Powered-By: PHP/5.2.6-5
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: IRGENDWAS=1; expires=Thu, 02-Sep-2010 20:26:42 GMT
Content-Encoding: gzip
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

200 OK
Kann ich mir den reinen HTTP Header von urllib/mechanize irgendwie zum Vergleich ausgeben lassen?

Verfasst: Donnerstag 3. September 2009, 06:29
von Snoda
droptix hat geschrieben: Im HTML-Quelltext steht massenweise Cookie-Kram, z.B. Inline-JavaScript:

Code: Alles auswählen

document.cookie = "...";
Die Frage ist, wieso Browser wie Firefox diese Cookies dann verwalten können, wenn sie doch nicht vom Firefox gesetzt wurden, sondern durch JavaScript... oder müsste man sagen: JavaScript veranlasst den Browser Cookies zu setzen, daher kann er sie auch wieder lesen... ?
Also wie genau die Cookies gesetzt wurden spielt keine Rolle. Es geht darum dass der Server nur die Cookies seiner Domain auslesen kann, und nichts anderes. Sprich:
der Server von ebay.de hat keine Möglichkeit auf die Cookies von gmx.de zuzugreifen. Darum kümmert sich der Browser. Ob die Cookies allerdings direkt im Header gesetzt werden, oder im Laufe der Session per JS oder sogar über eingebundene Userscripte (zum Beispiel Greasemonkey) ist egal. Alle für diese Domain gespeicherten Cookies werden dann vom Browser bei jeder Anfrage mitgesendet.
Mich wundert allerdings schon, dass der Browser als HTTP-Header Antwort einen Cookie zurück bekommt, den ich mittels urllib/mechanize nicht kriege. Diesen HTTP Header bekommt der Browser zurück:
Ich glaube nicht dass mechanize einen Cookie im Header bekommt, aber nicht auswertet.
Entweder wird der entsprechende Cookie nur unter bestimmten Bedingungen gesetzt, die Firefox erfüllt, mechanize aber nicht.
Oder der Cookie wird erst beim aufruf eines redirect/subframes gesetzt. Damit müsstest du manuell im mechanize die entsprechenden Seiten aufrufen.
Kann ich mir den reinen HTTP Header von urllib/mechanize irgendwie zum Vergleich ausgeben lassen?
Browserinstance.response().info().headers gibt die Kopfdaten raus...


Sobald ich wieder da bin (Sonntag) schau ich mir die Seite mal an - bis dahin probier dich schon mal dran ;)

Gruß Snoda