Как сделать автологин в сайт с помощью Python и Playwright

🔐 Кратко: Научитесь делать автологин на сайты через Playwright: ввод данных, сохранение cookie и повторный вход без пароля. Работает даже с двухфакторкой (если обойти можно).
python playwright автологин

Мне как то пару месяцев назад пришлось парсить данные из личного кабинета клиента. Каждый запуск скрипта требовал вручную заходить, вводить логин/пароль и т.д. Это было неудобно и невыносимо.

И я подумал, зачем вручную все делать, если есть Playwright который умеет все это делать да и еще сохранять сессию через cookies — и после первого входа можно автоматически заходить снова и снова, минуя форму авторизации.

В этой статье я покажу пошагово, как:

  • Войти на сайт через форму
  • Сохранить cookies в файл
  • Восстановить сессию при следующем запуске
  • Проверить, что вход успешен

Всё — на реальном демо-сайте, с полным кодом и пояснениями.

Выбор демо-сайта для практики

Идеальный кандидат — https://demoqa.com/login. Это официальный тестовый сайт, где:

  • Есть форма входа
  • Логин: admin
  • Пароль: 123456
  • После входа появляется надпись «Logged in as admin»

🌐 Сайт не требует email-подтверждения и работает мгновенно — идеально для обучения.

Шаг 1. Первый вход: заполняем форму и нажимаем «Login»

Если вы первый раз используете Playwright для автоматизации, я в отдельной своей статье рассказывал как заполнять формы и искать селекторы, можете ознакомиться:

👉 Как автоматически заполнять формы и нажимать кнопки в Playwright

Базовый скрипт с авторизацией

from playwright.sync_api import sync_playwright

def login_and_save_cookies():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False, slow_mo=200)
        context = browser.new_context()
        page = context.new_page()
        
        # Переходим на страницу логина
        page.goto("https://demoqa.com/login")
        
        # Вводим логин и пароль
        page.fill("#userName", "admin")
        page.fill("#password", "123456")
        
        # Нажимаем кнопку
        page.click("#login")
        
        # Ждём появления элемента после входа
        page.wait_for_selector("#userName-value", timeout=10000)
        print("✅ Успешный вход!")
        
        # Сохраняем cookies
        cookies = context.cookies()
        import json
        with open("cookies.json", "w") as f:
            json.dump(cookies, f)
        print("💾 Cookies сохранены в cookies.json")
        
        browser.close()

if __name__ == "__main__":
    login_and_save_cookies()

💡 slow_mo=200 добавляет паузу между действиями — удобно при отладке.

Шаг 2. Вход по cookies — без ввода логина и пароля

Скрипт с восстановлением сессии

from playwright.sync_api import sync_playwright
import json
import os

def login_with_cookies():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()
        
        # Загружаем cookies, если файл существует
        if os.path.exists("cookies.json"):
            with open("cookies.json", "r") as f:
                cookies = json.load(f)
            context.add_cookies(cookies)
            print("🍪 Cookies загружены")
        
        # Переходим в личный кабинет
        page.goto("https://demoqa.com/profile")
        
        # Проверяем, авторизованы ли мы
        if page.is_visible("#userName-value"):
            user = page.text_content("#userName-value")
            print(f"✅ Привет, {user}! Вход по cookies.")
        else:
            print("❌ Сессия устарела. Требуется повторный логин.")
            # Здесь можно вызвать login_and_save_cookies()
        
        browser.close()

if __name__ == "__main__":
    login_with_cookies()

Шаг 3. Умный скрипт: пробует cookies, иначе — форма

Объединим оба подхода в один надёжный скрипт:

def smart_login():
    with sync_playwright() as p:
        browser = p.chromium.launch()
        context = browser.new_context()
        page = context.new_page()
        
        # Сначала пробуем зайти с cookies
        if os.path.exists("cookies.json"):
            with open("cookies.json") as f:
                context.add_cookies(json.load(f))
            page.goto("https://demoqa.com/profile")
            
            if page.is_visible("#userName-value"):
                print("✅ Вход по cookies")
                browser.close()
                return
        
        # Если не получилось — логинимся вручную
        print("🔁 Требуется повторный вход")
        page.goto("https://demoqa.com/login")
        page.fill("#userName", "admin")
        page.fill("#password", "123456")
        page.click("#login")
        page.wait_for_selector("#userName-value")
        
        # Сохраняем новые cookies
        with open("cookies.json", "w") as f:
            json.dump(context.cookies(), f)
        print("✅ Новые cookies сохранены")
        browser.close()

