【问题标题】:Python: How to use Chrome cookies in requestsPython:如何在请求中使用 Chrome cookie
【发布时间】:2019-09-07 19:53:30
【问题描述】:

我正在寻找一种方法来从我的 chrome 浏览器(默认)获取我的 cookie,并使用请求来使用它。

我当然已经四处搜索,例如找到了这个; How to get cookies from web-browser with Python? 但这不再起作用了,因为 Chrome 一直在更新。他们在答案中命名的模块最后一次测试是在 2016 年。

所以,他们在答案中给出的代码是 + 我额外的东西来取回 cookie

import win32crypt
import browsercookie
import requests

session = requests.Session()
cj = browsercookie.chrome()
r = session.get("https://stackoverflow.com/", cookies=cj)
print session.cookies.get_dict()

但是当我运行它时(在我的浏览器上登录到 stackoverflow 时),它返回 {}。这并不多(不是我想要的结果)

【问题讨论】:

    标签: python python-2.7 google-chrome


    【解决方案1】:

    Toms 的回答对我来说非常有效,甚至是我在 Windows 7 中工作以爬取需要登录的网站的唯一方法。但是,对于 Windows 10 和 Chrome 80 cookie 处理(SameSite Cookies),似乎有一种新的加密方式——“get_cookies”方法提供的 cookie 具有所有空值(Python 3)。

    现在对我有用的是browser_cookie3(browsercookie 的分支,几天前才更新以与 Chrome 80 一起使用)。我将它与 request 和 selenium 一起使用。

    安装在提升的提示中使用

    pip3 install browser-cookie3
    

    随请求使用

    import browser_cookie3
    cookies = browser_cookie3.chrome(domain_name='.google.com')
    response = requests.get('http://www.google.com', verify=False, headers=headers, cookies=cookies, timeout=3)
    

    用您需要的 cookie 的域交换 google.com。并确保包含超时参数,否则您的脚本可能会冻结。 headers 只是一个包含所有标题的对象,例如

    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36", 
        "Accept-Encoding":"gzip, deflate", 
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
        "DNT":"1",
        "Connection":"close", 
        "Upgrade-Insecure-Requests":"1"
    }
    

    或类似的东西。

    与硒一起使用

    import browser_cookie3
    driver = webdriver.Chrome('./chromedriver')
    cookies = browser_cookie3.chrome(domain_name='.google.com')
    for c in cookies:
        cookie = {'domain': c.domain, 'name': c.name, 'value': c.value, 'secure': c.secure and True or False}
        driver.add_cookie(cookie)
    driver.get('http://www.google.com')
    

    ./chromedriver 是我的 chromedriver.exe 所在的位置。

    【讨论】:

      【解决方案2】:

      我有一个很好的脚本可以直接在 /Default/Cookies 上读取 Chrome cookie。我认为你会工作得很好。

      import sqlite3
      import sys
      from os import getenv, path
      import os
      from Crypto.Cipher import AES
      from Crypto.Protocol.KDF import PBKDF2
      import keyring
      
      def get_cookies(url, cookiesfile):
      
          def chrome_decrypt(encrypted_value, key=None):
              dec = AES.new(key, AES.MODE_CBC, IV=iv).decrypt(encrypted_value[3:])
              decrypted = dec[:-dec[-1]].decode('utf8')
              return decrypted
      
          cookies = []
          if sys.platform == 'win32':
              import win32crypt
              conn = sqlite3.connect(cookiesfile)
              cursor = conn.cursor()
              cursor.execute(
                  'SELECT name, value, encrypted_value FROM cookies WHERE host_key == "' + url + '"')
              for name, value, encrypted_value in cursor.fetchall():
                  if value or (encrypted_value[:3] == b'v10'):
                      cookies.append((name, value))
                  else:
                      decrypted_value = win32crypt.CryptUnprotectData(
                          encrypted_value, None, None, None, 0)[1].decode('utf-8') or 'ERROR'
                      cookies.append((name, decrypted_value))
      
          elif sys.platform == 'linux':
              my_pass = 'peanuts'.encode('utf8')
              iterations = 1
              key = PBKDF2(my_pass, salt, length, iterations)
              conn = sqlite3.connect(cookiesfile)
              cursor = conn.cursor()
              cursor.execute(
                  'SELECT name, value, encrypted_value FROM cookies WHERE host_key == "' + url + '"')
              for name, value, encrypted_value in cursor.fetchall():
                  decrypted_tuple = (name, chrome_decrypt(encrypted_value, key=key))
                  cookies.append(decrypted_tuple)
          else:
              print('This tool is only supported by linux and Mac')
      
          conn.close()
          return cookies
      
      
      if __name__ == '__main__':
          pass
      else:
          salt = b'saltysalt'
          iv = b' ' * 16
          length = 16
      
      #get_cookies('YOUR URL FROM THE COOKIES', 'YOUR PATH TO THE "/Default/Cookies" DATA')
      

      【讨论】:

      • 在 Windows 10 / Chrome 80+ / Python3 中对我不起作用,我使用 browser-cookie3 代替(为此添加了答案)
      猜你喜欢
      • 2015-10-11
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多