Кампания 713175197 третьи сутки не показывалась при замороженных у клиента деньгах, а программный интерфейс на всех уровнях рапортовал «Идут показы». Правду отдала только подпись на экране кабинета: «Для показа в заданных регионах предоставьте документы» — 13 объявлений придержаны, 2 отклонены. 1. Яндекс отвечает машине ПО-АНГЛИЙСКИ, если не попросить русский. Замер боевым ключом, два одинаковых запроса подряд: без заголовка «Rejected at moderation.», с Accept-Language ru «Отклонено на модерации.». Английская строка уезжала клиенту в переписку и письмом как пояснение модератора, честная заглушка «причину выясняем» не срабатывала никогда, а на следующем обходе английская строка ложилась ПОВЕРХ доклада разведчика — проверено по боевой ленте: 30.07 в 15:02 робот принёс полную причину, в 17:00 её накрыло. Лечение: спрашиваем язык явно плюс второй заслон — английские отписки узнаются как отписки. 2. Отказ включения Яндекс кладёт в Warnings, а код смотрел только в Errors. Ответ целиком: ResumeResults с Warnings 10201 «Объявление не остановлено» при пустом Errors. Исключения нет, портал считал, что справился: двое суток обход каждые два часа поднимал 13 объявлений, ноль записей в журнале. Лечение: resumeAds возвращает, кого включить не дали. 3. Новый исход «принято, но придержано» порталу не был известен вовсе. Вердикт ACCEPTED, ярлыка «Отклонено» нет, разведчик не ходил — клиент видел «Идут показы» при нулевых показах. Теперь по отказу включения клиенту идёт сообщение «Яндекс принял объявление, но пока не показывает его. Причину выясняем» — текст выбран владельцем — и туда же едет разведка. Ловушка, обойденная по дороге: включение спрашиваем ДО разбора объявлений. Наоборот — сообщение о придержке легло бы поверх доклада разведчика, и обход начал бы чередовать их по кругу: защита от дублей смотрит на последнее сообщение. Замеры. Восемь новых сторожей, все написаны ДО починки и падали именно на живых данных. Отдельный сторож на противоположный случай — включённому объявлению разведку не заводим — был зелёным с самого начала. Портал 4083 теста, 4043 прошло, 16 упало: те же шесть давних классов и ровно те же числа, что до работы, было 4069/4029/16. Плюс 14 тестов — ровно новые. Pint и Larastan по изменённым файлам чистые. Главный урок записан в cabinet-flow.md §7.9: в §7.7 лежит правдивый РУССКИЙ ответ Яндекса, снятый ДРУГИМ инструментом, который язык просил. Разбор отписок построили по показаниям прибора, которым продукт не пользуется. Мерить надо той же дорогой, по которой ходит боевой код. На боевой НЕ выкатывалось. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Робот-грузчик креативов в кабинет Яндекс Директа
Зачем он нужен
Портал заводит рекламную кампанию «за показы» в Яндексе целиком через программный
интерфейс — кроме одного шага. Картиночный креатив через него создать нельзя: приём
creatives.add принимает только видео, а конструктор креативов Яндекс закрыл 01.06.2026.
Остался единственный путь — загрузить готовые файлы руками в веб-кабинете.
Этот робот и есть «руки»: он относит готовые файлы клиента в кабинет и говорит порталу «готово». Всё остальное портал делает сам.
Что робот делает
- Спрашивает у портала, есть ли работа.
- Скачивает файлы баннеров.
- Открывает кабинет в своём браузере и проверяет, жив ли вход.
- Загружает файлы через «Загрузить креативы».
- Отчитывается порталу и чистит за собой скачанные картинки.
Чего робот НЕ делает
- Не создаёт кампаний и не запускает показы.
- Не тратит деньги — он вообще не может: таких действий у него нет.
- Не читает номера созданных креативов — их портал добывает сам, сравнивая список креативов кабинета до и после загрузки.
- Не нажимает «Сохранить изменения» — единственную кнопку, которая меняет кабинет. На это есть отдельный тест-сторож.
При любом сбое робот останавливается, отчитывается порталу «сбой» и шлёт письмо со снимком экрана. Кампания при этом остаётся черновиком.
Настройка
Скопировать .env.example в .env и заполнить. Отдельного пояснения стоят:
YC_CABINET_LOGIN— логин рекламного кабинета.YC_ANTEROOM_CAMPAIGN_IDиYC_ANTEROOM_GROUP_ID— «прихожая»: существующие кампания и группа, форму нового объявления которых робот открывает только чтобы добраться до окна загрузки. Ничего в них не сохраняется. Своей кампании у робота в этот момент ещё нет: портал ставит задание до создания кампании в Яндексе, потому что кампания заводится сразу с готовыми номерами креативов. Надёжнее всего назначить прихожей отдельную остановленную кампанию — тогда робот не приближается к работающей рекламе вовсе.
Как завести вход в кабинет
Вход заводится один раз глазами и дальше живёт в папке профиля браузера:
npm run login
На боевом сервере экрана нет, поэтому команда запускается внутри виртуального рабочего стола, к которому подключаются по удалённому рабочему столу через SSH-туннель. Наружу порт не открывается. Владелец вводит пароль и код из СМС — профиль сохраняется на диск.
Как запускать
npm run run:once # один проход: взять задание, если оно есть
npm run keepalive # тихо зайти в кабинет, чтобы вход не заснул
npm test # проверки, браузер не нужен
По расписанию: run:once — часто, keepalive — раз в ~15 минут.
Наложиться друг на друга они не могут: браузерный профиль один, и оба запуска берут общий
файл-замок robot.lock в папке робота. Занят замок — процесс молча уходит с кодом 0 и
пробует в следующий раз; задание при этом остаётся в очереди. Замок, брошенный убитым
процессом (перезагрузка сервера), перехватывается через полчаса.
Снимки экрана в папке screenshots/ робот убирает сам: старше двух недель — удаляет при
очередном запуске. Свежие нужны, чтобы разобрать вчерашний сбой; лежать вечно им нельзя —
на снимке видна боковая панель кабинета с логином и остатком счёта.
Пришло письмо-алярм — что делать
В письме указан шаг, на котором робот встал, и приложен снимок экрана.
- «Вход в кабинет слетел» — зайти по удалённому рабочему столу и выполнить
npm run login. - «Кабинет не принял файлы» — посмотреть снимок: скорее всего, файл не тех размеров или слишком тяжёлый.
- «Окно загрузки не закрылось» — в письме будет текст, который показал сам кабинет. Задание при этом закрыто как выполненное: правду об успехе знает портал, он сверяет список креативов до и после. Если креативы не появились, портал сам пометит задание сбойным.
🔑 Смотрите на концовку письма — она честно говорит, что происходило в кабинете:
- «Робот остановился и ничего в кабинете не менял» — работа не начиналась, кампания осталась черновиком, деньги не потрачены. В кабинет идти незачем.
- «Креативы в кабинет уже загружены» — робот дошёл до конца, файлы лежат в кабинете. Загляните туда и в очередь заданий: повторная заливка оставит дубли, а вычистить их можно только руками.
Где почитать подробности
- Разметка экранов кабинета, снятая живьём — docs/cabinet-flow.md.
- Замысел целиком —
docs/superpowers/specs/2026-07-27-yandex-creative-robot-design.md. - Почему конструктор закрыт —
docs/superpowers/findings/2026-07-27-yandex-konstruktor-zakryt/.