Важные нюансы и советы

Cookies живут недолго

Многие сайты устанавливают короткий срок жизни cookies (30 минут – 24 часа). Если скрипт не работает — удалите cookies.json и залогиньтесь заново.

Используйте один context на всё приложение

Все действия (логин, переходы, парсинг) должны происходить в одном контексте, иначе cookies не поделятся.

Для продакшена — шифруйте файл cookies

Файл cookies.json — это ключ от вашего аккаунта. Любой, кто получит его, сможет:

  • Войти в личный кабинет от вашего имени
  • Делать покупки, менять настройки, удалять данные
  • Использовать сессию, пока она не протухнет

Поэтому никогда не коммитьте cookies.json в Git и не храните его в открытом виде на сервере.
Лучшая практика — шифровать файл при сохранении и расшифровывать при загрузке с помощью cryptography.

📚 Документация Playwright: Authentication

Установка библиотеки

pip install cryptography

Генерация ключа шифрования (делается один раз)

from cryptography.fernet import Fernet

# Создаём ключ и сохраняем в файл (храните его в секрете!)
key = Fernet.generate_key()
with open("secret.key", "wb") as key_file:
    key_file.write(key)

⚠️ Файл secret.key — это ваш «пароль» к зашифрованным cookies.
Никогда не публикуйте его в GitHub! Добавьте в .gitignore.

Сохранение cookies в зашифрованном виде

from cryptography.fernet import Fernet
import json

def save_encrypted_cookies(cookies, key_path="secret.key"):
    with open(key_path, "rb") as key_file:
        key = key_file.read()
    f = Fernet(key)
    
    # Конвертируем cookies в JSON и шифруем
    cookies_json = json.dumps(cookies).encode("utf-8")
    encrypted_data = f.encrypt(cookies_json)
    
    with open("cookies.encrypted", "wb") as f_out:
        f_out.write(encrypted_data)
    print("✅ Cookies сохранены в зашифрованном виде")

Используйте вместо простого json.dump():

# В конце успешного логина:
save_encrypted_cookies(context.cookies())

Загрузка и расшифровка cookies

def load_encrypted_cookies(key_path="secret.key"):
    try:
        with open(key_path, "rb") as key_file:
            key = key_file.read()
        f = Fernet(key)
        
        with open("cookies.encrypted", "rb") as f_in:
            encrypted_data = f_in.read()
        
        decrypted_data = f.decrypt(encrypted_data)
        cookies = json.loads(decrypted_data.decode("utf-8"))
        print("🍪 Cookies успешно расшифрованы")
        return cookies
    except FileNotFoundError:
        print("🔐 Файл cookies не найден — требуется вход")
        return None
    except Exception as e:
        print(f"❌ Ошибка расшифровки: {e}")
        return None

Используйте при запуске:

cookies = load_encrypted_cookies()
if cookies:
    context.add_cookies(cookies)

Безопасное хранение ключа в продакшене

На сервере лучше хранить ключ в переменной окружения, а не в файле:

import os
from cryptography.fernet import Fernet

def get_key():
    key = os.getenv("COOKIE_ENCRYPTION_KEY")
    if not key:
        raise ValueError("Переменная COOKIE_ENCRYPTION_KEY не задана!")
    return key.encode()

# При сохранении:
f = Fernet(get_key())
encrypted = f.encrypt(json.dumps(cookies).encode())

А в системе (например, в .env или через export):

export COOKIE_ENCRYPTION_KEY="ваш_ключ_из_Fernet.generate_key()"

Теперь даже если злоумышленник получит файл cookies.encrypted, он не сможет его использовать без ключа.
А сам ключ вы храните отдельно — в защищённой переменной или секретном менеджере (HashiCorp Vault, AWS Secrets и т.д.).

Это — минимальный уровень безопасности для любого скрипта, работающего с авторизацией.

Заключение

Теперь вы умеете:

✅ Автоматически входить на сайт через форму
✅ Сохранять и восстанавливать сессию через cookies
✅ Создавать «умный» скрипт, который сам решает, нужен ли повторный логин

Этот подход работает не только с демо-сайтами, но и с реальными личными кабинетами (если нет двухфакторной аутентификации или сложных капч).

💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий