Como enviar cookies em uma solicitação de postagem com a biblioteca Python Requests?

94

Estou tentando usar a biblioteca Requests para enviar cookies com uma solicitação de postagem, mas não tenho certeza de como realmente configurar os cookies com base em sua documentação. O script deve ser usado na Wikipedia, e os cookies que precisam ser enviados têm este formato:

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

No entanto, o requestsguia de início rápido da documentação é o único exemplo:

cookies = dict(cookies_are='working')

Como posso codificar um cookie como o acima usando esta biblioteca? Preciso fazer isso com a biblioteca de cookies padrão do python e enviar junto com a solicitação POST?

Ricardo Altamirano
fonte
2
Seu cookie consiste em vários a=b;pares. Em uma suposição, use acomo a chave e bcomo o valor em um dicionário.
Thomas K

Respostas:

214

A versão mais recente de Requests criará CookieJars para você a partir de dicionários simples.

import requests

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

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

Aproveitar :)

Kenneth Reitz
fonte
Este código deve colocar um cookie no meu navegador? Eu tentei e não funcionou para mim.
Chris Nielsen
15
@ChrisNielsen esta pergunta / resposta não tem nada a ver com navegadores
ThiefMaster
@ThiefMaster: Normalmente, os cookies residem em navegadores. Se essa resposta não tem a ver com navegadores, o que tem a ver?
Chris Nielsen
4
@ChrisNielsen: Esta pergunta e o código na resposta são sobre como definir um cookie em uma solicitação Python. A solicitação faz algo semelhante a uma solicitação do navegador, mas nenhum navegador está envolvido.
DDay
118

Apenas para estender a resposta anterior, se você estiver vinculando duas solicitações e quiser enviar os cookies retornados da primeira para a segunda (por exemplo, manter uma sessão ativa entre as solicitações), você pode fazer:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
oarevalo
fonte
54
Além disso, você pode usar requests.sessionexatamente para isso, armazenar cookies em várias sessões e, em sessionvez disso , fazer chamadas do objeto retornado .
TankorSmash
7
Eu tive que usar isso mesmo quando usar sessões às vezes. As sessões parecem perder os cabeçalhos Set-Cookie em algumas situações.
kervin
1
@kervin, isso também aconteceu comigo. Parece um bug nas solicitações, porque a sessão deve lidar com isso.
deweydb
3
@TankorSmash definitivamente há um bug, meus cookies não são transportados usandorequest.session
Tjorriemorrie
Esta é a melhor maneira de definir um cookie (perdido) em uma sessão? stackoverflow.com/a/17240616/143397
davidA
0

Se você deseja passar o cookie para o navegador, você deve anexar aos cabeçalhos para serem enviados de volta. Se você estiver usando 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]

Sou capaz de me autenticar com sucesso com Bugzilla e TWiki hospedados no mesmo domínio em que meu script wsgi python está sendo executado, passando o usuário / senha de autenticação para meu script python e passando os cookies para o navegador. Isso me permite abrir as páginas Bugzilla e TWiki no mesmo navegador e ser autenticado. Estou tentando fazer o mesmo com o SuiteCRM, mas estou tendo problemas com o SuiteCRM para aceitar os cookies de sessão obtidos do script python, embora tenha sido autenticado com êxito.

Tente mais
fonte