2015-08-28 18 views
6

In Fiddler, ho catturato una richiesta HTTPS con la seguente stringa cookie inviato dal client (visibile in ispezione> Raw):Conversione stringa di biscotto in Python dict

Cookie: devicePixelRatio=1; ident=exists; __utma=13103r6942.2918; __utmc=13103656942; __utmz=13105942.1.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); mp_3cb27825a6612988r46d00tinct_id%22%3A%201752338%2C%22%24initial_referrer%22%3A%20%22https%3A%2F%2Fwww.pion_created_at%22%3A%20%222015-08-03%22%2C%22platform%22%3A%20%22web%22%2C%%22%3A%20%%22%7D; t_session=BAh7DUkiD3Nlc3NpbWVfZV9uYW1lBjsARkkiH1BhY2lmaWMgVGltZSAoVVMgJiBDYW5hZGEpBjsAVEkiFXNpZ25pbl9wZXJzb25faWQGOwBGaQMSvRpJIhRsYXN0X2xvZ2luX2RhdGUGOwBGVTogQWN0aXZlU3VwcG9ydDo6VGltZVdpdGhab25lWwhJdToJVGltZQ2T3RzAAABA7QY6CXpvbmVJIghVVEMGOwBUSSIfUGFjaWZpZWRfZGFzaGJvYXJkX21lc3NhZ2UGOwBGVA%3D%3D--6ce6ef4bd6bc1a469164b6740e7571c754b31cca 

mi piacerebbe usare questo cookie in una richiesta di richieste Python. (Ho modificato leggermente il cookie, in modo che non possa essere utilizzato dai lettori per scopi nefandi!).

Tuttavia, Richieste sembra utilizzare un dictionary format for sending cookies e ho difficoltà a convertire la stringa/blob sopra in un formato di dizionario.

La mia domanda è:

  • C'è un modo automatico per convertire una stringa (come il cookie ho catturato in Fiddler) in un dizionario in Python?

risposta

17

si dovrebbe essere in grado di utilizzare SimpleCookie che è disponibile nella libreria standard di Python:

from http.cookies import SimpleCookie 

rawdata = 'Cookie: devicePixelRatio=1; ident=exists; __utma=13103r6942.2918; __utmc=13103656942; __utmz=13105942.1.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); mp_3cb27825a6612988r46d00tinct_id%22%3A%201752338%2C%22%24initial_referrer%22%3A%20%22https%3A%2F%2Fwww.pion_created_at%22%3A%20%222015-08-03%22%2C%22platform%22%3A%20%22web%22%2C%%22%3A%20%%22%7D; t_session=BAh7DUkiD3Nlc3NpbWVfZV9uYW1lBjsARkkiH1BhY2lmaWMgVGltZSAoVVMgJiBDYW5hZGEpBjsAVEkiFXNpZ25pbl9wZXJzb25faWQGOwBGaQMSvRpJIhRsYXN0X2xvZ2luX2RhdGUGOwBGVTogQWN0aXZlU3VwcG9ydDo6VGltZVdpdGhab25lWwhJdToJVGltZQ2T3RzAAABA7QY6CXpvbmVJIghVVEMGOwBUSSIfUGFjaWZpZWRfZGFzaGJvYXJkX21lc3NhZ2UGOwBGVA%3D%3D--6ce6ef4bd6bc1a469164b6740e7571c754b31cca' 
cookie = SimpleCookie() 
cookie.load(rawdata) 

# Even though SimpleCookie is dictionary-like, it internally uses a Morsel object 
# which is incompatible with requests. Manually construct a dictionary instead. 
cookies = {} 
for key, morsel in cookie.items(): 
    cookies[key] = morsel.value 

Se si sta utilizzando Python 2, si dovrà importare da Cookie invece di http.cookies.

Documenti:

https://docs.python.org/2/library/cookie.html

https://docs.python.org/3/library/http.cookies.html

+0

nel cookie sopra, qual è 'mp_3cb27825a6612988r46d00tinct_id% 22% 3A% 201.752.338% 2C% 22% 24initial_referrer% 22% 3A% 20% 22https% 3A % 2F% 2Fwww.pion_created_at% 22% 3A% 20% 222015-08-03% 22% 2C% 22platform% 22% 3A% 20% 22Web% 22% 2C %% 22% 3A% 20 %% 22% 7D; ', perché non segue il formato chiave = valore? – zyxue

+0

Non sicuro. Ho semplicemente copiato e incollato ciò che l'OP ha fornito. – rcoyner

+0

Quando si utilizza il modulo Cookie, questa parte sembra abbandonata, e mi chiedo del formato del cookie ... – zyxue

0

alcun modo automatico, ma provate questo, che dovrebbe fare ciò che si sta dopo (assumendo s è la stringa dall'alto):

>>> import re 
>>> q = {k.strip():v for k,v in re.findall(r'(.*?)=(.*?);', s.split(':')[1])} 
>>> q['__utma'] 
'13103r6942.2918'