'Converting cookie string into Python dict
In Fiddler, I captured an HTTPS request with the following cookie string sent from the client (visible in Inspectors > Raw):
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
I'd like to use this cookie in a Python Requests request. (I modified the cookie slightly, so that it can't be used by readers for nefarious purposes!).
However, Requests appears to use a dictionary format for sending cookies, and I'm having trouble converting the above string/blob into a dictionary format.
My question is:
- Is there an automated way to convert a string (like the cookie I captured in Fiddler) into a dictionary in Python?
Solution 1:[1]
You should be able to use SimpleCookie
which is available in the standard Python library:
from http.cookies import SimpleCookie
rawdata = '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 = {k: v.value for k, v in cookie.items()}
If you are using Python 2, you will have to import from Cookie
instead of http.cookies
.
Docs:
Solution 2:[2]
Try this function, definitly it will help :). This function supports more cookie attributes like comment, priority, version and Max-Age
def Robotcookie(cookie: str, parent_domain: str):
items = cookie.split(';')
SameSite = HttpOnly = Secure = Domain = Path = Expires = Comment = MaxAge = CookieName = CookieValue = Size = Sessionkey = Version = Priority = None
CookieName = CookieValue = None
idx = len(items) - 1
while idx >= 0:
item = items[idx].strip()
idx -= 1
if not item:
continue
SameSiteMatched = re.match(r'^SameSite(.*)?', item, re.I)
HttpOnlyMatched = SameSiteMatched or re.match(r'^HttpOnly(.*)$', item, re.I)
SecureMatched = HttpOnlyMatched or re.match(r'^Secure(.*)$', item, re.I)
DomainMatched = SecureMatched or re.match(r'^Domain(.*)?', item, re.I)
PathMatched = DomainMatched or re.match(r'^Path(.*)?', item, re.I)
ExpiresMatched = PathMatched or re.match(r'^Expires(.*)?', item, re.I)
CommentMatched = ExpiresMatched or re.match(r'^Comment(.*)?', item, re.I)
MaxAgeMatched = ExpiresMatched or re.match(r'^Max-Age=(.*)?', item, re.I)
VersionMatched = MaxAgeMatched or re.match(r'^Version=(.*)?', item, re.I)
PriorityMatched = VersionMatched or re.match(r'^priority=(.*)?', item, re.I)
matched = SameSiteMatched or HttpOnlyMatched or SecureMatched or DomainMatched or PathMatched or ExpiresMatched or CommentMatched or MaxAgeMatched or VersionMatched or PriorityMatched
if matched:
val = matched.groups(0)[0].lstrip('=')
if matched == SameSiteMatched:
SameSite = val if val.lower() in ['strict', 'lax', 'none'] else None
elif matched == HttpOnlyMatched:
HttpOnly = True
elif matched == SecureMatched:
Secure = True
elif matched == DomainMatched:
Domain = val
elif matched == PathMatched:
Path = val
elif matched == PathMatched:
Path = val
elif matched == ExpiresMatched:
Expires = val
elif matched == CommentMatched:
Comment = val
elif matched == MaxAgeMatched:
MaxAge = val
elif matched == VersionMatched:
Version = val
elif matched == PriorityMatched:
Priority = val
else:
CookieMatched = re.match(r'^(.[^=]*)=(.*)?', item, re.I)
if CookieMatched:
CookieName, CookieValue = CookieMatched.groups(0)
Sessionkey = True if not Expires else False
Size = (len(CookieName) if CookieName else 0) + (len(CookieValue) if CookieValue else 0)
Domain = parent_domain if CookieName and not Domain else Domain
Path = '/' if CookieName and not Path else Path
Priority = 'Medium' if CookieName and not Priority else Priority.title() if Priority else 'Medium'
Cookie = {
CookieName: CookieValue,
'Domain': Domain,
'Path': Path,
'Expires': Expires,
'Comment': Comment,
'MaxAge': MaxAge,
'SameSite': SameSite,
'HttpOnly': HttpOnly,
'Secure': Secure,
'Size': Size,
'Sessionkey': Sessionkey,
'Version': Version,
'Priority': Priority
}
return Cookie if CookieName else None
cookie = 'name=bijaya; comment=Comment1; expires=Mon, 26-Jul-2021 06:34:02 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=none; Max-Age=244114; Version=1.2; priority=high;'
CookieDict = Robotcookie(cookie, parent_domain='google.com')
{'name': 'bijaya', 'Domain': '.google.com', 'Path': '/', 'Expires': None, 'Comment': 'Comment1', 'MaxAge': '244114', 'SameSite': 'none', 'HttpOnly': True, 'Secure': True, 'Size': 179, 'Sessionkey': True, 'Version': '1.2', 'Priority': 'High'}
Solution 3:[3]
For a plain cookie string (document.cookies
)
cookies = (dict(i.split('=') for i in rawdata.split('; ')))
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Smart Manoj |
Solution 2 | |
Solution 3 | Smart Manoj |