Автоматизация браузера Camoufox: запуск и подключение

    Camoufox - это модифицированный браузер Firefox, оптимизированный для веб-скрапинга и обхода систем обнаружения ботов. Для его эффективного использования требуется корректная настройка процесса запуска и последующего подключения.

    1. Запуск серверов и браузеров через Python/Playwright

    Исходный скрипт на Python запускает несколько экземпляров Camoufox на разных портах. Каждый экземпляр работает в отдельном потоке и доступен через WebSocket.

    • Для каждого конфигурационного набора (порт, путь, имя) создаются два потока: один для сервера, другой для автоматизации браузера.
    • Сервер запускается на указанном порту (например, 2525).
    • URL для подключения к браузеру формируется по шаблону: ws://localhost:{port}/{path} (например, ws://localhost:2525/browser2525).
    • Запуск серверов и браузеров происходит с задержками, указанными в конфигурации, для стабильности.

    2. Ручная аутентификация и долгосрочная сессия

    После запуска в браузере Camoufox вручную выполняется вход в аккаунты (например, Google и Midjourney). Ключевое требование - браузер должен оставаться активным продолжительное время, чтобы другие скрипты могли подключаться к уже аутентифицированной сессии и работать в её контексте.

    3. Проблема подключения стороннего скрипта

    Второй скрипт пытается подключиться к работающему экземпляру браузера, используя тот же WebSocket URL (например, ws://localhost:2525/browser2525).

    • Сначала проверяется доступность порта Camoufox.
    • Затем выполняется попытка подключения через playwright.firefox.connect().

    Однако возникает проблема: вместо подключения к существующему браузеру с сохранённым контекстом (логинами, cookies), Playwright запускает новый, чистый экземпляр. Это приводит к потере аутентифицированной сессии и делает невозможным выполнение задач, требующих сохранения состояния.

    Для успешной автоматизации необходимо обеспечить стабильное подключение именно к уже запущенному и настроенному экземпляру Camoufox, а не создание новой изолированной сессии.