AFZ_maks2tg подключается к вашему аккаунту MAX как userbot, получает новые сообщения через WebSocket и отправляет их в выбранный Telegram-чат. При включённом режиме ответов под сообщениями появляется кнопка, позволяющая отправить текст обратно в исходный чат MAX.
Warning
Это неофициальный проект, не связанный с MAX или Telegram. Он использует данные веб-сессии MAX и может перестать работать после изменения внутреннего API. Используйте его только для своих аккаунтов и с учётом правил сервисов.
- пересылка личных и групповых сообщений в реальном времени;
- текст, фото, видео, документы, аудио, стикеры, контакты, геолокации и ссылки;
- отображение пересланных и цитируемых сообщений;
- имена отправителей и названия групп;
- фильтрация по списку чатов MAX или прослушивание всех чатов;
- текстовые ответы из Telegram обратно в MAX;
- уведомления о подключении, потере связи и восстановлении;
- повторные попытки при таймаутах и Telegram rate limit;
- SOCKS5-прокси для Telegram;
- Docker Compose, ротация логов и автоматический перезапуск.
- Быстрый старт
- Получение данных доступа
- Настройка
- Использование
- Установка без Docker
- Обновление и обслуживание
- Решение проблем
- Разработка
- Безопасность и правовой статус
- Linux-сервер, домашний компьютер или VPS с постоянным доступом в интернет;
- Docker Engine и Docker Compose v2;
- аккаунт на web.max.ru;
- Telegram-бот, созданный через @BotFather.
Входящие порты, webhook и доменное имя не нужны: приложение само устанавливает исходящие соединения с MAX и Telegram.
git clone https://github.com/AFETZ/AFZ_maks2tg.git
cd AFZ_maks2tgcp .env.example .env
chmod 600 .envОткройте .env и заполните как минимум четыре переменные:
MAX_TOKEN=...
MAX_DEVICE_ID=...
TG_BOT_TOKEN=...
TG_CHAT_ID=...
TG_READ_TIMEOUT=30
TG_WRITE_TIMEOUT=30
TG_MEDIA_WRITE_TIMEOUT=120
DOCKER_NETWORK_MODE=bridge
DEBUG=false
REPLY_ENABLED=trueПеред первым запуском обязательно отправьте своему Telegram-боту /start.
docker compose up -d --build
docker compose ps
docker compose logs -f --tail=100Успешный запуск выглядит примерно так:
Telegram bot ready: @your_bot
Telegram polling started (reply → Max enabled)
Connected. Sending handshake...
Authorized!
Чтобы проверить полный цикл, отправьте сообщение в MAX с другого аккаунта. Оно
должно появиться в Telegram; при REPLY_ENABLED=true под ним будет кнопка
💬 Ответить.
- Откройте @BotFather.
- Выполните
/newbotи задайте имя и username. - Скопируйте выданный HTTP API token в
TG_BOT_TOKEN. - Откройте нового бота и отправьте
/start.
Если токен когда-либо попал в сообщение, лог или Git, отзовите его командой
/revoke в BotFather и создайте новый.
После отправки боту /start временно загрузите .env и запросите обновления:
set -a
source .env
set +a
curl -sS "https://api.telegram.org/bot${TG_BOT_TOKEN}/getUpdates" \
| python -m json.toolНайдите число в result[].message.chat.id. Для группы или канала оно обычно
отрицательное. Запишите его в TG_CHAT_ID.
Tip
Если result пуст, ещё раз отправьте боту /start. На время запроса
getUpdates остановите другие экземпляры этого бота.
- Войдите в свой аккаунт на web.max.ru через Chrome или Firefox.
- Откройте DevTools:
F12илиCtrl+Shift+I. - Перейдите в Application (Chrome) или Storage (Firefox).
- Откройте Local Storage → https://web.max.ru.
- Найдите:
__oneme_auth— это JSON; скопируйте только значение поляtokenвMAX_TOKEN;__oneme_device_id— скопируйте значение вMAX_DEVICE_ID.
Оба значения дают доступ к вашей сессии MAX. После выхода из веб-аккаунта, завершения сессии или смены механизма авторизации их может потребоваться обновить.
| Переменная | Обязательна | Значение по умолчанию | Назначение |
|---|---|---|---|
MAX_TOKEN |
да | — | Токен из поля token объекта __oneme_auth |
MAX_DEVICE_ID |
да | — | Значение __oneme_device_id |
MAX_CHAT_IDS |
нет | все чаты | ID чатов MAX через запятую |
TG_BOT_TOKEN |
да | — | HTTP API token Telegram-бота |
TG_CHAT_ID |
да | — | ID личного чата, группы или канала назначения |
REPLY_ENABLED |
нет | false |
Разрешить текстовые ответы Telegram → MAX |
TG_PROXY |
нет | без прокси | SOCKS5 URL, например socks5://user:pass@host:1080 |
TG_READ_TIMEOUT |
нет | библиотечное | Таймаут чтения Telegram API, секунды |
TG_WRITE_TIMEOUT |
нет | библиотечное | Таймаут обычной отправки, секунды |
TG_MEDIA_WRITE_TIMEOUT |
нет | библиотечное | Таймаут загрузки медиа, секунды |
DEBUG |
нет | false |
Подробные логи и JSON-дампы в debug/ |
LOG_DIR |
нет | logs |
Каталог файловых логов внутри приложения |
DOCKER_NETWORK_MODE |
нет | bridge |
Сетевой режим Compose-контейнера |
По умолчанию пустой MAX_CHAT_IDS означает все чаты. Чтобы ограничить
пересылку, перечислите ID через запятую:
MAX_CHAT_IDS=250510035,-71237346476114ID чатов отображаются в стартовых логах после строки Known chats.
Для обычного удалённого прокси достаточно:
TG_PROXY=socks5://user:password@proxy.example.com:1080Если SOCKS5-прокси запущен на том же Linux-хосте и слушает только
127.0.0.1, контейнеру нужен host network:
TG_PROXY=socks5://127.0.0.1:1080
DOCKER_NETWORK_MODE=hosthost network специфичен для Linux. На Docker Desktop используйте адрес
host.docker.internal и оставьте DOCKER_NETWORK_MODE=bridge.
DEBUG=trueРежим создаёт подробные JSON-дампы, которые могут содержать сообщения и
персональные данные. Не публикуйте каталоги debug/ и logs/.
После запуска сервис слушает новые события MAX. История сообщений при старте не импортируется. Личные и групповые чаты оформляются по-разному, а вложения отправляются подходящим типом Telegram-сообщения.
- Установите
REPLY_ENABLED=trueи пересоздайте контейнер. - Нажмите 💬 Ответить под пересланным сообщением.
- Отправьте текст в ответ на подсказку бота.
- Дождитесь подтверждения
✅ Отправлено.
Отмена незавершённого ответа:
/cancel
Сейчас обратное направление поддерживает текст. Медиа из Telegram обратно в
MAX не пересылаются. Обработчик принимает команды только из TG_CHAT_ID,
указанного в конфигурации.
Требуется Python 3.12 или новее:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
cp .env.example .env
chmod 600 .env
python -m app.mainДля постоянного запуска используйте менеджер процессов. Пример systemd unit:
[Unit]
Description=AFZ_maks2tg bridge
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=max2tg
Group=max2tg
WorkingDirectory=/opt/AFZ_maks2tg
EnvironmentFile=/opt/AFZ_maks2tg/.env
ExecStart=/opt/AFZ_maks2tg/.venv/bin/python -m app.main
Restart=on-failure
RestartSec=10
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.targetdocker compose ps
docker compose logs -f --tail=200
tail -f logs/max2tg.logФайл logs/max2tg.log ротируется при достижении 10 МБ; хранится до пяти
архивных файлов.
docker compose restart
docker compose downgit pull --ff-only
docker compose up -d --build
docker image prune -fПеред обновлением проверьте изменения .env.example. Сам .env Git не
отслеживает и команда git pull его не заменяет.
| Симптом | Что проверить |
|---|---|
Missing required environment variables |
Заполнены ли четыре обязательных поля в .env; видит ли Compose файл |
Telegram ... Timed out |
Доступ к api.telegram.org, TG_PROXY, сетевой режим и значения таймаутов |
Unauthorized или постоянный reconnect MAX |
Обновите MAX_TOKEN и MAX_DEVICE_ID из активной веб-сессии |
| Бот не может написать первым | Отправьте боту /start, затем проверьте TG_CHAT_ID |
Conflict: terminated by other getUpdates request |
С тем же токеном запущен второй экземпляр бота |
| Медиа приходят повторно или не загружаются | Увеличьте TG_MEDIA_WRITE_TIMEOUT, например до 300 |
| Ответ не уходит в MAX | Проверьте REPLY_ENABLED=true, кнопку под исходным сообщением и статус WebSocket |
| Контейнер постоянно перезапускается | Выполните docker compose logs --tail=200 и проверьте типы значений в .env |
Проверка итоговой Compose-конфигурации без запуска:
docker compose config --quietMAX account
│ WebSocket events
▼
AFZ_maks2tg ── HTTP/SOCKS5 ──► Telegram Bot ──► TG_CHAT_ID
▲ │
└─── text reply ◄── inline button ◄────┘
Основные модули:
app/main.py запуск и жизненный цикл
app/config.py загрузка и проверка конфигурации
app/max_client.py WebSocket-клиент и команды MAX
app/max_listener.py преобразование событий и вложений
app/resolver.py имена контактов и чатов
app/tg_sender.py отправка в Telegram и retry
app/tg_handler.py кнопка ответа и отправка текста в MAX
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt pytest pytest-asyncio
pytest -q
docker compose config --quiet
docker build -t afz-maks2tg:dev .Pull request должен проходить тесты на Python 3.12. Правила работы описаны в CONTRIBUTING.md, а рекомендации по сообщениям об уязвимостях — в SECURITY.md.
.env,logs/иdebug/исключены из Git;- ограничьте права на
.envкомандойchmod 600 .env; - не включайте
DEBUGбез необходимости; - используйте отдельного Telegram-бота для этого сервиса;
- после утечки немедленно перевыпускайте соответствующие credentials;
- не запускайте мост для чужого аккаунта без явного разрешения владельца.
AFZ_maks2tg основан на Aist/max2tg. История исходных коммитов сохранена. Подробности об авторстве, лицензировании и товарных знаках находятся в NOTICE.md.
Если проект оказался полезен, поставьте ⭐ и приложите логи без секретов при создании issue.