Come inviare cookie in una richiesta di post con la libreria Python Requests?


94

Sto cercando di utilizzare la libreria Richieste per inviare cookie con una richiesta di post, ma non sono sicuro di come impostare effettivamente i cookie in base alla sua documentazione. Lo script è per l'uso su Wikipedia e i cookie che devono essere inviati sono di questa forma:

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

Tuttavia, la guida requestsrapida alla documentazione fornisce questo come unico esempio:

cookies = dict(cookies_are='working')

Come posso codificare un cookie come il precedente utilizzando questa libreria? Devo farlo con la libreria di cookie standard di Python, quindi inviarlo insieme alla richiesta POST?


2
Il tuo cookie è costituito da un numero di a=b;coppie. A prima vista, usa acome chiave e bcome valore in un dizionario.
Thomas K

Risposte:


214

L'ultima versione di Requests creerà CookieJars per te da semplici dizionari.

import requests

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

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

Godere :)


Questo codice dovrebbe inserire un cookie nel mio browser? L'ho provato e non ha funzionato per me.
Chris Nielsen

15
@ChrisNielsen questa domanda / risposta non ha nulla a che fare con i browser
ThiefMaster

@ThiefMaster: Normalmente, i cookie risiedono nei browser. Se questa risposta non ha a che fare con i browser, cosa c'entra?
Chris Nielsen

4
@ChrisNielsen: questa domanda e il codice nella risposta riguardano l'impostazione di un cookie in una richiesta Python. La richiesta fa qualcosa di simile a una richiesta del browser, ma non sono coinvolti browser.
DDay

118

Giusto per estendere la risposta precedente, se stai collegando tra loro due richieste e vuoi inviare i cookie restituiti dalla prima alla seconda (ad esempio, mantenendo viva una sessione tra le richieste) puoi fare:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)

54
Inoltre, è possibile utilizzare requests.sessionper questa cosa esatta, l'archiviazione dei cookie su più sessioni, effettuando invece chiamate dall'oggetto restituito session.
TankorSmash

7
Ho dovuto utilizzarlo anche quando a volte usavo le sessioni. Le sessioni sembrano perdere le intestazioni Set-Cookie in alcune situazioni.
kervin

1
@kervin questo è appena successo anche a me. Sembra un bug nelle richieste, perché la sessione dovrebbe gestirlo.
deweydb

3
@TankorSmash c'è sicuramente un bug, i miei biscotti non vengono portati avanti usandorequest.session
Tjorriemorrie

È questo il modo migliore per impostare un cookie (mancato) in una sessione? stackoverflow.com/a/17240616/143397
Davida

0

Se vuoi passare il cookie al browser, devi aggiungerlo alle intestazioni per essere rispedito. Se stai 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]

Sono in grado di autenticarmi con successo con Bugzilla e TWiki ospitati sullo stesso dominio in cui è in esecuzione il mio script wsgi python passando l'autenticazione utente / password al mio script python e passando i cookie al browser. Questo mi permette di aprire le pagine Bugzilla e TWiki nello stesso browser ed essere autenticato. Sto cercando di fare lo stesso con SuiteCRM ma ho problemi con SuiteCRM ad accettare i cookie di sessione ottenuti dallo script python anche se è stato autenticato con successo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.