web-dev-qa-db-fra.com

Comment ajouter un cookie au cookiejar dans python bibliothèque de requêtes

J'essaie d'ajouter un cookie à un cookiejar existant à l'aide de la bibliothèque python demande la bibliothèque 1.2.3. Chaque fois que j'ajoute le nouveau cookie, les données du pot sont munies pour le nouveau cookie. Clés manquant, valeurs manquantes ou correspondant à des clés incorrectes. Je ne sais pas s'il s'agit d'un bogue de bibliothèque de demande ou je n'envoie pas le cookie correctement. J'utilise le code suivant qui entraîne un mauvais cookie dans cookiejar. Suis-je formater le cookie correctement? Des idées?

    my_cookie = {
           'domain':'www.mydomain.com',
           'expires':None,
           'name':'COOKIE_NAME',
           'path':'/',
           'value':'the cookie works',
           'version':0
}

s = requests.Session()
requests.utils.add_dict_to_cookiejar(s.cookies, my_cookie)
15
fat fantasma

J'ai trouvé un moyen de le faire en important CookieJar, Cookie et cookies. Avec l'aide de @Lukasa, il m'a montré un meilleur moyen. Cependant, à sa manière, je n'ai pas pu spécifier les attributs "port_specified", "domain_specified", "domain_initial_dot" ou "path_specified". La méthode "set" le fait automatiquement avec les valeurs par défaut. J'essaie de gratter un site Web et leur cookie a des valeurs différentes dans ces attributs. Comme je suis nouveau dans tout cela, je ne sais pas encore si cela compte vraiment.

my_cookie = {
"version":0,
"name":'COOKIE_NAME',
"value":'true',
"port":None,
# "port_specified":False,
"domain":'www.mydomain.com',
# "domain_specified":False,
# "domain_initial_dot":False,
"path":'/',
# "path_specified":True,
"secure":False,
"expires":None,
"discard":True,
"comment":None,
"comment_url":None,
"rest":{},
"rfc2109":False
}

s = requests.Session()
s.cookies.set(**my_cookie)
16
fat fantasma

Réponse rapide

import requests
s = requests.session()
# Note that domain keyword parameter is the only optional parameter here
cookie_obj = requests.cookies.create_cookie(domain='www.domain.com',name='COOKIE_NAME',value='the cookie works')
s.cookies.set_cookie(cookie_obj)

Réponse détaillée

Je ne sais pas si cette technique était valide lorsque la question d'origine a été posée, mais idéalement, vous généreriez votre propre objet cookie à l'aide de requests.cookies.create_cookie (nom, valeur, ** kwargs) , puis ajoutez-le dans le pot de cookies via requests.cookies.RequestsCookieJar.set_cookie (cookie, * args, ** kwargs) . Voir la source/documentation ici .

Ajout d'un cookie personnalisé à la session de demandes

>>> import requests
>>> s = requests.session()
>>> print(s.cookies)
<RequestsCookieJar[]>
>>> required_args = {
        'name':'COOKIE_NAME',
        'value':'the cookie works'
    }
>>> optional_args = {
    'version':0,
    'port':None,
#NOTE: If domain is a blank string or not supplied this creates a
# "super cookie" that is supplied to all domains.
    'domain':'www.domain.com',
    'path':'/',
    'secure':False,
    'expires':None,
    'discard':True,
    'comment':None,
    'comment_url':None,
    'rest':{'HttpOnly': None},
    'rfc2109':False
}
>>> my_cookie = requests.cookies.create_cookie(**required_args,**optional_args)
# Counter-intuitively, set_cookie _adds_ the cookie to your session object,
#  keeping existing cookies in place
>>> s.cookies.set_cookie(my_cookie)
>>> s.cookies
<RequestsCookieJar[Cookie(version=0, name='COOKIE_NAME', value='the cookie works', port=None, port_specified=False, domain='www.domain.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>

Bonus: permet d'ajouter un super cookie puis de le supprimer

>>> my_super_cookie = requests.cookies.create_cookie('super','cookie')
>>> s.cookies.set_cookie(my_super_cookie)
# Note we have both our previous cookie and our new cookie
>>> s.cookies
<RequestsCookieJar[Cookie(version=0, name='super', value='cookie', port=None, port_specified=False, domain='', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), Cookie(version=0, name='COOKIE_NAME', value='the cookie works', port=None, port_specified=False, domain='www.domain.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>
# Deleting is simple, note that this deletes the cookie based on the name,
# if you have multiple cookies with the same name it will raise
# requests.cookies.CookieConflictError
>>> del s.cookies['super']
>>> s.cookies
<RequestsCookieJar[Cookie(version=0, name='COOKIE_NAME', value='the cookie works', port=None, port_specified=False, domain='www.domain.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>
9
Kamel
plain_cookie = 'nopubuser_abo=1; groupenctype_abo=1'
cj = requests.utils.cookiejar_from_dict(dict(p.split('=') for p in plain_cookie.split('; ')))
sess = requests.Session()
sess.cookies = cj
2
Andelf