Мессенджер MAX — тест WebSocket
Подключение к wss://ws-api.oneme.ru/websocket, протокол как в дампе web.max.ru.json.
Откуда в HAR берётся токен (web.max.ru)
В web.max.ru20260408.json сессия после входа с сайта идёт не через SMS (17/18), а через QR:
opcode 6— handshake (deviceType: WEB, в бандлеappVersionвроде26.3.9).opcode 288— старт входа по QR (в ответе ссылкаqrLink,trackId, TTL).opcode 289— опрос поtrackId, пока не подтвердят в приложении.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. |
17 | ✓ START_AUTH — запрос кода на телефон. |
18 | ✓ CHECK_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). |
129 | User typing push (S→C). |
132 | Presence push (S→C): {userId, presence}. |
1 🆕 | Keepalive/ping: {interactive: true} каждые ~25 сек. Держит WS живым. |
50 | Read mark: отметка о прочтении. {chatId, messageId, mark}. |
| Служебные | |
5 | Analytics events (навигация), не используем. |
26/27/28 | Стикеры, анимодзи. |
32/35 | Контакты + онлайн-статусы. |
83 | Video token/streams (CDN URL для видео). |
272/300 | Папки чатов. |
292 | Баннеры (S→C). |
По умолчанию — Web, как в HAR. iPhone часто приводит к немедленному закрытию сокета.
Если уже есть токен сессии — вставьте и нажмите «Применить» (без SMS).
Полная синхронизация может занять время (лимиты: 5 000 сообщений на чат, 200 000 всего).
channels): 0 шт.| id | external_id | Тип | Название | подписч. | last_msg_ms | updated_at |
|---|
Записи с типом CHANNEL из последнего «Загрузить чаты».
| Название | chatId |
|---|
Нет каналов в списке или ещё не загружали чаты.
Файловая «БД»: App_Data/channels/<chatId>.ndjson + watermark в App_Data/meta/<chatId>.json.
| chatId | link | Поддержка |
|---|
Подписка: …/join/… (поток 89 → 57 → 75). Отписка: opcode 58 по chatId.
| chatId | Тип | Название | Сообщений |
|---|
Проверяет выбранным токеном, может ли он получить participants_count (opcode 48) и views конкретного сообщения (opcode 74) в канале, на который он может быть не подписан. Если MAX требует подписки — увидим ошибку.
Берёт каналы из 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 считается успехом (этот токен уже подписан).
Отписка от всех каналов из subscribed_channels (opcode 58).
После отписки запустите воркер Subscribe для повторной подписки — push 135 заполнит channels.
Загружает реальный список подписок из MAX (opcode 19 + 53), сравнивает с БД.