Skip to content

eizemazal/avenarius

Repository files navigation

Авенариус (Avenarius) - неофициальный клиент для Max

Авенариус - альтернативный неофициальный мессенджер для MAX без функций слежки.

Скачать через Google Play

Скачать .apk - в разделе Релизы.

FAQ

Правда ли, что официальный клиент Max следит за пользователями?

Похоже что да.

Почему я должен поверить, что Авенариус за мной не следит? Чем он лучше официального клиента?

Это программа с открытым исходным кодом, опубликованным в этом репозитории, его можно почитать и все самому проверить. ПО с открытым кодом читает много людей, и если там есть что-то предосудительное - это быстро станет известно. Код официального клиента вам никто не покажет.

Моя переписка в Авенариусе защищена от слежки?

Нет, она хранится на серверах Маха - ее легко прочитают. Но в Авенариусе нет никакого функционала, который следит за местоположением пользователя, его контактами, микрофоном. Через Авенариус никто не может дистанционно управлять никакими функциями вашего устройства. Приложение не "стучит" на сервера, какой у вас VPN и есть ли он вообще, и доступен ли вам телеграм или еще какие-то сервисы. При этом вы можете спокойно пользоваться функциями мессенджера, например читать и писать в рабочие чаты, школьные и детсадовские группы.

Что уже умеет Авенариус, а что нет?

В Авенариусе реализованы чаты, участие в группах, отправка и просмотр фото и видео, отправка и скачивание файлов, реакции, просмотр профилей пользователей, редактирование своего профиля, поиск по контактам. Вход по СМС, двойная авторизация поддерживаются.

Пока не реализовано, но возможно будет реализовано, управление группами, звонки, видеозвонки, интеграция с Госуслугами, Сферум, логин с QR-кодом, темы, папки, избранное и всесторонняя слежка.

Авенариус лучше ТГ?

Нет. Если только тем, что в России его не банят.

Как разработчики Маха относятся к альтернативным клиентам?

Скорее всего плохо, но они ничего не смогут сделать. Если они будут пытаться детектировать или банить альтернативные клиенты, нам есть чем ответить.

Почему Авенариус показывает дурацкое сообщение, что он активен?

Потому что таково требование Андроида, если мы хотим держать соединение открытым для проверки сообщений. Официальные клиенты мессенджера этого не делают - они пользуются пуш-сообщениями, чтобы "просыпаться" при получении обновлений. Отправка пуш-сообщений централизована через магазины приложений, и мы не можем получить пуши от Макса, не являясь разработчиками Макса. Мы еще поработаем над этим моментом.

Почему Авенариус?

Потому что один был Мах, а другой был Авенариус. Они оба были эмпириокритицистами и придумывали дебильные теории типа принципа экономии мышления. Оба были разнесены в пух и прах В.И. Лениным в его книге "Империализм и эмпириокритицизм" (советую почитать, она очень веселая). Осталось от Маха только число Маха, да мобильное приложение (Мах был физик, и скорость звука в махах это имени его). А от Авенариуса не осталось ничего - пусть и ему приложение будет.

Что насчет других альтернативных клиентов Мах?

Мессенджеру nemax "без слежки" я тоже не очень доверяю, потому что его собирает какой-то чувак у себя дома и выкладывает бинарники (Github actions он отключил, и из чего он его собирает - непонятно, кроме того, он делается из официального клиента). Чтения бинарников с меня хватает.

Есть еще клиенты maxplus, rumax и PyMax - но в двух из них ограниченный функционал, а третий написан на Питоне и не очень подходит для портирования на телефон. А еще я хочу изучить мобильную разработку и попробовать мощь нейросети :)

За какое время был написан проект?

Проект в своем первоначальном виде был написан за три дня нейросетью для демонстрации того, что любой дурак теперь может написать свой мессенджер очень быстро.

Автор проекта (который человек) имеет хороший опыт разработки на разных языках и технологиях, но никогда не соприкасался с мобильной разработкой. К счастью, теперь есть кремешки, то есть мозг в коробочке (пока они на службе человека, но может быть и наоборот).

Мне нужно часто пользоваться мессенджером Макс 1) по работе, а также 2) для общения с разными школьными и дошкольными учреждениями, которых перевели на Макс насильно. Так что теперь я пользуюсь неофициальным клиентом, который для меня написала нейросеть, и код которого я хотя бы прочитал (и может прочитать любой желающий), и по большей части понял.

Я хочу собрать код сам(а) или дописать какую-то фичу

Пожалуйста! Проект собирается в Github Actions, его можно собрать локально из исходного кода - no strings attached. Можно делать клоны и пулл реквесты, открывать Issues.

Вайбкодинг это не труъ

Критика такого плана принимается в виде форков, пулл-реквестов и альтернативных проектов, написанных исключительно руками.

Техническое предисловие от нейросети

Минималистичный неофициальный клиент мессенджера Max, написанный на Kotlin Multiplatform + Compose Multiplatform. Android-приложение и десктоп-приложение используют один и тот же код: и сетевой протокол, и интерфейс.

Как устроен код (и почему его легко переиспользовать)

Всё платформонезависимое лежит в composeApp/src/commonMain и компилируется без изменений и в Android-APK, и в десктоп-приложение:

