# Скачивание папки профиля

Этот шаг полезен, если вы храните папки профиля на наших серверах (так происходит при использовании приложения Surfinite). Однако вы можете пропустить это, если храните свои папки локально, например. вы используете собственный выделенный сервер и хотите избежать дополнительных затрат на загрузку и выгрузку папки каждый раз, когда используется профиль.

# Содержимое папки

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

  • Куки
  • Настройки
  • Пароли
  • Закладки и расширения
  • История
  • Сессии, LocalStorage, IndexedDB и другие данные.

Некоторые из них хранятся на наших серверах в заархивированном формате, некоторые из них необходимо получить с помощью API (например, закладки и cookie), а некоторые загружаются и кэшируются локально (например, расширения, чтобы вы не загружали их каждый раз). запуск).

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

# aemulari

Мы предоставляем aemulari в виде бинарного файла. Если вы установили приложение Surfinite, вы найдете его в:

  • для Windows: C:\Users\<имя пользователя>\.surfinite\aemulari\aemulari.exe
  • для macOS: /Users/<имя пользователя>/.surfinite/aemulari/aemulari
  • для Linux: /home/<Имя пользователя>/.surfinite/aemulari/aemulari

Этот инструмент способен скачивать и загружать папки профиля, а также проверять прокси. Вы можете запустить его с аргументом --help, чтобы получить описание того, как его использовать. Но поскольку мы сосредоточены на загрузке папки профиля, соответствующая команда «aemulari» — «create-folder», и вот ее справочное сообщение:

$ ./aemulari create-folder --help

Create folder usage:
  --profile-id TEXT     Profile ID to use
  --path TEXT           Path to the folder. E.g. "path=C:\Profiles\MyProfile". 
                        If the folder does not exist, it will be created. If 
                        omitted, system's default temp dir would be used with 
                        profile id: <temp-dir>\<profile-id>
  --api-key TEXT        Your API key

Common options:
  --verbose             Be verbose (enable logging)


Вы можете предоставить аргументы в обеих формах: «ключ=значение» и «значение ключа», например:

./aemulari create-folder --profile-id="my_profile_id" --path=C:\Users\Me\profiles\my_profile_id --api-key MY_API_KEY

Если операция завершится успешно, исполняемый файл вернет путь к папке профиля в stdout и завершит работу. с кодом выхода 0.

# Коды выхода

Код Значение
0 Success. Путь к папке профиля выводится в stdout. Однако это полезно только в том случае, если вы не установили его в аргументах командной строки.
1 Unknown error, может указывать на что угодно: от недопустимых аргументов до некоторых сетевых ошибок. Должно быть сообщение об ошибке, возвращенное на stdout
2 Network error (где-то неверный код Curl). Должно быть сообщение об ошибке, возвращенное в stdout
101 Unauthorized Ключ API недействителен.
104 Not found. Профиль не существует или ваш ключ API не принадлежит кластеру профиля.
109 Conflict. Профиль в данный момент синхронизируется с сервером (кто-то загружает папку профиля)
110 Gone. Профиль удален и в настоящее время находится в корзине. Вы должны восстановить его, чтобы использовать его
200 Internal server error. Никакое сообщение не будет возвращено в stdout

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

# Использование из кода

В каждом языке программирования есть API для создания экземпляров процессов. Обычно вы указываете путь к «aemulari». и ваши аргументы. Однако есть одна сложная часть. Каждый процесс инициализируется тремя стандартными каналами:

  1. stdin для стандартного ввода
  2. stdout для стандартного вывода
  3. stderr для стандартной ошибки

Вы можете полностью игнорировать stdin. Тем не менее, мы рекомендуем перевести stdout в режим INHERIT IO, чтобы aemulari наследовал стандартный поток вывода от вызывающего процесса, то есть вашей программы. Таким образом, вы увидите что aemulari выводит в то же место, где вы выводите другую информацию в своем коде. Это может быть особенно полезно если используется флаг --verbose.

Хватит теории, вот пример того, как загрузить папку профиля из кода:

val pathToAemulari = "/home/myuser/.surfinite/aemulari/aemulari"

val profileId = "my_profile_id"
val apiKey = "MY_API_KEY"

val pathToProfile = "/home/myuser/surfiprofiles/$profileId"

// Start aemulari with our arguments
val process = ProcessBuilder(
    listOf(
        pathToAemulari,
        "create-folder",
        "--profile-id", profileId,
        "--path", pathToProfile,
        "--api-key", apiKey
    )
)
    .redirectOutput(ProcessBuilder.Redirect.INHERIT)
    .redirectError(ProcessBuilder.Redirect.INHERIT)
    .start()

// Wait for the process to exit
process.waitFor()

val exitCode = process.exitValue()
if (exitCode == 0) {
    println("Success")
} else {
    // The error message was already printed, as we called
    // redirectOutput(INHERIT), so just print the exit code
    println("Got error from aemulari. Code: $exitCode")
}