web-dev-qa-db-fra.com

Comment définir et récupérer un cookie dans l'en-tête HTTP en Python?

Je dois obtenir les cookies d'une réponse HTTP envoyée par un serveur et les mettre dans l'en-tête de la requête suivante. Comment puis-je le faire?

Merci d'avance.

11
Damodaran

Vous devriez utiliser le module cookielib avec urllib. 

Il stockera les cookies entre les demandes et vous pourrez les charger/les sauvegarder sur le disque. Voici un exemple:

import cookielib
import urllib2

cookies = cookielib.LWPCookieJar()
handlers = [
    urllib2.HTTPHandler(),
    urllib2.HTTPSHandler(),
    urllib2.HTTPCookieProcessor(cookies)
    ]
opener = urllib2.build_opener(*handlers)

def fetch(uri):
    req = urllib2.Request(uri)
    return opener.open(req)

def dump():
    for cookie in cookies:
        print cookie.name, cookie.value

uri = 'http://www.google.com/'
res = fetch(uri)
dump()

res = fetch(uri)
dump()

# save cookies to disk. you can load them with cookies.load() as well.
cookies.save('mycookies.txt')

Notez que les valeurs pour NID et PREF sont les mêmes entre les demandes. Si vous omettiez la variable HTTPCookieProcessor, elles seraient différentes (urllib2 n'enverrait pas les en-têtes Cookie lors de la deuxième requête).

25
samplebias

Regardez le module urllib:

(avec Python 3.1, en Python 2, utilisez plutôt urllib2.urlopen) Pour récupérer les cookies:

>>> import urllib.request
>>> d = urllib.request.urlopen("http://www.google.co.uk")
>>> d.getheader('Set-Cookie')
'PREF=ID=a45c444aa509cd98:FF=0:TM=14.....'

Et pour l'envoi, il vous suffit d'envoyer un en-tête de cookie avec une requête. Comme ça:

r=urllib.request.Request("http://www.example.com/",headers={'Cookie':"session_id=1231245546"})
urllib.request.urlopen(r)

Modifier:

Le "http.cookie" ("Cookie" pour Python 2) fonctionnera peut-être mieux pour vous:

http://docs.python.org/library/cookie.html

12
utdemir

Vous pouvez utiliser dans Python 2.7 

url="http://google.com"
request = urllib2.Request(url)
sock=urllib2.urlopen(request)
cookies=sock.info()['Set-Cookie']
content=sock.read()
sock.close()
print (cookies, content)

et lors de l'envoi de la demande

def sendResponse(cookies): 
import urllib
request = urllib2.Request("http://google.com")
request.add_header("Cookie", cookies)
request.add_data(urllib.urlencode([('arg1','val1'),('arg1','val1')]))
opener=urllib2
opener=urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))
sock=opener.open(request)
content=sock.read()
sock.close()
print len(content)
4
test30

La réponse actuelle consiste à utiliser le module Requests et l'objet requests.Session.

 demandes d'importation 
 s = demandes.Session () 
 s.get ('http://httpbin.org/cookies/set/sessioncookie/123456789') 
 r = s.get ('http://httpbin.org/cookies') 
 print (r.text) 
 # '{"cookies": {"sessioncookie": "123456789" }} '
 
 print (s.cookies) 
 # RequestsCookieJar [Cookie (version = 0, nom =' sessioncookie ', valeur =' 123456789 ', port = Aucun, spécifiée par le port = False, domain = 'httpbin.org', domain_specified = False, domain_initial_dot = False, path = '/', path_specified = True, sécurisé = False, expires = Aucun, écart = True, comment = Aucun, comment_url = Aucun, reste = {}, rfc2109 = False)] 

Vous devrez peut-être pip install requests ou pipenv install requests en premier.

0
Charles Thayer