如何用Python将现有Chrome Cookie加载到Selenium WebDriver中
Chrome 存储在本地路径C:\Users\nicoc\AppData\Local\Google\Chrome\User Data\Default\Cookie的文件是SQLite3格式数据库,且v80+版本Chrome对Cookie值做了AES加密,解密密钥存储在同目录下的Local State文件中,Windows平台可直接调用系统DPAPI接口解密密钥,完整实现逻辑如下:
第一步:安装依赖库
需要用到加密解密、Windows系统API相关依赖:
pip install pycryptodome pywin32
第二步:实现Cookie读取解密逻辑
import os import json import base64 import sqlite3 from win32crypt import CryptUnprotectData from Crypto.Cipher import AES def get_chrome_cookies(): # 1. 读取并解密AES密钥 local_state_path = os.path.join(os.environ['USERPROFILE'], r'AppData\Local\Google\Chrome\User Data\Local State') with open(local_state_path, 'r', encoding='utf-8') as f: local_state = json.load(f) encrypted_key = base64.b64decode(local_state['os_crypt']['encrypted_key']) # 去掉密钥前缀标记'DPAPI' encrypted_key = encrypted_key[5:] # 调用系统DPAPI解密得到可用AES密钥 key = CryptUnprotectData(encrypted_key, None, None, None, 0)[1] # 2. 读取Cookie数据库(复制临时文件避免原文件被Chrome锁定无法读取) cookie_db_path = os.path.join(os.environ['USERPROFILE'], r'AppData\Local\Google\Chrome\User Data\Default\Cookie') temp_db_path = 'chrome_temp_cookie.db' with open(cookie_db_path, 'rb') as f_src, open(temp_db_path, 'wb') as f_dst: f_dst.write(f_src.read()) conn = sqlite3.connect(temp_db_path) cursor = conn.cursor() cursor.execute("SELECT host_key, name, value, encrypted_value, path, expires_utc, is_secure, is_httponly FROM cookies") cookies = [] for host_key, name, value, encrypted_value, path, expires_utc, is_secure, is_httponly in cursor.fetchall(): # 解密加密的Cookie值 if encrypted_value[:3] == b'v10' or encrypted_value[:3] == b'v11': nonce = encrypted_value[3:15] ciphertext = encrypted_value[15:-16] tag = encrypted_value[-16:] cipher = AES.new(key, AES.MODE_GCM, nonce=nonce) value = cipher.decrypt_and_verify(ciphertext, tag).decode('utf-8') # 转换为Selenium兼容的Cookie格式 cookie_dict = { 'domain': host_key, 'name': name, 'value': value, 'path': path, 'expiry': expires_utc / 1000000 - 11644473600 if expires_utc != 0 else None, 'secure': bool(is_secure), 'httpOnly': bool(is_httponly) } # 移除空有效期字段避免Selenium报错 if cookie_dict['expiry'] is None: del cookie_dict['expiry'] cookies.append(cookie_dict) cursor.close() conn.close() os.remove(temp_db_path) return cookies
第三步:挂载到Selenium实例
注意:Selenium添加Cookie前必须先访问对应域名的根地址,否则会触发域名不匹配报错:
from selenium import webdriver driver = webdriver.Chrome() # 先访问目标站点的根路径,比如要加载百度的Cookie就填写https://www.baidu.com driver.get("https://目标站点的域名.com") # 读取所有Chrome本地Cookie all_cookies = get_chrome_cookies() # 可选:过滤对应域名的Cookie,避免添加无关Cookie报错 target_cookies = [c for c in all_cookies if '目标站点域名关键词' in c['domain']] for cookie in target_cookies: driver.add_cookie(cookie) # 刷新页面后Cookie即可生效 driver.refresh()
注意事项
- 运行代码前请先关闭Chrome浏览器,否则Cookie文件会被进程锁定无法读取
- 该方案仅适用于Windows平台的Chrome v80+版本,Mac/Linux平台的密钥解密逻辑不同需要单独调整
- 如果使用Chrome多Profile功能,需要把Cookie路径替换为对应Profile的目录路径
内容的提问来源于stack exchange,提问作者NictheDEV
相关产品推荐
相关产品推荐

