Skip to main content
 首页 » 编程设计

python之将 JSON 格式的 cookie 加载到请求中

2025年05月04日10bonelee

我从客户端发送了一些 cookie,允许我以编程方式登录到他的服务器,而无需凭据。

我正在使用请求包向他的服务器发出 HTTP 请求。问题是他发送的 cookie 都是 JSON 格式的,我似乎找不到任何方法来加载这些 cookie。

除了编写将它们转换为常规 cookie 的方法之外,是否有任何现有的解决方案来加载这些 cookie?

这是我当前的代码:

def cookieLogin(cookies): 
 
    with open(cookies) as f: 
        cookies = requests.utils.cookiejar_from_dict(json.load(f)[0] ) 
 
    session = requests.session() 
    session.cookies = cookies 
 
    r = session.get('https://example.com') 

Cookie 示例:

[ 
{ 
    "domain": ".example.com", 
    "hostOnly": false, 
    "httpOnly": false, 
    "name": "act", 
    "path": "/", 
    "sameSite": "no_restriction", 
    "secure": false, 
    "session": true, 
    "storeId": "0", 
    "value": "875", 
    "id": 1 
}, 
{ 
    "domain": ".example.com", 
    "expirationDate": 1479135421.720188, 
    "hostOnly": false, 
    "httpOnly": false, 
    "name": "c_user", 
    "path": "/", 
    "sameSite": "no_restriction", 
    "secure": true, 
    "session": false, 
    "storeId": "0", 
    "value": "109", 
    "id": 2 
}, 
... 

错误:

Traceback (most recent call last): 
  File "./cookieInviter.py", line 37, in <module> 
    session = cookieLogin(args.cookies) 
  File "/Users/jj/Projects/Jim/login.py", line 78, in cookieLogin 
    r = session.get('https://example.com') 
 
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 487, in get 
    return self.request('GET', url, **kwargs) 
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 461, in request 
    prep = self.prepare_request(req) 
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 394, in prepare_request 
    hooks=merge_hooks(request.hooks, self.hooks), 
  File "/Library/Python/2.7/site-packages/requests/models.py", line 297, in prepare 
    self.prepare_cookies(cookies) 
  File "/Library/Python/2.7/site-packages/requests/models.py", line 518, in prepare_cookies 
    cookie_header = get_cookie_header(self._cookies, self) 
  File "/Library/Python/2.7/site-packages/requests/cookies.py", line 136, in get_cookie_header 
    jar.add_cookie_header(r) 
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/cookielib.py", line 1342, in add_cookie 
_header 
    attrs = self._cookie_attrs(cookies) 
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/cookielib.py", line 1301, in _cookie_at 
trs 
    self.non_word_re.search(cookie.value) and version > 0): 
TypeError: expected string or buffer 

cookies jar :

<RequestsCookieJar[<Cookie domain=.example.com for />, <Cookie hostOnly=False for />, <Cookie httpOnly=False for />, 
<Cookie id=1 for />, <Cookie name=act for />, <Cookie path=/ for />, <Cookie sameSite=no_restriction for />, <Cookie s 
ecure=False for />, <Cookie session=True for />, <Cookie storeId=0 for />, <Cookie value=... for />]> 

请您参考如下方法:

一种方法是创建一个函数,将字典中的所有非字符串值递归地转换为字符串

import requests 
 
 
session = requests.session() 
 
 
def stringify(obj: dict) -> dict: 
    """turn every value in the dictionary to a string""" 
    for k, v in obj.items(): 
        if isinstance(v, dict): 
            # if value is a dictionary, stringifiy recursively 
            stringify(v) 
            continue 
        if not isinstance(v, str): 
            if isinstance(v, bool): 
                # False/True -> false/true 
                obj[k] = str(v).lower() 
            else: 
                obj[k] = str(v) 
    return obj 
 
 
with open('cookies.json') as f: 
    cookie_list: list = json.load(f) 
    # create the cookie jar from the first cookie 
    cookie_jar = requests.utils.cookiejar_from_dict(stringify(cookie_list[0])) 
    # append the rest of the cookies 
    for cookie in cookie_list[1:]: 
        requests.utils.add_dict_to_cookiejar(cookie_jar, stringify(cookie)) 
    session.cookies = cookie_jar