Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?
like image 577
Peter Richter Avatar asked Aug 28 '15 23:08

Peter Richter


People also ask

Can I convert a string to a dictionary Python?

Method #1 : Using json.loads() This task can easily be performed using the inbuilt function of loads of json library of python which converts the string of valid dictionary into json form, dictionary in Python.

How do you decode cookies in Python?

get_encryption_key() extracts and decodes the AES key that was used to encrypt the cookies, which is stored in "%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Local State" file in JSON format. The above function accepts the data and the AES key as parameters and uses the key to decrypt the data to return it.

How do you cast a dictionary in python?

To convert a list to a dictionary using the same values, you can use the dict. fromkeys() method. To convert two lists into one dictionary, you can use the Python zip() function. The dictionary comprehension lets you create a new dictionary based on the values of a list.


3 Answers

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:

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

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

like image 171
rcoyner Avatar answered Oct 29 '22 02:10

rcoyner


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'}
like image 38
Bijaya Behera Avatar answered Oct 29 '22 00:10

Bijaya Behera


For a plain cookie string (document.cookies)

cookies = (dict(i.split('=', 1) for i in rawdata.split('; ')))
like image 32
Smart Manoj Avatar answered Oct 29 '22 01:10

Smart Manoj