Перейти к содержимому

Автоматизация

Локальный API, ключи и вызовы

Интерфейс для ваших программ живёт на вашем компьютере и включается на экране «Для программистов»: порт на 127.0.0.1, свой токен и 26 ходов. На сервере отдельно живут ключи с правами и подписки, которые зовут ваш сервер, когда что-то произошло.
50325
Порт по умолчанию на 127.0.0.1
26
Ходов в локальном API
8
Прав, которые несёт ключ сервера
13
Событий, о которых придёт вызов

Где работает интерфейс

Локальный API это небольшой веб-сервер внутри программы. Ваши программы на той же машине зовут его по петле и получают ответ.

Всё, с чем он работает, лежит у вас на диске: профили, куки, движок и мост прокси. Пропала сеть, а ваши сценарии зовут по-прежнему, и сама программа держится без сети сутки.

  • Вести профили из своей программы

    Перечислить, создать, запустить, остановить и удалить, не трогая окно.

  • Подключить Puppeteer, Playwright или Selenium

    В ответ вы получаете адрес отладки именно этого профиля.

  • Запускать сохранённые сценарии снаружи

    Ваше расписание или сборочный сервер запускает сценарий по названным профилям.

  • Дать работать помощнику ИИ

    Через встроенный сервер MCP помощник ИИ берёт те же ходы, и интерфейс должен быть включён.

Переключатель и токен

Интерфейс выключен, пока вы его не включите, потому что включение открывает порт. При первом запуске программа выписывает себе случайный токен, 24 байта в виде 48 знаков, в файл, доступный только вашей учётной записи.

Токен вы передаёте тремя путями: параметром в адресе, своим заголовком или общим заголовком доступа. Обновив токен, вы остановите каждый сценарий со старым, поэтому программа сперва спрашивает подтверждение.

  1. 1

    Откройте экран «Для программистов»

    На нём переключатель, адрес, токен и список ходов.

  2. 2

    Нажмите «Включить локальный API»

    Вы должны увидеть «Запущен», а если обычный порт занят, панель назовёт тот, который взяла.

  3. 3

    Скопируйте адрес и токен

    Панель даёт готовую строку вызова с вашим собственным токеном внутри.

  4. 4

    Наведите на него свой сценарий

    Каждый ваш вызов, кроме хода состояния, несёт токен, а на неверный вы получите 401.

Экран «Для программистов» в ARMANOS: переключатель, местный адрес, токен доступа и список ходов.
Окно программы по-английски. На том же экране лежит готовая настройка для помощника ИИ.

Почему страница не дозвонится

Привязка к петле похожа на границу. Границей она не является: страницы, которые вы открываете, работают на этом же компьютере и до того же адреса дотянутся.

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

За той же проверкой стоит и ход состояния

Ходу состояния токен не нужен: ваш сценарий обязан уметь спросить, поднята ли программа. В ответ он называет продукт и его точную версию, а для антидетект-браузера один этот факт стоит прятать. Со страницы этот ход тоже не отвечает, поэтому чужой сайт не узнаёт ничего.

Ходы и один конверт

В ответе вы найдёте три поля: код, содержимое и сообщение. При удаче код равен нулю, а при отказе вы получаете причину. Особняком стоит вопрос о состоянии интерфейса: он отвечает своей короткой формой и полей содержимого с сообщением не несёт.

Ветвитесь по коду в конверте, а не по состоянию HTTP: состоянием отвечают отказы на входе, а отказ по существу приходит двухсотым с ненулевым кодом. Тело больше мегабайта интерфейс не обрезает: ответ 413 с payload_too_large, а загрузка куки, одноразовый профиль и ввоз принимают до 16 МБ.

