Автоматизация
Расписания и запуск без окна
- Каждый день, по выбранным дням, каждые 1 до 24 часов
- Правила повтора
- Раз в 30 секунд, внутри программы
- Опрос расписаний
- 30 минут запаса, дальше слот считается пропущенным
- Опоздание
- --headless=new, и без --disable-gpu рядом
- Довод движку
Расписание это сценарий, набор профилей и правило повтора
Каждое расписание указывает на один сценарий, собранный в конструкторе, и на профили, по которым он пойдёт. Без сценария расписания не бывает. Правила «просто открыть пять профилей в девять и оставить их так» здесь нет.
Правил повтора три. Ежедневное срабатывает в выбранный час. Недельное срабатывает в тот же час по отмеченным дням недели. Почасовое срабатывает каждые N часов, где N от 1 до 24, и отсчёт идёт от прошлого срабатывания.
Поле «Одновременно» задаёт, сколько профилей прогон держит открытыми разом: от 1 до 5. Программа зажимает это число, а сервер отвергает всё, что вне пределов. Тридцать профилей при значении два это длинная очередь, а не тридцать входов в одну минуту.
В программе у каждого сценария в строке видно, есть ли у него расписание и когда ближайший срок. Одна кнопка открывает все расписания списком, ближайшие сверху.
Сценарий
Что запускать. Расписание без него было бы будильником, который звонит в пустоту.
Профили
По кому идёт прогон. Сервер проверяет, что каждый номер принадлежит вашему пространству.
Повтор
Каждый день, по выбранным дням недели или каждые 1 до 24 часов.
Время
Записывается как ЧЧ:ММ, по вашему местному времени.
Одновременно
От 1 до 5 профилей разом.
Включено
Пауза и возврат без потери настроек.

