cookielib.CookieJar extrahiert nicht alle Cookies

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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?
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Mechanize möchtest Du nicht verwenden?
MfG
HWK
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

Falls du "__utma__" und so ähnliche Cookies meinst... die kommen von google - und nicht von der Website. Nur eine Vermutung...
Hello world!
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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

droptix hat geschrieben:Andererseits... wenn das auf Anhieb funktioniert. Tut es das?
Wie wär's mit Ausprobieren? :)
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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?
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

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

Ist evtl. JavaScript im Spiel?
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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

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.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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?
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

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
Hello world!
Antworten