# Запуск браузера

Как описано в Как это работает – Основы, чтобы запустить браузер, сначала необходимо найти бинарные файлы chrome и chromedriver, т.к. вы будете их использовать.

Вы можете использовать их для запуска браузера как для автоматического (требуется «chromedriver»), так и для ручного использования. Независимо от того, как вы запускаете его, есть четыре аргумента командной строки, которые вы обычно должны предоставить браузеру.

# Аргументы командной строки

  1. --user-data-dir — путь к папке профиля. Будет использоваться браузером для чтения и сохранения профиля. такие данные, как файлы cookie, пароли, история, закладки и т.д.
  2. --profile-id — идентификатор профиля
  3. --browser-keybrowserKey из ответа запроса на старт профиля.
  4. --profile-lock - profileLock из ответа запроса на старт профиля.

Все параметры совершенно необязательны - если, конечно, вы не хотите использовать отпечаток пальца 😅. Шутки в сторону - это может быть полезно для целей тестирования, например. тестирование аргументов командной строки, отладка дисплея X11 функции или что-то еще, что не связано с запуском профиля.

Однако, чтобы включить подмену отпечатков пальцев, вы должны обязательно указать аргументы --profile-id и --browser-key.

Параметр --user-data-dir должен указывать на папку, созданную на этапе загрузки папки, или любую другую папку, которую вы хотите использовать вместо этого. Если он не указан, будет использоваться профиль Chromium по умолчанию.

Параметр --profile-lock обязательно рекомендуется использовать, если вы использовали механизм блокировки, поскольку браузер отправляет ping-запросы на сервер, указывая, что ваш сеанс активен. Если вы использовали блокировку при запуске профиля, но забыли выставить их при запуске браузера, блокировка сессии станет неактивной через 5 минут, так как не были получены сообщения с пингом браузера

# Запуск

Если вы разрабатываете какое-то клиентское приложение и вам просто нужно запустить окно браузера без использования Selenium, вы должны использовать тот же API процесса, который вы использовали бы для загрузки папки с «aemulari». Вы должны установить аргументы командной строки непосредственно в бинарный файл chrome.

Но мы предполагаем, что основная причина, по которой вы читаете это руководство, заключается в том, что вы действительно хотите автоматизировать некоторые процессы. Итак, как вы могли видеть в разделе Как это работает – Основы, вы должны создать ChromeOptions и указать для него флаги, с которыми вы хотите запустить Chrome. Обычно это те четыре, которые описаны выше. Затем вы инициализируете объект ChromeDriver с этими параметрами и этого достаточно.

Когда вы запускаете браузер, он делает несколько вещей. Сначала он инициализирует ваш отпечаток пальца. Затем он устанавливает прокси. Если вы используете прокси-сервер SSH, он также включает переадресацию портов, поэтому вы получаете локальную переадресацию прокси-сервера SOCKS на свой компьютер по протоколу SSH. Наконец, если вы используете автоматические функции WebRTC или геолокации, они извлекают данные для этих API.

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

Если все пойдет хорошо, откроется окно браузера и вы получите сообщение «Успешно запущено» в stdout.

# Коды ошибок

Код Значение
1 Может указывать на что угодно: от недопустимых аргументов до некоторых сетевых ошибок. Должно быть сообщение об ошибке, выведенное в stdout
2 Сетевая ошибка (где-то неверный код Curl). Обычно это указывает на то, что прокси не работает. Должно быть сообщение об ошибке, выведенное в stdout
3 Ошибка URL-адреса изменения IP. Конечная точка ответила кодом ответа, отличным от 200. Должна быть ошибка, выведенная в stdout
4 Ошибка URL-адреса изменения IP. Сетевая ошибка (неправильный код Curl). Должна быть ошибка, выведенная в stdout
6 Ошибка автоматического поля. Несанкционированный (401). Срок действия вашего «browserKey» истек.
7 Ошибка автоматического поля. Сетевая ошибка (неправильный код Curl). Должна быть ошибка, выведенная в stdout
8 Ошибка автоматического поля. Сервер ответил кодом ответа, отличным от 200. Он будет выведен в stdout
103 Запрещенный. Идентификатор профиля и ключ браузера не найдены.
104 Not found. Профиль не существует
110 Gone. Профиль удален и в настоящее время находится в корзине. Вы должны восстановить его, чтобы использовать его
124 Неудачная зависимость. Прокси из списка прокси, назначенного этому профилю, больше не существует. Обновите профиль новым прокси
200 Ошибка внутреннего сервера. Никакое сообщение не будет выведено в stdout
255 Вы можете получить этот код, если возникнут проблемы с прокси-сервером SSH. stdout может иметь сообщение об ошибке

