MAX убрали из App Store, push-уведомления на iPhone не приходят. Этот скрипт
слушает твой аккаунт MAX на постоянно включённой машине и пересылает новые
сообщения в Telegram — с текстом сообщения (для медиа — пометка вроде
«📷 Фото») и
только по незамьюченным чатам. При желании можно слать вместо текста лишь
короткий сигнал «🔔 новое сообщение в таком-то чате», чтобы сам текст
оставался только в MAX на телефоне (INCLUDE_MESSAGE_TEXT = False, см.
настройку).
Работает на Windows, Linux и macOS. Под капотом — PyMax (userbot-обёртка над внутренним API MAX) и Telegram Bot API.
⚠️ PyMax использует неофициальный внутренний API MAX: это нарушает условия сервиса и теоретически возможен бан аккаунта (привязан к твоему номеру). Для личного использования риск низкий, но не нулевой.
Нужен Python 3.10+ (проверено на 3.12).
python -m pip install -r requirements.txtНа Linux/macOS, если запускаешь headless (без значка в трее), pystray и
Pillow не нужны — можно поставить только ядро:
python -m pip install "maxapi-python>=2.3.1" "aiohttp>=3.13"- Создай телеграм-бота: @BotFather →
/newbot→ скопируй токен. - Скопируй шаблон конфига и впиши свои значения:
В
cp config.py.example config.py # Linux/macOS copy config.py.example config.py # Windows
config.pyукажиMAX_PHONEиTELEGRAM_BOT_TOKEN. - Узнай свой числовой Telegram-ID (он же
chat_idличного чата с ботом) и впиши его вTELEGRAM_USER_ID. Проще всего: напиши/startботу @userinfobot, он пришлёт твой ID.
config.py и папка cache/ в .gitignore — твои секреты и сессия в
репозиторий не попадают.
Авторизация встроена в main.py. При первом запуске MAX пришлёт SMS-код, а
если на аккаунте включён 2FA — спросит пароль; и то и другое вводится прямо
в консоли:
python main.pyСессия сохранится в cache/main.db, дальше вход не потребуется. Чтобы войти
заново (сменился номер, протухла сессия) — python main.py --login.
После входа в Telegram придёт «✅ Нотификатор запущен». Напиши себе в
незамьюченный чат MAX — прилетит «🔔 Новое сообщение в …». chat_id каждого
чата виден в логе (cache/notifier.log).
После первого входа (см. выше) фоновый запуск со значком в трее:
python main.pyКогда сессия уже есть, на Windows автоматически поднимается значок в трее
(меню «Открыть лог» / «Выход»). Для автозапуска при входе в систему положи
ярлык на start_hidden.vbs (запуск без мелькания окна) в shell:startup.
pythonw должен быть в PATH.
На сервере без графики запускай в headless-режиме:
python main.py --no-trayПример systemd-юнита — deploy/max2tg.service (поправь WorkingDirectory и
путь к Python). Сначала один раз авторизуйся вручную (python main.py --login), чтобы появилась сессия, потом:
sudo cp deploy/max2tg.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now max2tgЗаглушённые в MAX чаты определяются автоматически, настраивать ничего не
надо. Признак приходит в LOGIN-ответе: config.chats.{chatId}.dontDisturbUntil
(-1 — навсегда, 0 — нет, >0 — до момента в мс). main.py читает это при
запуске и не шлёт сигналы по заглушённым чатам.
- Включено флагом
RESPECT_MAX_MUTE = Trueвconfig.py(поставьFalse, чтобы получать сигналы даже из заглушённых). - mute читается один раз при старте. Заглушил/разглушил чат в MAX → перезапусти нотификатор, чтобы он подхватил изменение.
- Дополнительно можно вручную глушить чаты через
IGNORED_CHAT_IDS.
Уведомления доставляются гарантированно, даже если в момент сообщения нет
сети или VPN (а Telegram без VPN часто недоступен). Вместо «отправил и забыл»
каждое уведомление сначала кладётся файлом в cache/outbox/, а фоновый воркер
дослывает его в Telegram:
- доставка идёт по очереди (FIFO) с сохранением порядка; при сбое попытка
повторяется каждые
RETRY_DELAY_SECONDSсекунд (по умолчанию 15); - очередь переживает перезапуск приложения и компьютера — недоставленное уйдёт после старта, когда связь вернётся;
- после успешной отправки файл удаляется (архив не копится — всё в логе);
- если за
MESSAGE_TTL_SECONDS(по умолчанию сутки) связь так и не появилась, сообщение отбрасывается, чтобы не держать очередь вечно.
При каждой неудачной попытке в трее всплывает balloon-подсказка с
текстом ошибки и самим сообщением, которое не удалось отправить (на Windows со
значком в трее). Чтобы при долгом простое сети не засыпать центр уведомлений,
повторные подсказки троттлятся. Отключается флагом ERROR_POPUP = False
(тогда сбои только пишутся в лог). В headless-режиме (--no-tray, Linux/macOS)
подсказки не показываются — только лог.
COOLDOWN_SECONDS— антиспам: не чаще одного сигнала на чат за N секунд.SKIP_SERVICE_MESSAGES— не пинговать по системным событиям чата («X теперь в MAX», «X вышел из чата» и т.п.); по умолчаниюTrue.INCLUDE_MESSAGE_TEXT— присылать вместе с сигналом сам текст сообщения (для медиа — пометку вида «📷 Фото»); по умолчаниюTrue. Учти: текст уходит через твоего бота на серверы Telegram, и антиспамCOOLDOWN_SECONDSне применяется (приходит каждое сообщение). ПоставьFalse, чтобы слать только сигнал без текста.MESSAGE_TEXT_LIMIT— макс. длина пересылаемого текста (символов),0— без обрезки; действует только приINCLUDE_MESSAGE_TEXT = True.RESPECT_MAX_MUTE— учитывать заглушённые в MAX чаты (по умолчаниюTrue).IGNORED_CHAT_IDS— ручной игнор (страховка).WATCHED_CHAT_IDS— если непусто, следим только за этими чатами.RETRY_DELAY_SECONDS— пауза между повторными попытками доставки (по умолчанию 15); см. «Надёжная доставка».MESSAGE_TTL_SECONDS— сколько всего пытаться доставить сообщение, после чего оно отбрасывается (по умолчанию сутки;0— пытаться бесконечно).ERROR_POPUP— показывать balloon-подсказку из трея при сбое отправки (по умолчаниюTrue;False— только лог).
main.py— нотификатор (включает авторизацию при первом запуске).config.py.example— шаблон настроек (копируется вconfig.py).start_hidden.vbs— фоновый запуск на Windows без мелькания окна (значок в трее).deploy/max2tg.service— пример systemd-юнита для Linux.cache/— сессия MAX, логи и очередь доставкиoutbox/(доступ к аккаунту, никому не показывай).
MAX обновился → обнови обёртку: pip install -U maxapi-python.
MIT.