Python:如何在请求中使用 Chrome cookie

Aar*_*onk 7 python google-chrome python-2.7

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

我当然已经搜索过了,例如找到了这个;如何使用 Python 从网络浏览器获取 cookie? 但这不再起作用,因为 Chrome 一直在更新。他们在答案中命名的模块最后一次测试是在 2016 年。

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

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()
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*Tom 8

我有一个很好的脚本可以直接在/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')
Run Code Online (Sandbox Code Playgroud)


Tre*_*vor 6

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

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

在提升的提示中安装

pip3 install browser-cookie3
Run Code Online (Sandbox Code Playgroud)

与请求一起使用

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)
Run Code Online (Sandbox Code Playgroud)

将 google.com 与您需要的 cookie 的域交换。并确保包含超时参数,否则您的脚本可能会冻结。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"
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西。

硒的用法

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')
Run Code Online (Sandbox Code Playgroud)

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