
Привет! Вы когда-нибудь сталкивались с тем, что ваш парсер упорно натыкается на стену в виде окна авторизации или капчи, хотя в обычном браузере всё работает отлично? Это классическая ситуация: сайт видит, что вы — «бот», потому что у вас нет правильных сессионных данных. Можно, конечно, каждый раз копировать куки вручную через инструменты разработчика, но когда сайтов десятки, а сессии обновляются часто, это превращается в рутину. В предыдущей статье мы разбирали извлечение паролей Chrome Python
, и сегодня мы сделаем следующий логический шаг. Я покажу вам, как реализовать извлечение cookies Chrome с помощью Python, чтобы ваш скрипт мог «притворяться» обычным пользователем, используя уже открытые сессии. Это сэкономит вам уйму времени при автоматизации парсинга сложных ресурсов.
Оглавление
Зачем нам нужны куки браузера при парсинге?
Если вы занимаетесь веб-скрапингом, то знаете, что современные сайты защищены гораздо лучше, чем 5–10 лет назад. Простого GET-запроса через requests часто бывает недостаточно. Сервер проверяет наличие определенных меток — Cookies. Это небольшие фрагменты данных, которые сайт сохраняет на вашем компьютере, чтобы «узнавать» вас при следующем визите. В них хранятся идентификаторы сессий, токены авторизации и настройки предпочтений. Без этих данных вы для сайта — анонимный пользователь, которому часто закрыт доступ к личному кабинету или ценной информации.
Ручной перенос кук — это временное решение. Представьте, что вам нужно спарсить данные с сайта, где сессия живет всего пару часов. Вам придется постоянно заходить в браузер, открывать консоль и копировать document.cookie. Автоматизировав извлечение cookies Chrome на Python, вы сможете обновлять эти данные «на лету». Ваш скрипт просто обратится к файлам браузера, достанет актуальные токены и продолжит работу так, будто вы всё еще сидите в Chrome. Это идеальное решение для парсинга социальных сетей, банковских выписок или закрытых форумов.
Где Chrome хранит свои куки?
Chrome, как и большинство браузеров на движке Chromium, использует для хранения данных базу SQLite. Однако путь к ней не всегда очевиден. В Windows основная папка данных находится в AppData, но внутри неё структура может меняться в зависимости от версии браузера. Раньше файл Cookies лежал в корне профиля (папка Default), но в последних обновлениях Google перенесла его в подпапку Network. Это важное изменение, которое часто ломает старые скрипты, найденные на Stack Overflow.
Для корректной работы нам нужно учитывать две вещи. Во-первых, нам нужен мастер-ключ из файла Local State (мы подробно разбирали его в статье про бэкап браузеров Python). Во-вторых, нам нужен сам файл базы данных. По умолчанию путь выглядит так: %LOCALAPPDATA%\Google\Chrome\User Data\Default\Network\Cookies. Если у вас несколько профилей в браузере, вместо Default будет Profile 1, Profile 2 и так далее. Умение гибко работать с этими путями — залог того, что ваш инструмент не сломается при обновлении Windows или самого Chrome.
📚 Документация: sqlite3 — DB-API 2.0 interface for SQLite «Файлы Cookies в Chromium представляют собой стандартные базы данных SQLite. Для доступа к ним не требуется специальный драйвер, достаточно стандартной библиотеки Python sqlite3».
Технология извлечения cookies: Chrome, Python и AES-256
Просто открыть файл Cookies и прочитать данные не получится. Значения кук зашифрованы. Как и в случае с паролями, Chrome использует алгоритм AES-256 в режиме GCM (Galois/Counter Mode). Это современный стандарт шифрования, который обеспечивает не только секретность, но и проверку того, что данные не были изменены. Ключ для этого алгоритма зашифрован с помощью системного механизма Windows — DPAPI. Это означает, что расшифровать куки можно только под той же учетной записью пользователя, под которой они были созданы.
При выполнении извлечения cookies Chrome на Python (именно так мы реализуем наш алгоритм) важно понимать структуру данных в таблице cookies. Нас интересуют поля: host_key (домен сайта), name (название куки) и encrypted_value (само зашифрованное значение). Зашифрованные данные начинаются с префикса v10 или v11. Если вы видите эти символы в начале байтовой строки — значит, перед вами AES-шифр. Мы должны будем программно отсечь этот префикс, достать вектор инициализации (IV) и только потом приступать к дешифровке. Это звучит сложно, но на Python вся магия умещается в несколько строк кода.
Подготовка окружения: библиотеки и зависимости
Чтобы наш скрипт работал, нам понадобятся библиотеки для работы с криптографией и системными вызовами Windows. В стандартной поставке Python их нет. Мы будем использовать pycryptodome для реализации алгоритма AES-256-GCM и pypiwin32 для доступа к функциям дешифровки ключа через DPAPI. Если вы еще не перешли на современные инструменты управления проектами, рекомендую изучить, как работает uv — пакетный менеджер, это значительно ускорит вашу работу.
Установка необходимых модулей
Откройте терминал и выполните установку. Мы будем использовать pathlib для удобной работы с путями, так как это безопаснее и современнее, чем манипуляции со строками. О том, почему это важно, вы можете почитать в материале python pathlib примеры.
pip install pycryptodome pypiwin32
Шаг 1: Получение мастер-ключа (Master Key)
Первым делом нам нужно достать «ключ от всех дверей». Он хранится в файле Local State в формате JSON. Поле encrypted_key содержит ключ, который нам нужно прогнать через функцию CryptUnprotectData. Это критический этап: без этого ключа дешифровка самих кук будет невозможна. Обратите внимание, что мы используем base64 для декодирования строки из JSON перед тем, как отправить её в Windows API.
import os
import json
import base64
import win32crypt
from pathlib import Path
def get_master_key():
local_state_path = Path(os.environ["USERPROFILE"]) / \
"AppData" / "Local" / "Google" / "Chrome" / "User Data" / "Local State"
with open(local_state_path, "r", encoding="utf-8") as f:
local_state = json.load(f)
# Декодируем ключ из Base64 и убираем префикс DPAPI (5 байт)
encrypted_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])[5:]
# Расшифровываем ключ средствами Windows
master_key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
return master_key
Шаг 2: Работа с базой данных Cookies
Файл Cookies — это база данных SQLite. Есть одна хитрая проблема: если Chrome запущен, база заблокирована процессом браузера. Попытка прочитать её напрямую вызовет ошибку. Чтобы этого избежать, мы всегда должны создавать временную копию файла. Это простое правило позволит вашему скрипту работать, даже когда вы активно серфите в интернете. Мы будем искать файл по двум возможным путям, чтобы обеспечить совместимость со старыми и новыми версиями браузера.
Извлечение данных из SQLite
import sqlite3
import shutil
def get_cookies_db(profile="Default"):
base_path = Path(os.environ["USERPROFILE"]) / "AppData" / "Local" / "Google" / "Chrome" / "User Data" / profile
# Проверяем старый и новый путь
possible_paths = [base_path / "Network" / "Cookies", base_path / "Cookies"]
for path in possible_paths:
if path.exists():
temp_db = "temp_cookies.db"
shutil.copyfile(path, temp_db)
return temp_db
return None
Шаг 3: Дешифровка значений (AES-256-GCM)
Теперь объединим всё вместе. Нам нужно пройтись по каждой строке в базе данных, взять зашифрованное значение куки и расшифровать его. Алгоритм AES-GCM требует три компонента: зашифрованный текст, вектор инициализации (IV) и мастер-ключ. В Chrome IV занимает 12 байт и находится сразу после префикса v10. Сам зашифрованный текст (payload) идет следом. Важно не забыть отсечь последние 16 байт — это тег аутентификации GCM, который не является частью сообщения.
📚 Документация: pycryptodome — AES-GCM mode «В режиме GCM дешифровка требует наличия nonce (IV). В Chromium он имеет фиксированную длину 12 байт для каждой записи».
from Crypto.Cipher import AES
def decrypt_cookie(encrypted_value, key):
try:
# Извлекаем IV (12 байт после 'v10')
iv = encrypted_value[3:15]
# Извлекаем зашифрованную часть
payload = encrypted_value[15:]
# Настраиваем AES
cipher = AES.new(key, AES.MODE_GCM, iv)
# Расшифровываем (последние 16 байт - это тег, отсекаем их)
return cipher.decrypt(payload)[:-16].decode()
except Exception as e:
return f"Ошибка: {e}"
Полный код скрипта для извлечения куки
Ниже представлен готовый к работе скрипт. Он автоматически находит мастер-ключ, делает копию базы данных, расшифровывает куки для конкретного сайта (например, .google.com) и выводит их в консоль. Вы можете легко изменить SQL-запрос, чтобы выгружать данные для всех сайтов сразу. Это полноценное решение для задачи извлечение cookies Chrome на Python, которое можно внедрить в любой парсер на базе requests или selenium.
import os
import json
import base64
import sqlite3
import shutil
import win32crypt
from Crypto.Cipher import AES
from pathlib import Path
def get_master_key():
path = Path(os.environ["USERPROFILE"]) / "AppData" / "Local" / "Google" / "Chrome" / "User Data" / "Local State"
with open(path, "r", encoding="utf-8") as f:
local_state = json.load(f)
key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])[5:]
return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1]
def decrypt_cookie(value, key):
try:
iv, payload = value[3:15], value[15:]
cipher = AES.new(key, AES.MODE_GCM, iv)
return cipher.decrypt(payload)[:-16].decode()
except: return ""
def fetch_cookies(target_domain):
key = get_master_key()
db_path = Path(os.environ["USERPROFILE"]) / "AppData" / "Local" / "Google" / "Chrome" / "User Data" / "Default" / "Network" / "Cookies"
temp_db = "cookies_tmp.db"
shutil.copyfile(db_path, temp_db)
conn = sqlite3.connect(temp_db)
cursor = conn.cursor()
# Ищем куки для конкретного домена
cursor.execute("SELECT host_key, name, encrypted_value FROM cookies WHERE host_key LIKE ?", (f"%{target_domain}%",))
results = {}
for host, name, encrypted_value in cursor.fetchall():
decrypted = decrypt_cookie(encrypted_value, key)
if decrypted:
results[name] = decrypted
print(f"[{host}] {name}: {decrypted[:30]}...")
conn.close()
os.remove(temp_db)
return results
if __name__ == "__main__":
# Пример: достаем куки для GitHub
cookies = fetch_cookies("github.com")
print(f"Всего извлечено кук: {len(cookies)}")
Заключение
Извлечение cookies Chrome с помощью Python — это мощный инструмент в арсенале любого специалиста по автоматизации. Мы разобрались, как устроено хранилище в браузере, научились обходить блокировку файлов и расшифровывать данные с помощью современного алгоритма AES-256-GCM. Эти знания позволяют создавать парсеры, которые практически невозможно отличить от реального пользователя.
Однако помните о безопасности: никогда не передавайте свои куки третьим лицам и используйте эти скрипты только для легальных задач автоматизации. Если вы хотите, чтобы ваш код всегда оставался понятным и надежным, не забывайте следовать принципам, о которых мы писали в статье про чистый код на Python. Постоянно практикуйтесь, и автоматизация станет вашим главным преимуществом в решении сложных задач.
Удачи в парсинге!
• Извлечение паролей Chrome на Python — расшифруйте логины для полной автоматизации входа
• Бэкап профилей Chrome и Firefox — как сохранить все данные браузера перед тестами
• Создание API на FastAPI — научитесь отдавать собранные данные через собственный интерфейс
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и разные трюки на Python.
👉 Ваш интерес — лучшая мотивация для новых статей!