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

我正在使用 requests 包向他的服务器发出 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')

cookies 示例:
[
{
    "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

关于python - 将 JSON 格式的 cookie 加载到请求中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38999554/

10-11 22:03
查看更多