composeApp/src/
├── commonMain/        ← общий код для Android И десктопа
│   └── kotlin/com/avenarius/app/
│       ├── net/MaxClient.kt        ← высокоуровневый протокол (вход, sync, сообщения)
│       ├── net/MobileTransport.kt  ← бинарный кадр поверх TLS, нумерация seq, ping
│       ├── net/MsgPack.kt          ← самописный кодек MessagePack
│       ├── net/Lz4.kt              ← самописный распаковщик LZ4 (block-формат)
│       ├── net/TlsSocket.kt        ← expect: «сырой» TLS-сокет
│       ├── model/Models.kt         ← Account / Chat / Message
│       ├── data/AppStorage.kt      ← хранение токена и идентификаторов устройства
│       └── ui/                     ← AppViewModel + интерфейс на Compose (App.kt)
├── androidMain/       ← только Android
│   └── kotlin/.../   MainActivity, AndroidStorage, TlsSocket (SSLSocket), манифест, иконка
└── desktopMain/       ← только десктоп («будущий десктоп-клиент»)
    └── kotlin/.../   Main.kt, DesktopStorage, TlsSocket (SSLSocket), Probe.kt (диагностика)

Платформенных кусков мало: TLS-сокет, хранилище «ключ-значение», часы и точка входа. Чтобы развивать десктоп-клиент дальше, в основном дописывают commonMain, и фичу получают оба приложения.

Краткое описание протокола

Вход по телефону и SMS доступен только в мобильном протоколе Max (веб-точка входа предлагает только QR-код), поэтому Авенариус говорит на мобильном протоколе:

  • «Сырое» TLS-соединение с api.oneme.ru:443 (не HTTP/WebSocket) — TlsSocket.
  • Каждый кадр = 10-байтный заголовок (big-endian) + полезная нагрузка: [ver:u8][cmd:u16][seq:u8][opcode:u16][packedLen:u32], где старший байт packedLen — флаг сжатия LZ4, а младшие 24 бита — длина.
  • Нагрузка кодируется в MessagePack (MsgPack.kt); ответы сервера могут быть сжаты LZ4 (Lz4.kt). Оба кодека написаны вручную в commonMain — без внешних зависимостей.
  • У запросов растущий seq; сервер возвращает его в ответе. Пинг (opcode 1) каждые 30 с держит соединение живым.

Используемые опкоды:

Опкод Назначение
6 рукопожатие (user-agent как у ANDROID)
17 начать вход (запросить SMS)
18 проверить SMS-код
115 проверить облачный пароль (2FA)
19 синхронизация (чаты/профиль)
49 история сообщений
64 отправить сообщение
128 входящее сообщение (push от сервера)

Сборка

Что нужно

  • JDK 17
  • Android SDK (укажите sdk.dir в local.properties или переменную ANDROID_HOME)

Android APK (то, что ставится на телефон)

./gradlew :composeApp:assembleDebug
# → composeApp/build/outputs/apk/debug/composeApp-debug.apk

Скопируйте .apk на телефон и установите (разрешив установку из неизвестных источников). Debug-APK автоматически подписан отладочным ключом, поэтому ставится без дополнительной настройки.

Десктоп-приложение

./gradlew :composeApp:run                                  # запустить
./gradlew :composeApp:packageDistributionForCurrentOS      # собрать нативный пакет

Тесты

Юнит-тесты лежат в composeApp/src/commonTest и покрывают чистую логику: кодек MessagePack, распаковщик LZ4, хранилище Prefs (токен/идентификаторы) и протокольную арифметику (id диалога = XOR). Запуск на JVM (быстро):

./gradlew :composeApp:desktopTest          # или ./dev.sh test

Стиль кода (ktlint)

Стиль проверяется через ktlint (плагин org.jlleitschuh.gradle.ktlint). Правила настроены в .editorconfig (стиль ktlint_official, длина строки 140). Сгенерированный код (build/) из проверки исключён.

./gradlew :composeApp:ktlintCheck     # проверить (или ./dev.sh lint)
./gradlew :composeApp:ktlintFormat    # автоисправление (или ./dev.sh format)

Скрипт разработки

./dev.sh — обёртка над частыми операциями (автоопределяет ANDROID_HOME):

./dev.sh test      # юнит-тесты
./dev.sh lint      # проверка стиля ktlint
./dev.sh format    # автоисправление стиля ktlint
./dev.sh run       # собрать APK + установить + запустить на устройстве
./dev.sh apk       # собрать debug APK
./dev.sh check     # стиль + тесты + сборка обеих платформ (как в CI)
./dev.sh logs      # логи приложения с устройства
./dev.sh desktop   # запустить десктоп-версию
./dev.sh help      # полный список

CI/CD (GitHub Actions)

.github/workflows/build.yml на каждый push/PR сначала прогоняет юнит-тесты, затем собирает debug-APK и выкладывает его артефактом (Actions → запуск → Artifacts → avenarius-debug-apk). Если тесты падают — сборка не выполняется, а отчёт о тестах выкладывается артефактом test-report. Можно запустить вручную через workflow_dispatch.

Подписанные release-сборки (опционально)

Добавьте секреты репозитория, и workflow дополнительно соберёт подписанный release-APK:

  • KEYSTORE_BASE64 — keystore в base64 (base64 -i release.jks)
  • KEYSTORE_PASSWORD, KEY_ALIAS, KEY_PASSWORD

Создать keystore:

keytool -genkeypair -v -keystore release.jks -keyalg RSA -keysize 2048 \
  -validity 10000 -alias avenarius

Источники

Протокол восстановлен по клиентам maxplus, rumax и PyMax.

About

Авенариус - неофициальный клиент МАХ (Макс)

Resources

License

Stars

2 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors