Important
Данный материал подготовлен в научно-технических целях. Использование предоставленных материалов в целях отличных от ознакомления может являться нарушением действующего законодательства. Автор не несет ответственности за неправомерное использование данного материала!
Однофайловый JavaScript-скрипт, который запускается в DevTools любой страницы gosuslugi.ru и в фоне следит за появлением свободных слотов записи в отделения МВД (загранпаспорт) по уже поданным заявкам. Когда слот появляется — играет звук, показывает браузерное уведомление и шлёт сообщение в Telegram.
При старте скрипт:
- Параллельно дёргает
GET /api/lk/v1/feeds/с двумя фильтрами —types=ORDER,EQUEUE(список заявок) иtypes=EQUEUE(подтверждённые бронирования). Заявки фильтрует по ключевым словамзагранпаспорт,паспорт,мвд. POST /api/service/bookingдля каждой заявки в статусеinvite_to_equeue— из ответа достаётCODE_FRGU(этоorganizationIdвыбранного тобой отделения) и адрес.- Параллельно опрашивает
/api/lk/v1/equeue/agg/slotsпо каждому отделению каждыеEVERY_MINминут с джиттером±JITTER_MINмин. Появился слот — звук + браузерное уведомление + сообщение в Telegram. Повторное напоминание о тех же слотах — не чаще раза вREPEAT_MINмин. - Раз в
KEEP_ALIVE_MINмин пингует/auth-provider/check-session, чтобы сессия не валилась по бездействию (потолок — 24 ч от логина, ограничение JWTexp). - Раз в
REFRESH_FEEDS_MINмин повторно опрашивает оба фида:- если появилась новая готовая к записи заявка — автоматически добавляет её в мониторинг;
- если по заявке появилась EQUEUE-бронь (ты записался) — для этого отделения частота повторов снижается до
REPEAT_BOOKED_MINмин, а в текст слот-уведомления добавляется метка🔕 ты уже записался; - если бронь отменилась — частота возвращается к
REPEAT_MINмин и в TG прилетает явный алерт.
- Раз в
HEARTBEAT_MINмин шлёт в Telegram heartbeat «жив, под мониторингом N отделений».
Никаких ручных действий не требуется. Открыл любую страницу gosuslugi.ru → F12 → Console → вставил содержимое файла → Enter.
- Авторизованная сессия на gosuslugi.ru в текущей вкладке.
- Хотя бы одна поданная заявка по линии МВД в статусе «готов к записи» (
invite_to_equeue). - Десктопный браузер с открытыми DevTools (Chrome / Firefox / Edge). Вкладку оставляем открытой — скрипт работает только пока активна вкладка с Госуслугами.
- (опционально) Telegram-бот для пуш-уведомлений на телефон.
Все основные настройки — в объекте CFG в начале файла:
EVERY_MIN(по умолчанию8) — период опроса слотов, в минутах.JITTER_MIN(по умолчанию5) — случайный разброс±Nмин кEVERY_MIN, антибот.REPEAT_MIN(по умолчанию20) — если слот всё ещё доступен, не дёргать уведомлением чаще, чем раз вNмин.REPEAT_BOOKED_MIN(по умолчанию170) — если по заявке уже есть EQUEUE-бронь, повторное уведомление о слотах не чаще раза вNминут (см. секцию «Автоматическое снижение частоты после бронирования»).KEEP_ALIVE_MIN(по умолчанию4) — период пинга/auth-provider/check-session, чтобы сессия не валилась.REFRESH_FEEDS_MIN(по умолчанию20) — период обновления списка заявок и бронирований.HEARTBEAT_MIN(по умолчанию84) — периодheartbeat-сообщения в Telegram («я жив»), в минутах.TG_TOKEN(по умолчанию"") — токен Telegram-бота. См. секцию «Telegram-алерты».TG_CHAT(по умолчанию"") — ID чата с ботом. См. секцию «Telegram-алерты».
- Открой gosuslugi.ru и авторизуйся.
- Открой DevTools (
F12), перейди во вкладкуConsole. - Вставь содержимое gosuslugi_watchman.js и нажми
Enter. - Один раз кликни мышью по странице — это нужно, чтобы браузер разрешил воспроизведение звука (политика autoplay).
- Разреши браузерные уведомления, когда браузер спросит.
В консоли увидишь сводку: какие заявки нашлись, какие отделения захвачены под мониторинг, когда следующая проверка. В Telegram (если настроен) — то же самое в виде стартового сообщения.
В консоли:
__stopSlotWatch()Либо просто перезагрузить вкладку в которой был запущен скрипт.
Скрипт сам понимает, что ты уже записался по заявке, и перестаёт спамить уведомлениями каждые REPEAT_MIN мин — переходит на режим раз в REPEAT_BOOKED_MIN мин. При этом опрос слотов не останавливается: если откроется более удобное время, ты всё равно об этом узнаешь, просто не чаще одного алерта в N мин (по умолчанию).
Как это устроено:
- Параллельно с основным
/api/lk/v1/feeds/?types=ORDER,EQUEUEскрипт дёргает второй фид?types=EQUEUE— там лежат подтверждённые бронирования (feedType: "EQUEUE",data.parentOrderIdуказывает на исходную заявку). Простоtypes=ORDER,EQUEUEв одном запросе на практике возвращает толькоORDER, поэтому EQUEUE-записи тянутся отдельной ручкой. - Каждой капчуре в памяти проставляется флаг
cap.booked. Он пересчитывается на каждомREFRESH_FEEDS_MIN-цикле; вlocalStorageне сохраняется — после перезагрузки вкладки восстанавливается автоматически на первом же опросе. - В слот-уведомлении по забронированному отделению появляется метка
🔕 По этой заявке ты уже записался — следующее напоминание не раньше чем через N ч.Отдельного «бронь обнаружена» алерта в TG нет — чтобы не плодить шум. - Если бронь отменили (сам или система) — флаг сбрасывается, частота возвращается к
REPEAT_MINмин, и в TG прилетает явный🔔 По N заявкам бронь отменена…(это уже actionable событие, чтобы не пропустить факт отмены). - Капчура удаляется из мониторинга только если заявка полностью пропала из фидов. Просто наличие брони — это не причина для удаления.
Скрипт работает исключительно как клиент к публичным API Госуслуг от твоего имени — использует уже существующую cookie-сессию (credentials: "include"). Никаких паролей, кодов, СНИЛС, паспортных данных и т.п. он не запрашивает и не сохраняет. Локально (в localStorage под ключом __watchman_v4_captures) кэшируются только идентификаторы отделений и адреса — чтобы пережить перезагрузку вкладки.
Если истечёт сессия — скрипт остановится и пришлёт уведомление «перелогинься».
Без заполненных TG_TOKEN и TG_CHAT в объекте CFG в начале файла, скрипт продолжит работать, но сообщения в Telegram уходить не будут — останутся только звук в браузере и браузерные уведомления. Если ты отойдёшь от компьютера, то просто пропустишь слот.
Чтобы включить Telegram:
- Создай бота через @BotFather → команда
/newbot→ получишь токен вида123456789:AAAA.... Это значение запиши вTG_TOKENв объекте CFG в начале скрипта. - Напиши своему боту любое сообщение (иначе он не сможет тебе отвечать, и массив
resultна следующем шаге будет пустым). - Узнай свой
idчата: открой в браузереhttps://api.telegram.org/bot<ТВОЙ_ТОКЕН>/getUpdates, найди в ответе полеid(число) в объектеchat(полный путь:result.message.chat.id). Это значение запиши вTG_CHATв объекте CFG в начале скрипта.
По умолчанию скрипт настроен на услугу «загранпаспорт нового образца, "Мне"» (passCodeEpguCode = "600101_1"). Если у тебя другой тип заявки — допиши строку в SERVICE_MAP:
const SERVICE_MAP = {
"600101_1": { eserviceId: "10000000101", slotsServiceId: "409948235" },
// "ТВОЙ_PASS_CODE": { eserviceId: "...", slotsServiceId: "..." },
};Числа для нового типа можно подсмотреть в DevTools → Network: открой страницу записи на услугу и посмотри тело запроса к /api/lk/v1/equeue/agg/slots (там видны eserviceId и serviceId).