#
Скачивание папки профиля
Этот шаг полезен, если вы храните папки профиля на наших серверах (так происходит при использовании приложения 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
.
#
Коды выхода
Вы получите сообщение об ошибке сервера, возвращенное в stdout
, если получите коды ошибок 101-110
. Обычно вам
следует обратиться в службу поддержки, если вы получаете коды выхода «1», «2» или «200» и не можете исправить это самостоятельно.
#
Использование из кода
В каждом языке программирования есть API для создания экземпляров процессов. Обычно вы указываете путь к «aemulari». и ваши аргументы. Однако есть одна сложная часть. Каждый процесс инициализируется тремя стандартными каналами:
stdin
для стандартного вводаstdout
для стандартного выводаstderr
для стандартной ошибки
Вы можете полностью игнорировать stdin
. Тем не менее, мы рекомендуем перевести stdout
в режим INHERIT IO
, чтобы
aemulari
наследовал стандартный поток вывода от вызывающего процесса, то есть вашей программы. Таким образом, вы увидите что
aemulari
выводит в то же место, где вы выводите другую информацию в своем коде. Это может быть особенно полезно
если используется флаг --verbose.
Дополнительно
Если вы используете флаг --verbose и не устанавливаете INHERIT IO и не используете вывод stdout вручную, есть небольшая вероятность дедлоки и «эмуляри» будет работать вечно. Это происходит, когда буфер потока заполнен и никто его не читает.
Это единственная причина, по которой мы написали об этих стандартных потоках - чтобы вы не допустили этой ошибки 🙂
Хватит теории, вот пример того, как загрузить папку профиля из кода:
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")
}
Особенность: локальный сервер
В будущем мы добавим возможность запускать aemulari как локальный сервер, прослушивающий какой-либо порт, чтобы вам не приходилось иметь дело с процессами (API процессов обычно громоздкий). Но на данный момент интерфейс CLI — единственный выход. И это тоже прекрасно работает.