🔑 Авторизация

Все способы входа в MAX: SMS-код, сохранённый токен, регистрация нового аккаунта.

Методы клиента

async connect() SESSION_INIT · opcode 6

Устанавливает TCP/SSL соединение с api.oneme.ru:443 и инициализирует сессию. Если в файле сессии уже есть auth_token — автоматически выполняет LOGIN (opcode 19), загружая профиль, чаты и контакты в кэш.

⚠️
Необходимо вызвать перед любыми другими методами. При использовании async with вызывается автоматически. Если токен невалидный или вход ещё не выполнен, соединение откроется, но client.me / client.cached_chats останутся пустыми до успешного LOGIN.
await client.connect()
async disconnect()

Закрывает TCP-соединение. При использовании async with вызывается автоматически.

await client.disconnect()
async send_code(phone) AUTH_REQUEST · opcode 17

Отправляет запрос на SMS-код. Аналог dg0.java → AUTH_REQUEST + type=START_AUTH.

ПараметрТипОписание
phonestrНомер в формате "+79999999999"
→ SentCode — объект с code_length, verify_token, alt_action_duration
sent = await client.send_code("+79999999999")
print(f"Ожидается {sent.code_length}-значный код")
async resend_code() AUTH_REQUEST · opcode 17 (type=RESEND)

Повторная отправка SMS. Требует предварительного вызова send_code().

→ SentCode
async sign_in(code) AUTH 18 → LOGIN 19

Проверяет SMS-код и выполняет вход. Внутри: два шага —

  1. AUTH (opcode 18) — передаёт verifyCode, получает LOGIN-токен
  2. LOGIN (opcode 19) — финальный вход, загружает профиль + чаты в кэш
ПараметрТипОписание
codestrКод из SMS
→ AuthResult.success (bool), .uid (int), .auth_token (str), .needs_registration (bool), .register_token (str)
result = await client.sign_in("123456")
if result.success:
    print(f"UID = {result.uid}")
elif result.needs_registration:
    result = await client.sign_up("Иван")
async sign_up(first_name, last_name="", register_token=None) AUTH_CONFIRM · opcode 23

Регистрирует новый аккаунт. Вызывается когда sign_in() вернул needs_registration=True.

ПараметрТипОписание
first_namestrИмя
last_namestrНеобязательно. Фамилия
register_tokenstrНеобязательно. Токен из sign_in()
→ AuthResult
async login_with_token(auth_token) LOGIN · opcode 19

Быстрый вход по уже имеющемуся auth_token в обход SMS. Используется при автоматическом восстановлении сессии.

→ AuthResult

Свойства после входа

property client.uid

UID текущего пользователя (int). Берётся из profile.contact.id LOGIN-ответа.

print(client.uid)  # 61091213
property client.me

Словарь с профилем текущего пользователя. Загружается один раз при успешном LOGIN.

КлючТипОписание
idintUID
namestrПолное имя
first_namestrИмя
last_namestrФамилия
phonestrНомер телефона
countrystrКод страны
account_statusintСтатус аккаунта
me = client.me
print(f"{me['name']} ({me['phone']})")
ℹ️
client.me — это уже нормализованный кэш библиотеки. Метод fetch_profile() возвращает другой формат: сырой объект contact c массивом names.
ℹ️
Ключи в client.me тоже нормализованы библиотекой: используйте account_status, first_name, last_name. Ключ accountStatus относится к сырому ответу fetch_profile(), а не к client.me.
property client.is_authorized

Возвращает True если в сессии есть auth_token.

Файл сессии

Сессия хранится в JSON-файле. Пример содержимого my_session.json:

{
  "uid":        61091213,
  "phone":      "+79999999999",
  "auth_token": "eyJhbGciOiJIUzI1NiJ9...",
  "proxy_host": "api.oneme.ru"
}
💡
Передавайте разные имена файлов для разных аккаунтов: MaxClient("account1"), MaxClient("account2").

get_profile() / fetch_profile()

sync get_profile()

Возвращает профиль из кэша (из LOGIN-ответа). Мгновенно, без сетевого запроса.

→ dict (то же что client.me)
profile = client.get_profile()
print(profile["name"])

Ошибки сервера

⚠️
У библиотеки нет единого слоя исключений для всех API-методов. Транспортные проблемы поднимаются как исключения, но многие прикладные ошибки сервера приходят как обычный ответ {"error": "...", "message": "..."}. Такой ответ нужно проверять вручную.
result = await client.get_chat_info(123)
if result.get("error"):
    print(result["error"], result.get("message"))
async fetch_profile(user_id=None) PROFILE · opcode 16

Запрашивает свежий профиль с сервера. Обновляет внутренний кэш.

Работает корректно. Wire-параметр: {"userId": uid}. Ключ uid (без er) вызывает дисконнект на стороне сервера — использовать только userId.
ПараметрТипОписание
user_idintНеобязательно. UID пользователя. По умолчанию — текущий.
→ dict — сырой объект contact с сервера. Также обновляет client.me если запрашивали себя.

Структура ответа сервера

{
  "id":            61091213,
  "updateTime":    1774189702185,
  "phone":         79999999999,
  "names": [{
    "name":        "Телеграм",
    "firstName":  "Телеграм",
    "lastName":   "",
    "type":       "ONEME"
  }],
  "options":       ["TT", "ONEME"],
  "accountStatus": 0,
  "country":       ""
}

Пример

# Свой профиль
contact = await client.fetch_profile()
print(contact["names"][0]["name"])

# Профиль другого пользователя
contact = await client.fetch_profile(user_id=27993802)