Skip to content

Friskes/gosuslugi-watchman

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

Сторож слотов МВД на Госуслугах

Important

Данный материал подготовлен в научно-технических целях. Использование предоставленных материалов в целях отличных от ознакомления может являться нарушением действующего законодательства. Автор не несет ответственности за неправомерное использование данного материала!

Однофайловый JavaScript-скрипт, который запускается в DevTools любой страницы gosuslugi.ru и в фоне следит за появлением свободных слотов записи в отделения МВД (загранпаспорт) по уже поданным заявкам. Когда слот появляется — играет звук, показывает браузерное уведомление и шлёт сообщение в Telegram.

Что делает

При старте скрипт:

  1. Параллельно дёргает GET /api/lk/v1/feeds/ с двумя фильтрами — types=ORDER,EQUEUE (список заявок) и types=EQUEUE (подтверждённые бронирования). Заявки фильтрует по ключевым словам загранпаспорт, паспорт, мвд.
  2. POST /api/service/booking для каждой заявки в статусе invite_to_equeue — из ответа достаёт CODE_FRGU (это organizationId выбранного тобой отделения) и адрес.
  3. Параллельно опрашивает /api/lk/v1/equeue/agg/slots по каждому отделению каждые EVERY_MIN минут с джиттером ±JITTER_MIN мин. Появился слот — звук + браузерное уведомление + сообщение в Telegram. Повторное напоминание о тех же слотах — не чаще раза в REPEAT_MIN мин.
  4. Раз в KEEP_ALIVE_MIN мин пингует /auth-provider/check-session, чтобы сессия не валилась по бездействию (потолок — 24 ч от логина, ограничение JWT exp).
  5. Раз в REFRESH_FEEDS_MIN мин повторно опрашивает оба фида:
    • если появилась новая готовая к записи заявка — автоматически добавляет её в мониторинг;
    • если по заявке появилась EQUEUE-бронь (ты записался) — для этого отделения частота повторов снижается до REPEAT_BOOKED_MIN мин, а в текст слот-уведомления добавляется метка 🔕 ты уже записался;
    • если бронь отменилась — частота возвращается к REPEAT_MIN мин и в TG прилетает явный алерт.
  6. Раз в HEARTBEAT_MIN мин шлёт в Telegram heartbeat «жив, под мониторингом N отделений».

Никаких ручных действий не требуется. Открыл любую страницу gosuslugi.ruF12Console → вставил содержимое файла → 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-алерты».

Запуск

  1. Открой gosuslugi.ru и авторизуйся.
  2. Открой DevTools (F12), перейди во вкладку Console.
  3. Вставь содержимое gosuslugi_watchman.js и нажми Enter.
  4. Один раз кликни мышью по странице — это нужно, чтобы браузер разрешил воспроизведение звука (политика autoplay).
  5. Разреши браузерные уведомления, когда браузер спросит.

В консоли увидишь сводку: какие заявки нашлись, какие отделения захвачены под мониторинг, когда следующая проверка. В 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) кэшируются только идентификаторы отделений и адреса — чтобы пережить перезагрузку вкладки.

Если истечёт сессия — скрипт остановится и пришлёт уведомление «перелогинься».

Telegram-алерты (опционально, но рекомендуется)

Без заполненных TG_TOKEN и TG_CHAT в объекте CFG в начале файла, скрипт продолжит работать, но сообщения в Telegram уходить не будут — останутся только звук в браузере и браузерные уведомления. Если ты отойдёшь от компьютера, то просто пропустишь слот.

Чтобы включить Telegram:

  1. Создай бота через @BotFather → команда /newbot → получишь токен вида 123456789:AAAA.... Это значение запиши в TG_TOKEN в объекте CFG в начале скрипта.
  2. Напиши своему боту любое сообщение (иначе он не сможет тебе отвечать, и массив result на следующем шаге будет пустым).
  3. Узнай свой 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).

Contributors