Вызов
curl -H x-api-token:YOUR_TOKEN http://127.0.0.1:50325/api/v1/browser/list
Конверт
{ code: 0, msg: success, data: { list: [ ... ] } }
Один профиль
profileId, name, scenario, group, fingerprintTemplate, tags, notes, status, lastUsedAt, launches, runTimeMs, running
Его поле прокси
protocol, host, port. Ни логина, ни пароля
Неверный токен
HTTP 401, { code: -401, msg: unauthorized }
Вызов со страницы
HTTP 403, { code: -403, msg: forbidden }

На незнакомый путь вы получите 404. Токен можно везти и параметром адреса, и в заголовке доступа.

ХодСпособЧто делает
/statusGETГоворит, что программа поднята, и называет версию. Единственный ход без токена.
/api/v1/browser/listGETВаши профили, каждый со своим нынешним состоянием.
/api/v1/profile/listGET, POSTТот же набор с отбором, порядком и страницами; POST берёт длинный список номеров телом.
/api/v1/profile/quickPOSTЗаводит одноразовый профиль и открывает его; после закрытия он удаляется.
/api/v1/browser/startPOSTОткрывает профиль и отвечает адресом отладки. Профиль, закреплённый за ядром, которого на этом компьютере нет, не открывается и отвечает kernel_missing, а если выбран встроенный движок или ARMANOS Browser не запустился, kernel_builtin.
/api/v1/browser/stopPOSTЗакрывает все окна профиля и говорит, сколько закрыл.
/api/v1/browser/activeGETНомера профилей, открытых прямо сейчас.
/api/v1/profile/createPOSTСоздаёт профиль через те же ворота нормы, что и окно. Без presetId его заполняет заготовка по умолчанию этого компьютера, а присланное в теле сильнее; presetId none даёт профиль без заготовки. Заготовка, которую нельзя применить, отвечает preset_not_found, preset_no_free_proxy или preset_password_needs_account.
/api/v1/profile/updatePOSTМеняет только присланные поля, с теми же проверками, что у окна. Где эта версия программы не может менять ручные значения и ядро профиля аккаунта, ответ fp_edit_paused.
/api/v1/profile/deletePOSTКладёт профиль в корзину.
/api/v1/profile/unlockPOSTОткрывает закрытый паролем профиль на один запуск или до закрытия ARMANOS.
/api/v1/profile/lockPOSTСразу закрывает профиль с паролем снова.
/api/v1/profile/passwordPOSTСтавит или меняет пароль профиля.
/api/v1/profile/password/removePOSTСнимает пароль, если назван нынешний.
/api/v1/profile/codeGETНынешний разовый код для профиля с сохранённым ключом 2FA.
/api/v1/profile/cookiesGETКуки одного профиля, в JSON или в тексте Netscape.
/api/v1/profile/cookies/exportPOSTКуки до 100 профилей с ответом по каждому.
/api/v1/profile/cookies/importPOSTЗагружает куки в профиль, открытый или закрытый.
/api/v1/profile/exportPOSTНастройки прямо в ответе или полные архивы с сессией, до 100 профилей.
/api/v1/profile/importPOSTВозвращает профили из настроек или архивов с ответом по каждому.
/api/v1/proxy/listGETУзлы, порты и логины сохранённой библиотеки вместе с итогом последней проверки, но никогда пароли.
/api/v1/preset/listGETЗаготовки этого компьютера: номер для presetId в profile/create и какая из них по умолчанию.
/api/v1/flow/listGETСохранённые сценарии с числом шагов в каждом.
/api/v1/flow/runPOSTЗапускает сценарий по названным вами профилям.
/api/v1/app/stateGETВошла ли программа и кем, движок, открытые профили и видеокарта.
/api/v1/app/loginPOSTВходит в аккаунт кодом из кабинета, почтой с паролем или ключом аккаунта.

Запуск профиля из программы

Номер профиля можно передать и в теле, и в строке запроса: оба примера ниже передают его строкой запроса, и переделывать их не придётся. Можно попросить прогон без окна, а если не просить ничего, решает настройка самого профиля.

Три движка, три ответа

