Compare commits

...

2 Commits

Author SHA1 Message Date
WowInceptionGood
448b854bdb Исправление конфликтов 2026-04-10 18:27:42 +03:00
Alexey Polyakov
dcbcb0a600 Common: добавил сжатие lz4 2026-04-10 17:43:35 +03:00
4 changed files with 45 additions and 84 deletions

View File

@@ -1 +0,0 @@
TODO

View File

@@ -1,69 +0,0 @@
# Описание протокола TamTam по Websocket
## Основная информация
В веб версии мессенджера ТамТам используется протокол, работающий поверх Websocket.
Пакеты в этом протоколе являются текстовыми JSON данными.
Структура пакета:
```
{
ver: int,
cmd: int,
seq: int,
opcode: int,
payload: {}
}
```
* ver - версия протокола
* cmd - определяет, от кого отправлен пакет. клиент - 0, сервер - 1
* seq - порядковый номер пакета (сервер дублирует его из запроса клиента)
* opcode - команда
* payload - полезная нагрузка команды
## Команды протокола
### PING (1)
Клиент периодически отправляет пакет с командой PING и нагрузкой "{"interactive": true}".
Сервер отвечает ему тем же.
### SESSION_INIT (6)
Первый пакет, который клиент отправляет на сервер после подключения. Полезная нагрузка:
```
{
"userAgent": {
"deviceType": "WEB",
"appVersion": "версия приложения",
"osVersion": "операционная система",
"locale": "язык приложения",
"deviceLocale": "язык устройства",
"deviceName": "название устройства",
"screen": "размер экрана..?",
"headerUserAgent": "юзерагент устройства",
"timezone": "часовой пояс"
},
"deviceId": "ID устройства"
}
```
Сервер отвечает ему пакетом с тем же опкодом, но другой нагрузкой:
```
{
"proxy": "msgproxy.okcdn.ru",
"logs-enabled": false,
"proxy-domains": [
"okcdn.ru",
"mycdn.me",
"ok.ru",
"odnoklassniki.ru",
"odkl.ru",
"vk.com",
"userapi.com",
"vkuser.net",
"vkusercdn.ru"
],
"location": "RU",
"libh-enabled": true
}
```

View File

@@ -69,7 +69,7 @@ class MobileProto:
payload = msgpack.unpackb(payload_bytes, raw=False, strict_map_key=False)
self.logger.debug(
f"Распаковал - ver={ver} cmd={cmd} seq={seq} opcode={opcode} payload={payload}"
f"Распаковал - ver={ver} cmd={cmd} seq={seq} opcode={opcode} payload={payload} comp_flag={comp_flag}"
)
# Возвращаем
@@ -83,8 +83,8 @@ class MobileProto:
def pack_packet(
self,
ver: int = 11,
cmd: int = 0x100,
ver: int = 10,
cmd: int = 1,
seq: int = 1,
opcode: int = 6,
payload: dict = {},
@@ -99,18 +99,49 @@ class MobileProto:
payload_bytes: bytes | None = msgpack.packb(payload)
if payload_bytes is None:
payload_bytes = b""
payload_len = len(payload_bytes) & 0xFFFFFF
payload_len_b = payload_len.to_bytes(4, "big")
# Флаг сжатия
comp_flag = 0
# Пробуем сжать данные пакета
try:
payload_comp = lz4.block.compress(
payload_bytes,
mode='high_compression',
store_size=False,
)
# Если сжатие нам выгодно, то используем его
if len(payload_bytes) > len(payload_comp):
final_payload = payload_comp
# Официальный сервер MAX отправлял мне в качестве
# флага сжатия 2, поэтому думаю стоит использовать ее
comp_flag = 2
else:
# В случае если сжатие нам не выгодно, используем
# только запакованные данные через msgpack
final_payload = payload_bytes
except Exception as e:
self.logger.warning(f"Ошибка сжатия LZ4: {e}")
# В случае ошибки сжатия используем
# только запакованные данные через msgpack
final_payload = payload_bytes
payload_len = len(final_payload) & 0xFFFFFF
packed_len = (comp_flag << 24) | payload_len
payload_len_b = packed_len.to_bytes(4, "big")
self.logger.debug(
f"Упаковал - ver={ver} cmd={cmd} seq={seq} opcode={opcode} payload={payload}"
f"Упаковал - ver={ver} cmd={cmd} seq={seq} opcode={opcode} payload={payload} comp_flag={comp_flag}"
)
# Возвращаем пакет
return ver_b + cmd_b + seq_b + opcode_b + payload_len_b + payload_bytes
return ver_b + cmd_b + seq_b + opcode_b + payload_len_b + final_payload
### Констаты протокола
CMD_OK = 1 # 0x100
CMD_NOF = 2 # 0x200
CMD_ERR = 3 # 0x300
PROTO_VER = 11 # 10 для android клиента
CMD_OK = 1
CMD_NOF = 2
CMD_ERR = 3
PROTO_VER = 10

View File

@@ -84,11 +84,11 @@ class AuthProcessors(BaseProcessor):
# Данные пакета
payload = {
"token": token,
"codeLength": 6,
"requestMaxDuration": 60000,
"requestCountLeft": 10,
"altActionDuration": 60000,
"codeLength": 6,
"token": token
"altActionDuration": 60000
}
# Собираем пакет