← Новый интерфейс

Мессенджер MAX — тест WebSocket

Подключение к wss://ws-api.oneme.ru/websocket, протокол как в дампе web.max.ru.json.

Откуда в HAR берётся токен (web.max.ru)

В web.max.ru20260408.json сессия после входа с сайта идёт не через SMS (17/18), а через QR:

  1. opcode 6 — handshake (deviceType: WEB, в бандле appVersion вроде 26.3.9).
  2. opcode 288 — старт входа по QR (в ответе ссылка qrLink, trackId, TTL).
  3. opcode 289 — опрос по trackId, пока не подтвердят в приложении.
  4. opcode 291 — готово: в payload.tokenAttrs.LOGIN.token приходит тот же сессионный токен, что потом уходит в opcode 19 как payload.token.

Вход по номеру (17/18) — другой сценарий; при phone-auth-enabled: false SMS-цепочка может быть недоступна. Профиль «iPhone» в handshake без нативного стека у сервера часто рвёт WebSocket.

Справочник opcode (TamTam / MAX)

Номер в поле opcode во входящем/исходящем JSON. В клиенте используются только помеченные «✓».

opcodeНазначение
Авторизация
6✓ Handshake: userAgent, deviceId. Ответ: phone-auth-enabled, location.
17START_AUTH — запрос кода на телефон.
18CHECK_CODE — проверка SMS.
19✓ Синхронизация сессии: чаты, контакты, профиль, config.
288Вход по QR (веб): qrLink, trackId.
289Опрос статуса QR-входа.
291Завершение QR: tokenAttrs.LOGIN.token.
Каналы и чаты
48✓ Инфо о каналах по chatIds[]. Batch до 80. ⚠️ rate-limit too.many.requests.
53✓ Догрузка списка чатов: marker (пагинация).
57✓ Join по ссылке (join/…).
58✓ Leave/покинуть чат.
75✓ Subscribe на события чата (push).
89✓ Lookup join-ссылки → chatId (без вступления).
22✓ Настройки уведомлений (DND).
Сообщения и аналитика
49✓ История: chatId, from, forward/backward. До 100 за раз. ~114ms/запрос.
74 🆕Views по messageIds: {chatId, messageIds[]}{stats: {msgId: {views: N}}}. До 33+ ID за раз.
51 🆕Media search: {chatId, attachTypes:["PHOTO","VIDEO"], forward, backward}. Ответ: pos, total, messages[].
79 🆕Feed/timeline: лента всех подписок. {forward: bool, count}history[] с forwardMarker/backwardMarker.
180 🆕Reactions breakdown: {chatId, messageIds[]}{messagesReactions: {msgId: {counters: [{reaction, count}]}}}.
Push и real-time
128 🆕New message push (S→C, cmd=0): сервер сам шлёт новые посты. ACK: {chatId, messageId} (cmd=1).
129User typing push (S→C).
132Presence push (S→C): {userId, presence}.
1 🆕Keepalive/ping: {interactive: true} каждые ~25 сек. Держит WS живым.
50Read mark: отметка о прочтении. {chatId, messageId, mark}.
Служебные
5Analytics events (навигация), не используем.
26/27/28Стикеры, анимодзи.
32/35Контакты + онлайн-статусы.
83Video token/streams (CDN URL для видео).
272/300Папки чатов.
292Баннеры (S→C).
Статус: Не подключено

По умолчанию — Web, как в HAR. iPhone часто приводит к немедленному закрытию сокета.


Если уже есть токен сессии — вставьте и нажмите «Применить» (без SMS).


Полная синхронизация может занять время (лимиты: 5 000 сообщений на чат, 200 000 всего).

Чаты в PostgreSQL (channels): 0 шт.
idexternal_idТипНазваниеподписч.last_msg_msupdated_at

Записи с типом CHANNEL из последнего «Загрузить чаты».

Каналов: 0
НазваниеchatId

Нет каналов в списке или ещё не загружали чаты.


Последний join chatId:

Файловая «БД»: App_Data/channels/<chatId>.ndjson + watermark в App_Data/meta/<chatId>.json.


Загружено: 0 каналов
chatIdlinkПоддержка

Подписка: …/join/… (поток 89 → 57 → 75). Отписка: opcode 58 по chatId.

Журнал

                
Результат синхронизации
chatIdТипНазваниеСообщений
Тест доступа токена к каналу (opcode 48 + 74)

Проверяет выбранным токеном, может ли он получить participants_count (opcode 48) и views конкретного сообщения (opcode 74) в канале, на который он может быть не подписан. Если MAX требует подписки — увидим ошибку.


15 тестов ≈ 30 секунд
Mass Subscribe — подписка на каналы из БД

Берёт каналы из channels WHERE is_subscribed=false, сортировка по подписчикам DESC. Opcode 89 (lookup) → 57 (join) → 75 (subscribe). Persistent WS. Используется пул токенов из таблицы max_tokens: при too.many.requests — cooldown 5 мин и автопереключение на следующий. Ошибка already.in.chat считается успехом (этот токен уже подписан).

Пул токенов
загрузка...
0%
0 / 0 joined: 0 already: 0 pending: 0 errors: 0
Токен: — ротаций: 0
Mass Unsubscribe — отписка от ВСЕХ каналов из БД

Отписка от всех каналов из subscribed_channels (opcode 58). После отписки запустите воркер Subscribe для повторной подписки — push 135 заполнит channels.

0%
0 / 0 errors: 0
Синхронизация подписок — MAX vs БД

Загружает реальный список подписок из MAX (opcode 19 + 53), сравнивает с БД.

Protocol Lab — тест операций MAX
opcode 48 — Инфо о каналах
opcode 49 — Посты (backward от now)
opcode 49 — Посты (forward от якоря)
Первое сообщение (якорь эпохи)
opcode 74 — Views по messageIds 🆕
opcode 89 — Lookup join-ссылки
Raw JSON response