如何用Python获取Chrome/FireFox浏览器中保存的网站Cookie?
嘿,我来帮你搞定用Python脚本提取Chrome和FireFox里已保存的网站Cookie这件事!下面分浏览器给你一步步讲,都是亲测有效的方法~
一、提取Chrome浏览器的Cookie
Chrome把Cookie存在一个名为Cookies的SQLite数据库文件里,不过从Chrome 80版本开始,Cookie是加密存储的,所以得先解密才能拿到明文。
1. 找对数据库路径
不同系统的路径不一样:
- Windows:
C:\Users\<你的用户名>\AppData\Local\Google\Chrome\User Data\Default\Cookies - macOS:
~/Library/Application Support/Google/Chrome/Default/Cookies - Linux:
~/.config/google-chrome/Default/Cookies
2. 安装必要依赖
- Windows用户:安装
pywin32,执行pip install pywin32 - macOS/Linux用户:安装
cryptography,执行pip install cryptography
3. 示例代码
import sqlite3 import os from base64 import b64decode from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend import win32crypt # Windows用户保留,mac/Linux请注释该行 def get_chrome_cookies(domain): # 替换成你对应系统的Cookies路径 cookie_path = os.path.expanduser('~') + "/Library/Application Support/Google/Chrome/Default/Cookies" # macOS示例 # Windows路径:cookie_path = f"C:\\Users\\{os.getlogin()}\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies" # Linux路径:cookie_path = os.path.expanduser('~') + "/.config/google-chrome/Default/Cookies" conn = sqlite3.connect(cookie_path) cursor = conn.cursor() # 查询目标域名的Cookie cursor.execute("SELECT name, value, encrypted_value FROM cookies WHERE host_key LIKE ?", ('%' + domain + '%',)) cookies = {} for name, value, encrypted_value in cursor.fetchall(): # 空value说明是加密存储的,需要解密 if value == '': if os.name == 'nt': # Windows下用系统API解密 decrypted_value = win32crypt.CryptUnprotectData(encrypted_value, None, None, None, 0)[1].decode('utf-8') else: # macOS/Linux下提取密钥并解密 key_path = os.path.expanduser('~') + "/Library/Application Support/Google/Chrome/Local State" # macOS # Linux密钥路径:key_path = os.path.expanduser('~') + "/.config/google-chrome/Local State" with open(key_path, 'r') as f: local_state = f.read() key = b64decode(local_state.split('"encrypted_key":"')[1].split('"')[0])[5:] # 去除前缀标识 iv = encrypted_value[3:15] ciphertext = encrypted_value[15:] cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend()) decryptor = cipher.decryptor() decrypted_value = decryptor.update(ciphertext) + decryptor.finalize() decrypted_value = decrypted_value.decode('utf-8') cookies[name] = decrypted_value else: cookies[name] = value conn.close() return cookies # 调用示例:提取GitHub的Cookie print(get_chrome_cookies('github.com'))
注意事项
- 运行脚本前务必关闭Chrome浏览器,否则数据库会被锁定无法读取
- 不同Chrome版本的加密逻辑可能微调,若解密失败,检查密钥提取代码是否需要调整
- 仅能提取当前用户Chrome中的Cookie,涉及系统权限限制
二、提取FireFox浏览器的Cookie
FireFox的Cookie同样存在SQLite数据库里,从FireFox 58版本开始,Cookie也采用加密存储,需要找到对应的密钥文件解密。
1. 找到数据库和密钥路径
- Cookie数据库路径:
- Windows:
C:\Users\<你的用户名>\AppData\Roaming\Mozilla\Firefox\Profiles\<你的配置文件夹>\cookies.sqlite - macOS:
~/Library/Application Support/Firefox/Profiles/<你的配置文件夹>/cookies.sqlite - Linux:
~/.mozilla/firefox/<你的配置文件夹>/cookies.sqlite
- Windows:
- 密钥文件:和Cookie数据库同目录下的
key4.db(旧版本为key3.db)
2. 安装必要依赖
安装cryptography,执行 pip install cryptography(sqlite3为Python内置库,无需额外安装)
3. 示例代码
import sqlite3 import os from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC from cryptography.hazmat.primitives import hashes from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes def get_firefox_cookies(domain): # 替换成你的FireFox配置文件夹路径 profile_path = os.path.expanduser('~') + "/Library/Application Support/Firefox/Profiles/xxxxxx.default-release" # macOS示例 cookie_db = os.path.join(profile_path, 'cookies.sqlite') key_db = os.path.join(profile_path, 'key4.db') # 从key4.db提取解密密钥 key_conn = sqlite3.connect(key_db) key_cursor = key_conn.cursor() key_cursor.execute("SELECT item1, item2 FROM moz_logins WHERE hostname = 'https://accounts.firefox.com'") row = key_cursor.fetchone() if not row: raise Exception("无法找到FireFox密钥,请检查配置文件夹是否正确") salt = b'.mozilla.org\x00' password = row[0] encrypted_key = row[1][1:] # 去除开头的标识位 # 生成AES解密密钥 kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), length=32, salt=salt, iterations=1000, backend=default_backend() ) key = kdf.derive(password) # 解密得到实际的Cookie密钥 iv = encrypted_key[:16] ciphertext = encrypted_key[16:-16] cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend()) decryptor = cipher.decryptor() aes_key = decryptor.update(ciphertext) + decryptor.finalize() key_conn.close() # 读取并解密Cookie cookie_conn = sqlite3.connect(cookie_db) cookie_cursor = cookie_conn.cursor() cookie_cursor.execute("SELECT name, value, encrypted_value FROM moz_cookies WHERE host LIKE ?", ('%' + domain + '%',)) cookies = {} for name, value, encrypted_value in cookie_cursor.fetchall(): if value == '': iv = encrypted_value[:16] ciphertext = encrypted_value[16:-16] cipher = Cipher(algorithms.AES(aes_key), modes.GCM(iv), backend=default_backend()) decryptor = cipher.decryptor() decrypted_value = decryptor.update(ciphertext) + decryptor.finalize() decrypted_value = decrypted_value.decode('utf-8') cookies[name] = decrypted_value else: cookies[name] = value cookie_conn.close() return cookies # 调用示例:提取Stack Overflow的Cookie print(get_firefox_cookies('stackoverflow.com'))
注意事项
- 运行脚本前务必关闭FireFox浏览器,避免数据库锁定
- 配置文件夹名称是随机生成的(比如
abc123.default-release),需要自己在对应路径下找到 - 旧版FireFox使用
key3.db,解密逻辑与key4.db不同,需另行调整
最后提醒:以上方法仅可用于提取你本人浏览器中的Cookie,严禁用于获取他人Cookie,这会违反隐私法规和道德规范!
内容的提问来源于stack exchange,提问作者Srinivas Jayaram
相关产品推荐
相关产品推荐