Прогон идёт на вашем компьютере, пока программа открыта
У программы свои часы. Раз в 30 секунд она спрашивает, каким расписаниям пора, и запускает те, которым пора. Аккаунт расписания только хранит, чтобы они переезжали между вашими машинами. Он их не исполняет.
Это разделение сделано нарочно. Прогону нужны cookies профиля, его семя отпечатка, пароль его прокси и его браузер, а всё это лежит у вас на машине. Запуск из чужого дата-центра означал бы выгрузку ваших сессий и вход в аккаунты с адреса, которым этот профиль обычно не пользуется.
Следствие написано прямо в окне, а не спрятано в справке. Служб в системе мы не ставим, поэтому на выключенном ноутбуке запуск не состоится. Сон считается выключением.
Отсюда же вытекает ещё одно. Два компьютера, вошедших в один аккаунт, не должны запустить одно расписание в одну минуту, и программа за этим следит. Как именно, сказано ниже.
Что программа говорит дословно
Время местное и остаётся местным при переводе часов
«Каждый день в 9:00» это девять утра там, где вы сидите. Следующий срок считается перебором календарных дней, а не прибавлением двадцати четырёх часов в миллисекундах. Дважды в год сутки длятся не двадцать четыре часа, и простое сложение сдвинуло бы прогон на час.
Каждое расписание помнит и сдвиг часового пояса, в котором срок был посчитан. Когда программа запускается и видит другой сдвиг, после перевода часов или после переезда, она считает срок заново.
Уже наступивший срок такой пересчёт не выбрасывает. Без этой оговорки переезд или перевод часов молча съедали бы прогон, которого вы ждали сию минуту.
Пропущенные прогоны считаются, но не догоняются залпом
Допустим, компьютер спал трое суток. Три срока не состоялись. Программа не выполняет их сейчас, и это самое сознательное решение во всей этой части продукта.
Тридцать профилей, проснувшихся разом в час, когда они обычно не работают, это ровно тот всплеск, который читается как робот. Догонять потерянное значило бы устроить такой всплеск своими руками, внутри продукта, купленного ради защиты от него.
Срок всё же срабатывает, если программа увидела его в течение 30 минут. Позже он считается просроченным: срок переводится вперёд, а слот записывается в пропущенные. Предупреждение называет сценарий и число несостоявшихся прогонов. Число берётся счётом настоящих сроков, поэтому недельное расписание считает недели, а не дни.
«Запустить сейчас» стоит особняком. Оно запускает сценарий тут же и срока не двигает. Нажатие в восемь утра не отменяет прогон в девять.
- 1
Вы открыли крышку
В течение тридцати секунд расписания опрашиваются в очередной раз.
- 2
Просроченные сроки уходят вперёд
Всё, что опоздало больше чем на тридцать минут, переводится вперёд, пока срок не окажется в будущем.
- 3
Вам говорят о потерянном
По одному предупреждению на расписание: сценарий и число прогонов, которых не было.
- 4
Дальше как обычно
Ближайший срок сработает в своё время. Очереди позади него нет.
Пропущенный прогон объясняет причину
Наступивший срок не всегда превращается в прогон. Его останавливают четыре обстоятельства, и каждое поднимает уведомление сразу и оставляет строку, которую вы прочтёте утром.
Тарифная квота действует и на расписание, причём считается на весь опрос сразу: два расписания в один срок не откроют вдвое больше. Квота это число профилей тарифа: 2 на Free, от 10 до 100 на Professional, от 200 до 1000 на Business, 5000 и выше на Enterprise. У подписки есть 3 дня отсрочки после даты продления, а без связи с аккаунтом программа работает до 24 часов.
Пропуски хранятся отдельно от итогов прогонов. «Последний запуск 09:00, без ошибок» и «пропущен 11:00, все профили открыты» это две разные строки, потому что пропуск это не прогон с плохим исходом.
Сам исход хранится знаком, а не фразой: ok, stopped или error:2/5. Слова подбираются при показе, на языке того, кто смотрит, поэтому то же расписание правильно читается на машине коллеги. В начале пишется только «начат»: сценарий по двадцати профилям идёт часами, настоящий исход дописывается в конце, а прогон, рухнувший целиком, засчитывается неудачей.
| Почему | Что происходит | Что вам скажут |
|---|---|---|
| Нет действующей подписки | Срок пропускается, и ничего не копится на потом | Прогон не состоялся, программа заперта |
| Прошлый прогон ещё идёт | Срок пропускается, чтобы сценарий не полез в свои же профили | Прошлый прогон ещё идёт, поэтому этот пропущен |
| Профили уже открыты | Ничего не запускается, живые окна не трогают | Все профили этого расписания уже открыты |
| Профилей больше, чем даёт тариф | Список режется до квоты, и место среза сдвигается по кругу | Сколько профилей осталось за бортом и сколько покрывает тариф |
| Файл расписания не сохранился | Новый срок живёт только в памяти | После перезапуска тот же прогон может пойти второй раз, с текстом дисковой ошибки |
Расписания живут в аккаунте и приезжают выключенными
Расписания хранятся на пространство, как пул прокси и библиотека сценариев. Видеть их может любой, кто вошёл. Заводить, править и удалять вправе управляющий и выше: расписание распоряжается чужими профилями.
Сервер проверяет состав до записи. Сценарий обязан существовать в этом пространстве, и каждый номер профиля тоже обязан принадлежать ему. Расписание, нацеленное на чужой профиль или на отсутствующий сценарий, отвергается, а не сохраняется будильником, который никогда не зазвонит.
На вторую машину расписание приезжает с пометкой «не на этой машине» и кнопкой «Запускать здесь». Два открытых компьютера, сработавших в одну минуту, показали бы сайтам две сессии одного аккаунта из двух мест, а именно от этого продукт и защищает.
Пауза, поставленная в кабинете, до машины доходит: признак «включено» едет вместе с остальными полями. А правка, сделанная здесь и ещё не отданная, сильнее серверного ответа, поэтому ваша работа не затирается за секунду до отправки.
Запуск без окна это свойство профиля, поэтому его чтят все дороги запуска
Работа без окна это галочка в настройках профиля, а не галочка, повторённая в четырёх окнах. Браузер работает как обычно, просто не появляется на экране. Профиль всё так же виден открытым, и кнопка «Стоп» его останавливает.
Решение читается один раз, в начале запуска, и все дороги получают один и тот же ответ. Кнопка «Запустить», групповой запуск, прогон сценария, срабатывание расписания, местный интерфейс по HTTP и сервер MCP приходят в одно место.
Одно исключение есть, и сделано оно для программ, а не для людей. POST /api/v1/browser/start принимает headless и в теле, и в строке запроса, поэтому ночной скрипт может скрыть профиль, которым днём вы работаете с окном. Значения 0, false и пустая строка означают «нет»: строка запроса приносит текст, и непустая строка сама по себе не «да».
Вторые окна наследуют решение
Вкладка, открытая сценарием, не выскочит на экран у вас за спиной.
Раскладка их пропускает
«Разложить окна» не берёт скрытые профили в сетку, вместо того чтобы оставлять в ней дыру.
Подстановка пароля молчит
Логин и пароль подставляются, но скрытое окно не выдёргивается на передний план.
Копии остаются скрытыми
Копия ночного профиля тоже ночная, и заготовки для пакетного создания несут этот признак.
Без фоновой экономии
Скрытое окно не душат, поэтому сценарий внутри него не ползёт.
О чём просят движок и о чём просить нельзя
ARMANOS Browser запускается с доводом --headless=new, а не с голым --headless. Старый режим убран из самого Chromium и в сборке 153.0.7978.0 просто не включается.
Выбор нового режима сам по себе ничего не прячет. Замерено на собранном движке Windows 153.0.7978.0 4 сентября: без подмены строки браузера движок и в новом режиме называет себя HeadlessChrome/153.0.0.0. Эту строку убирает довод --user-agent, взятый из отпечатка профиля и передаваемый при любом запуске, с окном и без.
Привычный спутник --disable-gpu рядом не ставится нарочно. Он убирает WebGL целиком, а браузер без WebGL это примета громче, чем браузер без окна.
Скрытому запуску отдаётся ровно один адрес. Chromium отвечает, что несколько целей в скрытом режиме не поддерживаются, и выходит с кодом 13. Живой замер 29 августа показал, что скрытый режим не запускался ни разу, а программа молча уходила на встроенный движок. Остальные адреса теперь открываются вкладками, когда браузер уже поднялся. У встроенного движка «скрыть» значит создать окно и не показывать его, а это не скрытый режим Chromium.
Замерено, а не предположено
Когда скрытый режим только мешает
Прятать окно полезно, когда смотреть на него некому. Оно вредит в ту минуту, когда нужен человек. Нельзя пройти проверку, которую вы не видите.
Оставьте окно для первого входа в аккаунт и для всего, где возможны код, капча или подтверждение. Оставьте его и пока вы собираете сценарий: один прогон, увиденный глазами, объясняет больше, чем журнал того же прогона.
И экономия здесь меньше ожидаемой. Скрытый браузер всё так же держит свою память и всё так же занимает место в пределе открытых профилей, который ARMANOS считает по памяти машины. На восьми гигабайтах этот предел низкий, и прогон по расписанию ждёт свободного места, а не помечает профиль проваленным.
Первый вход
Коды, капчи и проверки требуют человека и видимой страницы.
Пока сценарий собирается
Прогоните его с окном хотя бы раз, прежде чем ставить на часы.
Когда, возможно, придётся вмешаться
«Стоп» работает и на скрытом профиле, но нажать внутри него нечего.
Как маскировка
Он убирает окно, а не приметы. Эту работу делает отпечаток.
Чего это не делает
- Пока ARMANOS закрыта, спит или из неё вышли, не работает ничего. Служб в системе нет и запуска в облаке нет, поэтому закрытый ноутбук свой срок пропускает.
- Пропущенные сроки не догоняются никогда. Вы получаете число и предупреждение, а не сами прогоны.
- Правила повтора жёсткие: каждый день, выбранные дни недели или каждые 1 до 24 часов. Ни выражений cron, ни разового запуска по дате, ни промежутка короче часа.
- Расписанию всегда нужен сценарий, а разводит запуски только поле «Одновременно». Расписания, которое просто открывает профили, нет, и случайной паузы между ними тоже нет.
- Запуск без окна убирает окно, а не приметы. Браузер по-прежнему занимает память, по-прежнему считается в пределе открытых профилей и по-прежнему судится по отпечатку.
Как проверить
За каждым утверждением выше стоит строка кода и стенд. Откройте файл, потом прогоните стенд.
- Опрос, дележ квоты и причины пропуска работают внутри настольной программы
- apps/desktop/src/main/main.js · apps/desktop/test/schedule-runs.js
- Местное время переживает перевод часов, а пропущенные сроки считаются, но не догоняются
- apps/desktop/src/lib/schedules.js · apps/desktop/test/schedule-runs.js
- Сервер хранит расписания на пространство и никогда их не исполняет
- apps/server/src/schedules/schedules.service.ts · apps/server/test/schedules-shared.js
- Приехавшее из аккаунта расписание ложится выключенным, и его есть чем включить здесь
- apps/desktop/src/lib/schedules.js · apps/desktop/test/расписание-включается-здесь.js
- Скрытый запуск просит --headless=new, сохраняет подмену строки браузера и не добавляет --disable-gpu
- apps/desktop/src/lib/forkEngine.js · apps/desktop/test/скрытый-режим.js
Поставьте ночной прогон на часы
Соберите сценарий один раз, выберите профили и время. Остальное программа сделает, пока открыта.