Вы получите сообщение об ошибке сервера, выведенное в stdout, если получите коды ошибок 103-122. Обычно вам следует обратиться в службу поддержки, если вы получаете коды выхода «1-8», «200» или «255» и не можете исправить это самостоятельно.

Вы также получите сообщение об ошибке вида CURL error: <message>, выведенное в stdout в случае кода выхода 2. что может помочь вам исправить ошибку самостоятельно. Однако, если вы уверены, что ваш прокси действителен и вы по-прежнему получаете этот код, обратитесь в службу поддержки, чтобы мы могли разобраться в проблеме.

# Поведение ChromeDriver

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

Если вы используете Selenium, вы получите исключение SessionNotCreatedException, вызванное в инициализации ChromeDriver с сообщением, которое кроме большого количества не очень полезной информации будет содержать строку вида Surfinite code: <exitcode>. Проверьте пример кода ниже.

# Пример кода

val profileId = "6335f488e21dc11848fd225e"
val useLock = false

// Start the profile
val startProfileResponse = startProfile(
    profileId = profileId,
    useLock = useLock
)

// Skip downloading folder, just set empty dir
val profileDir = File("profiledirs")
    .combineSafe(profileId)

val options = ChromeOptions()
options.addArguments(
    listOf(
        "--user-data-dir=${profileDir.absolutePath}",
        "--profile-id=$profileId",
        "--browser-key=${startProfileResponse.browserKey}"
    ).let { args ->
        // if there is a profileLock, add it to chrome arguments
        if (startProfileResponse.profileLock != null) {
            args + "--profile-lock=${startProfileResponse.profileLock}"
        } else {
            args
        }
    }
)

val chromePath = "/home/myuser/.surfinite/browser/chrome"
val chromeDriverPath = "/home/myuser/.surfinite/browser/chromedriver"

// Set Chrome binary path
options.setBinary(chromePath)
// Set Chromedriver binary path
System.setProperty("webdriver.chrome.driver", chromeDriverPath)

val driver = runCatching {
    ChromeDriver(options)
}.getOrElse {
    if (it is SessionNotCreatedException) {
        val message = it.message
        if (message != null && message.contains("Surfinite code")) {
            val surfiniteCode = message
                .substringAfter("Surfinite code: ")
                .substringBefore('\n')
            println("Got Surfinite error code: $surfiniteCode")
        } else {
            // Error not related to fingerprint or proxy
            it.printStackTrace()
        }
    } else {
        // Some other error
        it.printStackTrace()
    }
    return
}

driver["https://example.com"]

# Поиск проблем

К сожалению, при использовании ChromeDriver вы не получите никакого вывода в stdout. Итак, если вы получаете ошибки «1–8» или «255», у вас не будет возможности исправить это самостоятельно. Чтобы попытаться отладить происходящее и получить аутпут chrome, вам придется запустить браузер без ChromeDriver, исправить ошибку, а затем вернуться к использованию ChromeDriver.

Если вы работаете с прокси или в каких-то условиях у вас часты ошибки и вы хотите видеть вывод из stdout каждый раз, когда вы запускаете браузер, обратитесь в нашу службу поддержки. Таких случаев мы еще не видели и над этим не работали. Это все еще возможно, но не в нашей текущей дорожной карте.