Что вернётся, зависит от движка. На ARMANOS Browser у каждого профиля свой адрес отладки, отделённый от всех остальных.

  • Движок ARMANOS Browser

    Порт и адрес сокета только для этого профиля. Подключайте свою библиотеку прямо к нему.

  • Встроенный движок

    Один общий порт на всю программу, названный в ответе вместе с предупреждением, что он общий.

  • Ни того, ни другого

    Вы получаете ответ о том, что адреса отладки нет и почему, а не пустое поле.

Интерфейс проходит те же ворота

Интерфейс это не чёрный ход. Профиль, созданный вызовом, проходит ту же проверку лицензии и нормы, что и созданный кнопкой в окне, и запустить его без лицензии не выйдет ни там, ни там.

Запуская сценарий, вы получите обратно номера профилей, которых программа не знает, а если в работу не взят ни один, это отказ, а не удача.

Удаление через интерфейс это корзина

Удалив профиль вызовом, вы кладёте его в корзину и освобождаете место по норме. С диска при этом не стирается ничего, и профиль вы вернёте из окна.

Ключи сервера и их права

Токен выше ведёт одну установку на одном компьютере. Ключ сервера это другое: он говорит с нашим сервером откуда угодно и окна браузера не открывает никогда.

Ключ вы видите один раз, при создании, а у себя мы держим ровно столько, чтобы отличать ваши ключи друг от друга. Ключи входят в платные тарифы, живых можно держать 20, а смена тарифа доходит до ключа за минуту.

ПравоЧто открывает
profiles:readСписок профилей и поиск по нему: отбор, порядок и страницы.
profiles:writeСоздать, править и удалить профиль.
browser:runОтметить профиль открытым или закрытым на сервере, без права его править.
proxies:readСохранённый список прокси, без паролей.
proxies:writeСоздать, править и удалить прокси, если роль человека это позволяет.
flows:readСписок сохранённых сценариев.
logs:readТо, что показывают вкладки «Действия», «Сессии профилей» и «Журнал IP», и правила подозрений.
app:signinВходить в программу ARMANOS на сервере, устройством, которое занимает место. По умолчанию не отмечено; вход ключом не выпускает ключей, не меняет пароль и не трогает оплату.

Вызовы вашего сервера

Вызов это наш сервер, который зовёт ваш, когда в вашем пространстве что-то произошло. Подписки заводит человек, вошедший паролем, а не ключ, и новая заводится только после повторного ввода пароля и числа второго шага, если он включён. Держать их можно до десяти.

Каждый вызов подписан, и поля с именами, похожими на доступы, до вашего приёмника не доезжают. Код приглашения или ссылка на смену пароля не уезжают на чужой сервер.

  • Профили

    profile.create, profile.update, profile.delete, profile.start, profile.stop, profile.transfer.accept

  • Прокси

    proxy.create, proxy.update, proxy.delete

  • Ключи

    apikey.create, apikey.revoke

  • Команда

    team.invite, team.remove

  • Деньги

    plan.change

Как выглядит доставка

К неудачам доставка честна: три попытки, повтор при ошибке сервера, при отказе «слишком часто» и когда ответа не было вовсе, и последнее состояние вы видите на самой подписке. После пятнадцати неудач подряд подписка выключает сама себя.

Способ
POST, Content-Type application/json
X-Armanos-Event
profile.start
X-Armanos-Timestamp
Секунды Unix, они же часть подписи
X-Armanos-Signature
sha256=... HMAC от времени и тела
Тело
{ id, event, createdAt, data }
Доставка
Хотя бы один раз. Храните id и отбрасывайте повторы

За переадресацией мы не идём: ответ, наводящий обратно на петлю, отменил бы проверку адреса. Пробная отправка помечена как проба, чтобы у вас не завёлся призрачный профиль.

Адрес сверяется перед каждой отправкой

