Заказчик - частное лицо, браузерная онлайн-игра с мобильной веб-версией на Apache Wicket с фрагментами Vue. Нужен был юзерскрипт для Tampermonkey под Chrome и Firefox, который по кругу и без участия человека проходит подземелья: выбирает подземелье на карте с учётом вкладок по уровню и заданной сложности (откл / норм / герой / брутал), входит, ведёт бой на всех этапах, собирает добычу, разбирает рюкзак по правилам, следит за свободным местом и износом снаряжения, при гибели возрождается, ждёт откат подземелий и начинает новый круг.
Отдельная сложность: четыре особых подземелья, у каждого своя механика. В двух нельзя атаковать, пока над полем боя висит сюжетная надпись, иначе персонаж гибнет. В третьем после определённого этапа надо выйти в город, не нажимая «Продолжить бой». В четвёртом нужно в нужный момент выбрать ответ в диалоге, который живёт несколько секунд.
Ограничения из ТЗ: работа только через интерфейс игры, без прямых запросов к серверу. Случайные паузы между действиями. Автоматическая остановка с понятным сообщением при капче, отказе в доступе, незнакомом всплывающем окне, отсутствии прогресса, переполненном рюкзаке и выходе из аккаунта. Обход капчи и защиты игры не делался и в задачу не входил. Кнопка «Стоп» и горячая клавиша. Всё необратимое выключено по умолчанию: скрипт стартует в сухом прогоне и только пишет, что сделал бы с вещами, пока заказчик не подтвердит боевой режим.
Сначала ТЗ с критериями приёмки и границами: арены, PvP, события, крафт, покупки, вход в аккаунт и обход капчи не входят. Потом разведка интерфейса на тестовом аккаунте через DevTools: 25 дампов DOM по экранам, проверка кликов из JS, дословные тексты сюжетных фаз.
Скрипт. Один файл около 3300 строк JavaScript (ES2015+). Автомат состояний поверх DOM: 22 типа экранов игры и 18 обработчиков, экран распознаётся по стабильным признакам (id, классы, тексты), без привязок к автогенерируемым id и адресам с идентификаторами сессии. Больше 20 настраиваемых параметров плюс редактируемые списки: подземелья и сложности, слоты боя с приоритетами, порогами здоровья и откатами, правила вещей (не личное на аукцион, личное разобрать, остальное выкинуть по списку названий; трогается только свежая добыча), кнопки окон, надписи фаз. Панель настроек и журнала встроена в страницу и переживает подмену body игрой; настройки мигрируют при обновлении версии.
Бой. Прогресс измеряется по счётчикам отрядов противника, а не по кликам: смена цели, когда урон не проходит, возврат к мини-боссу по таймеру, остановка с понятным текстом, если бой стоит на месте заданное число минут. В особых подземельях правило одно: лишняя пауза безопаснее лишнего удара.
Устойчивость. Тик из Web Worker, чтобы фоновая вкладка не замораживала таймеры: это нужно для диалога, который живёт секунды. MutationObserver и поллинг с таймаутами вместо слепых задержек. Защита от петли на окнах, которые не закрываются; ожидание с нарастающей паузой и обновление страницы при ответах сервера 429 и 5xx; восстановление карты подземелий, когда карусель в фоновой вкладке не дорисовывается; учёт одинаковых вещей в добыче.
Журнал. Настройки и журнал в GM_getValue / GM_setValue с запасным вариантом на localStorage. Кольцевой буфер с отдельным блоком событий, хвост пишется при каждой строке и переживает перезагрузки страницы, которые игра делает сама. Кнопка «Скопировать журнал», отчёт «что сделал бы с рюкзаком» для сухого прогона.
Как проверял. Ежедневные прогоны на тестовом аккаунте с разбором журналов. Первый боевой заход вхолостую, переход в боевой режим по подтверждению заказчика. Три ночных прогона перед сдачей.
Инструменты и документы: git и приватный репозиторий, 140 коммитов, Node.js для проверки синтаксиса, Python 3 для сборки PDF. К сдаче: README на 250 строк (установка, настройки, особые подземелья, сухой прогон и боевой режим, таблица причин остановок и что делать, ограничения), краткое резюме, PDF-версии документов.
Сдано на пятый день при сроке 14 дней по договору: разведка, разработка и три ночных прогона уложились в пять дней.
На приёмке 42 полных круга подряд за ночь без вмешательства, следующей ночью 49. Все четыре особых подземелья пройдены скриптом без гибели персонажа, одно из них семь раз, другое четыре. Добыча обработана по правилам, ожидание отката и возобновление работы сами. Установка проверена в Chrome и Firefox.
Поддержка после сдачи: по договору 14 дней бесплатных правок. За первые шесть дней вышло 11 версий, каждая в тот же день, по журналам и скриншотам заказчика: каждая проблема разбиралась по журналу, а не по догадкам.
К чужому аккаунту отношение аккуратное: ничего платного и необратимого скрипт не нажимает, всё необратимое выключено по умолчанию. Капчу и защиту игры скрипт не обходит: распознаёт и останавливается.