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?


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 :)


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)

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.