Ваш адрес мы разбираем заново, а частным диапазонам отказываем, включая облачный адрес, который выдаёт доступы ко всей учётной записи.

Чего это не делает

  • Локальный API дотягивается только до той копии ARMANOS, что стоит на этом компьютере. Хода из облака, открывающего у вас окно, нет, и ключ сервера ничего не запускает: он лишь отмечает профиль занятым и пишет журнал.
  • Локальный токен один на весь интерфейс. У него нет ни прав по ходам, ни срока годности, и его обновление разом останавливает все ваши сценарии.
  • У локального API нет своего предела запросов. Он доверяет машине, на которой работает, поэтому от чужого вызова вас там берегут только проверка на страницу и токен.
  • Ключом сервера нельзя завести ни ключ, ни подписку, а любой ход без объявленного права закрыт ключу целиком. Корзина, показ отпечатка, смена и проверка прокси, правка сценариев доступны только входу паролем.
  • Доставка вызова идёт «хотя бы один раз», и в теле едут лишь поля, оставшиеся после вырезания доступов. Ваш приёмник обязан отбрасывать повторы по id и сам запрашивать предмет, когда события ему мало.

Как проверить

Каждое утверждение на этой странице взято из файла, который можно открыть, и почти каждое держит стенд, который исполняется.

Локальный API отвергает запросы со следами страницы, и /status стоит за той же проверкой
apps/desktop/src/lib/local-api.js · apps/desktop/test/local-api-gate.js
Незащищённый порт отладки уровня программы открывается только для встроенного движка
apps/desktop/src/main/main.js · apps/desktop/test/cdp-port-only-when-needed.js
Токен случаен на каждой установке, а интерфейс изначально выключен
apps/desktop/src/lib/api-config.js · apps/desktop/src/main/main.js
Ключи сервера платные, и каждое право охраняет настоящий ход
apps/server/src/api-keys/api-keys.service.ts · apps/server/test/ключи-платные.js · apps/server/test/права-ключей-живые.js
Вызовы подписаны, их нельзя навести внутрь нашей сети, а неудачи записываются
apps/server/src/webhooks/webhook-dispatch.service.ts · apps/server/test/webhooks.js · apps/web/test/webhooks-web.js

Вопросы

Что будет, если обычный порт уже занят?
Сервер возьмёт свободный порт, а панель его назовёт. Ваши сценарии по-прежнему смотрят на старый адрес, поэтому после перезапуска читайте панель, а не полагайтесь на 50325. Сервер MCP ищет новый порт сам.
По какому ответу видно, что кончилась оплата, а не права?
402 означает, что кончилось оплаченное время, 401 что ключ негоден или отозван, 403 что не хватает права. Три разных кода, чтобы программа действовала, а не гадала.
Может ключ завести другой ключ?
Нет. Ключи и подписки заводит только человек, вошедший паролем, поэтому один утёкший ключ не наплодит новых. А новый ключ и новая подписка к тому же заводятся только после повторного ввода своего пароля и числа второго шага, если он включён. Блокировка учётной записи гасит её ключи на ближайшем вызове.
Что дают два набора для разработчика?
Один для Node и один файл для Python, который не тянет ничего вне стандартной библиотеки. Оба берут ключ и адрес из окружения, сдаются через 30 секунд и возвращают типизированные ошибки, а не сообщение, которое могут перевести.
Как проверить подпись вызова у себя?
Оба набора несут эту проверку: она сравнивает за постоянное время и отвергает всё старше 300 секунд. Без неё любой, кто узнал ваш адрес, пришлёт вам выдуманное событие.
Видно ли в журнале, что это сделал сценарий, а не человек?
Да. Когда вызов приходит через ключ, в строке журнала вы увидите и номер ключа, поэтому один утёкший ключ не означает отзыв всех остальных.

Включите и позовите уже сегодня

Экран «Для программистов» есть в каждой сборке. Включите в программе локальный API и наведите свой сценарий на 127.0.0.1.