Wie sende ich Cookies in einer Post-Anfrage mit der Python Requests-Bibliothek?

94

Ich versuche, die Anforderungsbibliothek zum Senden von Cookies mit einer Post-Anfrage zu verwenden, bin mir jedoch nicht sicher, wie die Cookies basierend auf ihrer Dokumentation tatsächlich eingerichtet werden sollen. Das Skript ist für die Verwendung in Wikipedia vorgesehen. Die zu sendenden Cookies haben folgende Form:

enwiki_session=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.com; HttpOnly

Der requestsSchnellstart der Dokumentation gibt dies jedoch als einziges Beispiel an:

cookies = dict(cookies_are='working')

Wie kann ich mit dieser Bibliothek ein Cookie wie das oben genannte codieren? Muss ich es mit der Standard-Cookie-Bibliothek von Python erstellen und dann zusammen mit der POST-Anfrage senden?

Ricardo Altamirano
quelle
2
Ihr Cookie besteht aus mehreren a=b;Paaren. Verwenden Sie bei einer Vermutung aals Schlüssel und bals Wert in einem Wörterbuch.
Thomas K

Antworten:

213

Die neueste Version von Requests erstellt CookieJars für Sie aus einfachen Wörterbüchern.

import requests

cookies = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}

r = requests.post('http://wikipedia.org', cookies=cookies)

Genießen :)

Kenneth Reitz
quelle
Soll dieser Code ein Cookie in meinem Browser platzieren? Ich habe es versucht und es hat bei mir nicht funktioniert.
Chris Nielsen
15
@ ChrisNielsen diese Frage / Antwort hat nichts mit Browsern zu tun
ThiefMaster
@ThiefMaster: Normalerweise leben Cookies in Browsern. Wenn diese Antwort nicht mit Browsern zu tun hat, womit hat sie dann zu tun?
Chris Nielsen
4
@ChrisNielsen: Bei dieser Frage und dem Code in der Antwort geht es darum, ein Cookie in einer Python-Anfrage zu setzen. Die Anforderung ähnelt einer Browseranforderung, es sind jedoch keine Browser beteiligt.
DDay
117

Um die vorherige Antwort zu erweitern: Wenn Sie zwei Anfragen miteinander verknüpfen und die von der ersten an die zweite zurückgegebenen Cookies senden möchten (z. B. um eine Sitzung über Anfragen hinweg am Leben zu erhalten), haben Sie folgende Möglichkeiten:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
oarevalo
quelle
54
Darüber hinaus können Sie genau dies verwenden requests.session, indem Sie Cookies über mehrere Sitzungen hinweg speichern und sessionstattdessen Anrufe vom zurückgegebenen Objekt tätigen .
TankorSmash
7
Ich musste dies auch verwenden, wenn ich manchmal Sitzungen verwendete. Sitzungen scheinen in einigen Situationen Set-Cookie-Header zu vermissen.
Kervin
1
@kervin das ist mir auch gerade passiert. Scheint ein Fehler in Anfragen zu sein, da die Sitzung damit umgehen sollte .
Deweydb
3
@ TankorSmash gibt es definitiv einen Fehler, meine Cookies werden nicht mitrequest.session
Tjorriemorrie
Ist dies der beste Weg, um ein (verpasstes) Cookie in einer Sitzung zu setzen? stackoverflow.com/a/17240616/143397
davidA
0

Wenn Sie das Cookie an den Browser übergeben möchten, müssen Sie es an die Header anhängen, die zurückgesendet werden sollen. Wenn Sie wsgi verwenden:

import requests
...


def application(environ, start_response):
    cookie = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}
    response_headers = [('Content-type', 'text/plain')]
    response_headers.append(('Set-Cookie',cookie))
...

    return [bytes(post_env),response_headers]

Ich kann mich erfolgreich bei Bugzilla und TWiki authentifizieren, die in derselben Domäne gehostet werden, in der mein Python-WSGI-Skript ausgeführt wird, indem ich den Benutzer / das Kennwort auth an mein Python-Skript übergebe und die Cookies an den Browser weitergebe. Dadurch kann ich die Bugzilla- und TWiki-Seiten im selben Browser öffnen und mich authentifizieren lassen. Ich versuche, dasselbe mit SuiteCRM zu tun, aber ich habe Probleme damit, dass SuiteCRM die vom Python-Skript erhaltenen Sitzungscookies akzeptiert, obwohl es erfolgreich authentifiziert wurde.

Versuchen Sie es härter
quelle