Comment envoyer des cookies dans une demande de publication avec la bibliothèque de requêtes Python?

94

J'essaie d'utiliser la bibliothèque Requests pour envoyer des cookies avec une demande de publication, mais je ne sais pas comment configurer réellement les cookies en fonction de sa documentation. Le script est destiné à être utilisé sur Wikipédia, et le (s) cookie (s) à envoyer sont de cette forme:

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

Cependant, le requestsguide de démarrage rapide de la documentation donne ceci comme seul exemple:

cookies = dict(cookies_are='working')

Comment puis-je encoder un cookie comme celui ci-dessus en utilisant cette bibliothèque? Dois-je le créer avec la bibliothèque de cookies standard de python, puis l'envoyer avec la requête POST?

Ricardo Altamirano
la source
2
Votre cookie se compose de plusieurs a=b;paires. À une estimation, utilisez acomme clé et bcomme valeur dans un dictionnaire.
Thomas K

Réponses:

214

La dernière version de Requests construira pour vous des CookieJars à partir de dictionnaires simples.

import requests

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

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

Prendre plaisir :)

Kenneth Reitz
la source
Ce code est-il censé placer un cookie dans mon navigateur? Je l'ai essayé et cela n'a pas fonctionné pour moi.
Chris Nielsen
15
@ChrisNielsen cette question / réponse n'a rien à voir avec les navigateurs
ThiefMaster
@ThiefMaster: Normalement, les cookies vivent dans les navigateurs. Si cette réponse n'a pas à voir avec les navigateurs, qu'est-ce que cela a à voir?
Chris Nielsen
4
@ChrisNielsen: Cette question et le code de la réponse concernent la définition d'un cookie dans une requête Python. La demande fait quelque chose de similaire à une demande de navigateur, mais aucun navigateur n'est impliqué.
DDay
118

Pour prolonger la réponse précédente, si vous liez deux demandes ensemble et que vous souhaitez envoyer les cookies renvoyés de la première à la seconde (par exemple, maintenir une session active à travers les demandes), vous pouvez faire:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
oarevalo
la source
54
De plus, vous pouvez utiliser requests.sessionpour cette chose exacte, stocker des cookies sur plusieurs sessions, passer des appels à partir de l' sessionobjet retourné à la place.
TankorSmash
7
J'ai dû l'utiliser même lors de l'utilisation de sessions parfois. Les sessions semblent manquer les en-têtes Set-Cookie dans certaines situations.
kervin
1
@kervin, cela m'est arrivé aussi. Cela ressemble à un bogue dans les requêtes, car la session devrait gérer cela.
deweydb
3
@TankorSmash il y a définitivement un bug, mes cookies ne sont pas reportés en utilisantrequest.session
Tjorriemorrie
Est-ce la meilleure façon de définir un cookie (manqué) dans une session? stackoverflow.com/a/17240616/143397
davidA
0

Si vous souhaitez transmettre le cookie au navigateur, vous devez ajouter les en-têtes pour être renvoyé. Si vous utilisez wsgi:

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]

Je parviens à m'authentifier avec Bugzilla et TWiki hébergés sur le même domaine que mon script python wsgi est en cours d'exécution en passant l'utilisateur / mot de passe auth à mon script python et en transmettant les cookies au navigateur. Cela me permet d'ouvrir les pages Bugzilla et TWiki dans le même navigateur et d'être authentifié. J'essaie de faire la même chose avec SuiteCRM mais j'ai des problèmes avec SuiteCRM pour accepter les cookies de session obtenus à partir du script python même s'il s'est authentifié avec succès.

Essayer plus
la source