- Регистрация
- 24.12.2024
- Сообщения
- 10
- Благодарностей
- 27
- Баллы
- 3
Phantom Pilot: Скрытая автоматизация браузера через ZennoPoster
Введение
В постоянно развивающемся ландшафте веб-автоматизации, ZennoPoster зарекомендовал себя как мощный инструмент для выполнения рутинных задач. Однако существуют сценарии, где требуется более глубокий контроль, повышенная скрытность или взаимодействие с элементами, которые не поддаются стандартным методам DOM-манипуляций (например, Flash-элементы, элементы Canvas, или интерфейсы, основанные на изображениях). Именно здесь на сцену выходит концепция "Phantom Pilot" – использование Python-скриптов для расширения возможностей ZennoPoster, позволяя осуществлять пиксельную автоматизацию, точное управление курсором и клавиатурой, а также интеллектуальное ожидание условий на странице.
"Phantom Pilot" предоставляет ZennoPoster беспрецедентную гибкость, позволяя автоматизировать задачи, которые были бы трудновыполнимы или невозможны с использованием только встроенных функций. Это достигается за счет синергии двух мощных библиотек:
Обзор компонентов "Phantom Pilot" и их отладка
1. Запуск и подключение к Chrome
Назначение: Этот скрипт является фундаментом "Phantom Pilot". Он позволяет запустить Google Chrome в контролируемом режиме (с включенным удаленным отладчиком) и затем подключить к нему Selenium WebDriver. Это ключевой элемент скрытой автоматизации, так как он позволяет управлять уже существующим экземпляром браузера без видимого открытия нового окна, а также использовать постоянный профиль пользователя для сохранения сессий, куки и других данных, что делает действия более естественными.
Детальный разбор кода:
Назначение: Этот скрипт обеспечивает пиксельную автоматизацию, позволяя взаимодействовать с элементами на экране, не полагаясь на их DOM-структуру. Это незаменимо для элементов, которые представляют собой изображения, или для сложных интерфейсов, где DOM-селекторы нестабильны (например, Flash-приложения, элементы Canvas, кастомные виджеты).
Детальный разбор кода:
Назначение: Этот скрипт позволяет скрипту приостанавливать выполнение до тех пор, пока желаемое условие на веб-странице не будет выполнено. Это крайне важно для динамических веб-приложений (SPA, AJAX-загрузки), где элементы появляются не сразу после загрузки страницы.
Детальный разбор кода:
Назначение: Этот скрипт обеспечивает чистое и корректное завершение работы браузера. Это критически важно для освобождения системных ресурсов и предотвращения "утечек" процессов Chrome, которые могут накопиться и замедлить систему при некорректном завершении автоматизации.
Детальный разбор кода:
1. Установка необходимого ПО:
После того как каждый Python-скрипт будет отлажен и готов, вы можете интегрировать их в ZennoPoster:
"Phantom Pilot" представляет собой продвинутый подход к автоматизации браузеров, который значительно расширяет возможности ZennoPoster. Интегрируя Python-скрипты с Selenium, PyAutoGUI и Pynput, мы получаем гибкий, мощный и скрытный инструмент. Эта концепция позволяет:
К этому кейсу "Phantom Pilot: Скрытая автоматизация браузера через ZennoPoster" прилагается набор Python-скриптов, разработанных для всесторонней работы с браузером. Эти скрипты полностью применимы и легко интегрируются в проекты ZennoPoster, значительно расширяя его возможности по автоматизации.
Введение
В постоянно развивающемся ландшафте веб-автоматизации, ZennoPoster зарекомендовал себя как мощный инструмент для выполнения рутинных задач. Однако существуют сценарии, где требуется более глубокий контроль, повышенная скрытность или взаимодействие с элементами, которые не поддаются стандартным методам DOM-манипуляций (например, Flash-элементы, элементы Canvas, или интерфейсы, основанные на изображениях). Именно здесь на сцену выходит концепция "Phantom Pilot" – использование Python-скриптов для расширения возможностей ZennoPoster, позволяя осуществлять пиксельную автоматизацию, точное управление курсором и клавиатурой, а также интеллектуальное ожидание условий на странице.
"Phantom Pilot" предоставляет ZennoPoster беспрецедентную гибкость, позволяя автоматизировать задачи, которые были бы трудновыполнимы или невозможны с использованием только встроенных функций. Это достигается за счет синергии двух мощных библиотек:
- Selenium WebDriver: Для программного управления браузером на основе DOM, навигации по страницам, работы с элементами HTML.
- PyAutoGUI и Pynput: Для низкоуровневой автоматизации графического интерфейса пользователя (GUI) – перемещения курсора, кликов, ввода текста, основываясь на распознавании изображений на экране.
- Запуск и подключение: Инициирование и подключение к уже запущенному экземпляру браузера Chrome с удаленной отладкой.
- Имитация взаимодействия: Выполнение пользовательских действий, таких как клики по графическим элементам и ввод текста, через программное управление мышью и клавиатурой.
- Ожидание условий: Интеллектуальная пауза выполнения скрипта до появления определенных элементов или текста на веб-странице.
- Корректное завершение: Чистое закрытие всех окон браузера и завершение его процессов.
Обзор компонентов "Phantom Pilot" и их отладка
1. Запуск и подключение к Chrome
Назначение: Этот скрипт является фундаментом "Phantom Pilot". Он позволяет запустить Google Chrome в контролируемом режиме (с включенным удаленным отладчиком) и затем подключить к нему Selenium WebDriver. Это ключевой элемент скрытой автоматизации, так как он позволяет управлять уже существующим экземпляром браузера без видимого открытия нового окна, а также использовать постоянный профиль пользователя для сохранения сессий, куки и других данных, что делает действия более естественными.
Детальный разбор кода:
- subprocess.Popen: Используется для асинхронного запуска Chrome. Это означает, что Python-скрипт запускает Chrome и продолжает свое выполнение, не дожидаясь завершения работы браузера. Это важно, потому что Chrome будет работать параллельно.
- --remote-debugging-port={port}: Этот флаг критически важен. Он указывает Chrome открыть порт для удаленной отладки, через который Selenium может подключиться к браузеру. Порт 9222 является стандартным, но вы можете использовать любой свободный порт.
- --user-data-dir={path}: Позволяет указать путь к пользовательскому профилю Chrome. Это гарантирует, что браузер запускается с одним и тем же профилем каждый раз, сохраняя все данные, такие как логины, куки, историю. Это очень важно для поддержания сессии.
- chrome_options.debugger_address: Selenium использует этот параметр для указания, к какому адресу удаленной отладки нужно подключиться.
- Проверка пути Chrome: Убедитесь, что chrome_path указывает на правильный исполняемый файл chrome.exe на вашей системе. Ошибки FileNotFoundError часто указывают на неверный путь.
- Проверка порта: Убедитесь, что порт 9222 (или выбранный вами) не занят другими приложениями. Если Chrome не запускается или Selenium не может подключиться, возможно, порт уже используется. Вы можете проверить это через командную строку (netstat -ano | findstr :9222 в Windows).
- Запуск Chrome вручную: Для отладки попробуйте запустить Chrome с теми же флагами через командную строку:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="C:\MyChromeProfile"
Если Chrome не запускается, проблема в путях или флагах. Если запускается, но Selenium не подключается, проблема может быть в Selenium или его совместимости с версией Chrome. - Совместимость версий: Selenium WebDriver (chromedriver) должен строго соответствовать версии вашего Chrome. Если версии не совпадают, вы получите ошибку SessionNotCreatedException. Загрузите правильную версию chromedriver с официального сайта ChromeDriver (найдите версию, соответствующую вашей версии Chrome).
- Задержки: time.sleep(5) после запуска Chrome дает браузеру достаточно времени для полной инициализации перед попыткой подключения Selenium. При необходимости увеличьте эту задержку.
Назначение: Этот скрипт обеспечивает пиксельную автоматизацию, позволяя взаимодействовать с элементами на экране, не полагаясь на их DOM-структуру. Это незаменимо для элементов, которые представляют собой изображения, или для сложных интерфейсов, где DOM-селекторы нестабильны (например, Flash-приложения, элементы Canvas, кастомные виджеты).
Детальный разбор кода:
- pyautogui.locateOnScreen(): Ключевая функция для распознавания изображений. Она сканирует экран на предмет совпадения с заданным изображением-шаблоном.
- confidence: Параметр, определяющий порог схожести. Значение 0.8 (80%) означает, что скрипт будет искать совпадения, которые как минимум на 80% похожи на шаблон. Это важно для устойчивости к небольшим изменениям в интерфейсе, теням или цветовым нюансам. Рекомендуется начинать с 0.8-0.9 и подбирать в зависимости от условий.
- grayscale=True: Повышает скорость поиска и устойчивость к незначительным изменениям цвета, преобразуя изображения в оттенки серого перед сравнением.
- pynput.mouse.Controller: Позволяет низкоуровнево управлять курсором мыши, перемещать его и выполнять клики. Использование pynput вместо pyautogui.click() может быть полезно для более точного контроля или обхода некоторых специфических проблем с pyautogui.
- pyautogui.write(): Имитирует ввод текста с клавиатуры. Параметр interval добавляет задержку между вводимыми символами, делая ввод более реалистичным и предотвращая пропуск символов в медленно реагирующих полях.
- get_random_line_from_file(): Пример функции для чтения случайной строки из текстового файла, что полезно для внесения вариативности в вводимые данные.
- Качество изображений: Шаблоны изображений (some_clickable_area.png) должны быть четкими и представлять собой именно тот элемент, по которому нужно кликнуть. Обрезайте изображения точно по границам элемента.
- Разрешение экрана: pyautogui сильно зависит от разрешения экрана. Если скрипт разрабатывается на одном разрешении, а запускается на другом, поиск изображений может не работать. Убедитесь, что разрешения совпадают или используйте относительные координаты, если это возможно, хотя это сложнее.
- Изменения UI: Если интерфейс веб-сайта часто меняется (например, A/B-тестирование, динамические баннеры), изображения-шаблоны могут перестать работать. Подготовьте несколько вариантов изображений (используя glob.glob и image_variants) или регулярно обновляйте шаблоны.
- Файлы с фразами: Убедитесь, что TEXT_PHRASES_FILE указывает на существующий файл с корректными фразами, каждая на новой строке.
- Видимость элемента: pyautogui может кликнуть только по видимому элементу. Убедитесь, что элемент не скрыт за другим окном или вкладкой.
- Задержки: Добавление небольших задержек (time.sleep) после кликов или перед вводом текста критически важно для стабильности, особенно на медленных системах или при загрузке динамического контента.
Назначение: Этот скрипт позволяет скрипту приостанавливать выполнение до тех пор, пока желаемое условие на веб-странице не будет выполнено. Это крайне важно для динамических веб-приложений (SPA, AJAX-загрузки), где элементы появляются не сразу после загрузки страницы.
Детальный разбор кода:
- WebDriverWait: Класс Selenium для реализации явных ожиданий. Он позволяет задать максимальное время ожидания и частоту проверки условия.
- expected_conditions as EC: Модуль, содержащий набор предопределенных условий для ожидания. EC.text_to_be_present_in_element((By.XPATH, "//*"), text_to_wait_for) - одно из самых полезных условий, ожидающее появления определенного текста в любом элементе DOM.
- By.XPATH, "//*": By.XPATH указывает на использование XPath для поиска элемента, а "//*" означает "любой элемент на странице". Это универсальный, но потенциально медленный способ поиска текста. Если вы знаете, в каком конкретном элементе появится текст, используйте более точный локатор (например, By.ID, By.CLASS_NAME).
- TimeoutException: Специальное исключение, которое выбрасывается, если условие не выполняется в течение заданного wait_timeout_seconds.
- Выбор текста: Текст text_to_wait_for должен быть уникальным и стабильным индикатором успеха или изменения состояния страницы. Избегайте слишком общих фраз.
- Локаторы: Если вы сталкиваетесь с проблемами ожидания, проверьте локатор. Откройте страницу в браузере, используйте инструменты разработчика (Ctrl+Shift+I), чтобы найти элемент, содержащий нужный текст, и убедитесь, что ваш By локатор (XPath, CSS-селектор, ID и т.д.) правильно его определяет.
- Динамические элементы: Некоторые элементы могут появляться и исчезать, или их текст может меняться. Тщательно тестируйте условия ожидания.
- Сетевые задержки: На медленном интернете или при высокой нагрузке на сервер веб-сайта, увеличьте wait_timeout_seconds.
- Потоки: Убедитесь, что ваш Selenium WebDriver экземпляр (driver) доступен в контексте функции wait_for_text_on_page. Если вы используете многопоточность, каждый поток должен иметь свой собственный экземпляр драйвера.
Назначение: Этот скрипт обеспечивает чистое и корректное завершение работы браузера. Это критически важно для освобождения системных ресурсов и предотвращения "утечек" процессов Chrome, которые могут накопиться и замедлить систему при некорректном завершении автоматизации.
Детальный разбор кода:
- driver.close(): Закрывает текущую активную вкладку (окно).
- driver.window_handles: Возвращает список всех открытых вкладок/окон. Итерация по этому списку и закрытие каждой вкладки обеспечивает полное закрытие всех окон.
- driver.switch_to.window(handle): Переключает Selenium на определенную вкладку/окно по ее хэндлу (идентификатору).
- driver.quit(): Закрывает все окна браузера и завершает процесс ChromeDriver. Это должно быть последним действием, связанным с драйвером.
- try...finally: Блок finally гарантирует, что driver.quit() будет вызван, даже если произошла ошибка в блоке try. Это обеспечивает очистку ресурсов.
- Проверка подключения: Перед попыткой закрытия убедитесь, что скрипт успешно подключился к браузеру. Если подключение не удалось, driver будет None, и попытка вызвать методы driver вызовет ошибку.
- NoSuchWindowException: Это исключение часто возникает, если вы пытаетесь переключиться на вкладку, которая уже была закрыта, или если браузер был закрыт вручную. Скрипт пытается обработать это.
- Множественные процессы: Иногда, если Chrome не закрывается полностью, в диспетчере задач могут оставаться "висящие" процессы chrome.exe или chromedriver.exe. Убедитесь, что driver.quit() вызывается всегда. Если проблема сохраняется, возможно, потребуется принудительное завершение процессов (для этого нужны дополнительные библиотеки Python, такие как psutil, но это не входит в рамки данного кейса).
1. Установка необходимого ПО:
- Python: Установите Python (рекомендуется 3.8+).
- Pip: Утилита для установки пакетов Python. Обычно поставляется с Python.
- Установка библиотек: Откройте командную строку (или терминал) и выполните:
pip install selenium pyautogui pynput requests
- ChromeDriver: Загрузите ChromeDriver, соответствующий вашей версии Google Chrome, с официального сайта: https://chromedriver.chromium.org/downloads. Поместите исполняемый файл chromedriver.exe в папку, доступную из PATH вашей системы (например, C:\Windows) или укажите полный путь к нему при инициализации драйвера Selenium (хотя в данном кейсе Selenium подключается к уже запущенному браузеру, ChromeDriver все равно требуется для создания сессии).
- C:\Users\PAINKILLER\Desktop\pinterest\click_img: Создайте эту папку и поместите туда изображения, которые вы хотите использовать для кликов (some_clickable_area.png и т.д.).
- C:\Users\PAINKILLER\Desktop\pinterest\phrases.txt: Создайте этот текстовый файл и добавьте в него фразы, каждую на новой строке, для ввода.
- C:\MyChromeProfile: Это папка для профиля Chrome, она будет создана автоматически при первом запуске Chrome с этим флагом.
- Print-выражения: Активно используйте print() для вывода сообщений о ходе выполнения, значениях переменных, найденных координатах и т.д. Это ваш основной инструмент диагностики.
- Блоки try-except: Всегда оборачивайте потенциально проблемные операции в блоки try-except для перехвата исключений и вывода информативных сообщений об ошибках. Это поможет вам понять, где и почему происходит сбой.
- Раздельный запуск: Запускайте каждый скрипт по отдельности на ранних этапах разработки, чтобы убедиться, что каждый компонент работает корректно, прежде чем объединять их в единый рабочий процесс.
- Визуальная проверка: Внимательно наблюдайте за поведением браузера во время выполнения скрипта. Курсор движется не туда? Текст вводится не в то поле? Это даст ценные подсказки.
- Инструменты разработчика Chrome: Используйте F12 в Chrome для изучения DOM-структуры страницы, отслеживания сетевых запросов и просмотра консоли на предмет ошибок JavaScript. Это особенно полезно при отладке проблем с Selenium.
После того как каждый Python-скрипт будет отлажен и готов, вы можете интегрировать их в ZennoPoster:
- Блок "Выполнить внешний код": В ZennoPoster создайте новый проект и используйте действие "Выполнить внешний код" (Execute External Code).
- Выбор языка: Укажите Python.
- Вставка кода: Вставьте содержимое каждого Python-скрипта в соответствующий блок "Внешний код".
- Передача параметров: Если вашим скриптам нужны динамические параметры (например, URL, текст для ввода), вы можете передавать их из ZennoPoster в Python-скрипт через аргументы командной строки или переменные окружения, которые затем будут считаны в Python.
- Логирование: Используйте print() в Python-скриптах; ZennoPoster будет захватывать этот вывод в свои логи, что упростит отладку уже в ZennoPoster.
"Phantom Pilot" представляет собой продвинутый подход к автоматизации браузеров, который значительно расширяет возможности ZennoPoster. Интегрируя Python-скрипты с Selenium, PyAutoGUI и Pynput, мы получаем гибкий, мощный и скрытный инструмент. Эта концепция позволяет:
- Скрытно управлять браузером: Подключение к уже запущенному экземпляру Chrome с постоянным пользовательским профилем создает более естественное и незаметное поведение.
- Имитировать реальные действия пользователя: Возможность пиксельного распознавания изображений, точного управления курсором и реалистичного ввода текста позволяет автоматизировать задачи, недоступные для стандартных DOM-манипуляций.
- Гибко реагировать на динамическое содержимое: Использование явных ожиданий Selenium гарантирует, что скрипт будет надежно работать даже с асинхронно загружаемыми или динамически изменяющимися веб-страницами.
- Эффективно управлять системными ресурсами: Корректное завершение работы браузера предотвращает накопление процессов и обеспечивает стабильность системы.
К этому кейсу "Phantom Pilot: Скрытая автоматизация браузера через ZennoPoster" прилагается набор Python-скриптов, разработанных для всесторонней работы с браузером. Эти скрипты полностью применимы и легко интегрируются в проекты ZennoPoster, значительно расширяя его возможности по автоматизации.
Вложения
-
7,6 КБ Просмотры: 6
-
36,4 КБ Просмотры: 1
Последнее редактирование модератором: