Issue #38 part 2. Allows using multiple MAX group chats as per-thread mirrors of a TG forum group, since MAX has no native thread concept. - New table thread_pairs (tg_chat_id, tg_thread_id, max_chat_id) with unique(max_chat_id) — one MAX chat = at most one TG thread. - pending gains thread_id column for thread-bridge key exchange. - Repo methods: StartThreadBridge (TG issues key), CompleteThreadBridge (MAX consumes key), GetThreadMaxChat, GetThreadTgPair, UnpairThread, UnpairThreadByMax. - Commands: * /thread_bridge in a TG forum thread (admin, non-General) -> key * /thread_bridge <key> in a MAX chat -> binds * /thread_unbridge on either side TG's BOT_COMMAND_INVALID rule forbids hyphens, so the commands use underscore. - Routing priority: thread-bridge > regular pair. TG->MAX: if msg.MessageThreadID has a thread_pair, route there. MAX->TG: if MAX chat is in thread_pairs, route to (tg_chat, thread). - For thread-paired MAX chats, the Part 1 reply-to-source-thread override is disabled: thread-paired chats have a fixed target thread, replies stay there. - Safeguard: a MAX chat cannot be in both pairs and thread_pairs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .github/workflows | ||
| docs | ||
| migrations | ||
| .env.example | ||
| .gitignore | ||
| admin.go | ||
| admin_test.go | ||
| bridge.go | ||
| docker-compose.yml | ||
| Dockerfile | ||
| format.go | ||
| format_test.go | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| main_test.go | ||
| Makefile | ||
| markup.go | ||
| markup_test.go | ||
| max.go | ||
| mediagroup.go | ||
| migrate.go | ||
| postgres.go | ||
| queue.go | ||
| README.md | ||
| replacements.go | ||
| repository.go | ||
| sqlite.go | ||
| telegram.go | ||
| tgsender.go | ||
| tgsender_impl.go | ||
| tgsender_impl_test.go | ||
| upload.go | ||
MaxTelegramBridgeBot
Мост между Telegram и MAX мессенджером. Пересылает сообщения, медиа, файлы и редактирования между связанными чатами.
Сайт: maxtelegrambridge.ru
Возможности
- Пересылка текстовых сообщений в обе стороны
- Пересылка медиа: фото, видео, GIF, стикеры, документы, голосовые, аудио, кружки
- Поддержка ответов (reply) — сохраняется контекст
- Отслеживание редактирования сообщений. Если при редактировании добавлено медиа — отправляется как новое сообщение (MAX API не поддерживает редактирование вложений)
- Удаление сообщений (MAX→TG). TG→MAX удаление невозможно — Telegram Bot API не отправляет событие удаления
- Retry-очередь — при недоступности API сообщения сохраняются в БД и доставляются позже
- Поддержка локального Telegram Bot API сервера (
TG_API_URL) - Поддержка форумов (топиков) в TG-группах — сообщения из MAX приходят в нужный топик
- Команда
/thread— выбрать топик по умолчанию для сообщений из MAX - Автосброс топика при отключении форума в группе
- Настраиваемый префикс
[TG]/[MAX] - Кросспостинг каналов с выбором направления (
tg>max,max>tg,both) - Сохранение форматирования при кросспостинге (жирный, курсив, код, ссылки, зачёркнутый, подчёркнутый)
- Управление кросспостингом через inline-кнопки
- SQLite или PostgreSQL для хранения связок и маппинга сообщений
Форматирование при кросспостинге
| Формат | TG → MAX | MAX → TG |
|---|---|---|
| Жирный | ✅ | ✅ |
| Курсив | ✅ | ✅ |
| Моноширинный | ✅ | ✅ |
| ✅ | ✅ | |
| Подчёркнутый | ✅ | ✅ |
| Ссылки | ✅ | ✅ |
| Цитата | ❌ | ❌ |
| Спойлер | ❌ | — |
Цитаты и спойлеры не поддерживаются MAX Bot API.
Установка
Из бинаря
Скачайте бинарь со страницы релизов и запустите:
chmod +x max-telegram-bridge-bot
./max-telegram-bridge-bot
Docker
docker run -e TG_TOKEN=your_token -e MAX_TOKEN=your_token ghcr.io/bearlogin/max-telegram-bridge-bot:latest
Docker Compose (с PostgreSQL)
cp .env.example .env
# Заполните TG_TOKEN и MAX_TOKEN в .env
docker compose up -d
PostgreSQL настраивается через .env:
POSTGRES_USER=bridge
POSTGRES_PASSWORD=bridge
POSTGRES_DB=bridge
Из исходников
git clone https://github.com/BEARlogin/max-telegram-bridge-bot.git
cd max-telegram-bridge-bot
go build -o max-telegram-bridge-bot .
./max-telegram-bridge-bot
Быстрый старт
1. Создайте ботов
- Telegram: через @BotFather, отключите Privacy Mode (Bot Settings → Group Privacy → Turn off)
- MAX: через business.max.ru
2. Настройте и запустите
Передайте токены через переменные окружения:
TG_TOKEN=your_token MAX_TOKEN=your_token ./max-telegram-bridge-bot
Или через export:
export TG_TOKEN=your_token
export MAX_TOKEN=your_token
./max-telegram-bridge-bot
3. Свяжите чаты
- Добавьте бота в Telegram-группу и MAX-группу
- В MAX сделайте бота админом группы
- В Telegram сделайте бота админом, если группа — супергруппа с темами (форум). В обычных группах админство не требуется (нужно только отключить Bot Privacy Mode через @BotFather, либо сделать бота админом)
- В одном из чатов отправьте
/bridge - Бот выдаст ключ — отправьте
/bridge <ключ>в другом чате (в группе, не в ЛС бота)
4. Кросспостинг каналов
Настройка через личные сообщения с ботами (ничего не публикуется в каналах):
- Добавьте бота как админа в TG-канал и MAX-канал
- Перешлите любой пост из TG-канала в личку TG-бота → бот покажет ID канала
- В личке MAX-бота напишите
/crosspost <TG_ID> - Перешлите любой пост из MAX-канала в личку MAX-бота → кросспостинг настроен!
По умолчанию посты идут в обе стороны. Управление:
/crosspost(в личке любого бота) — список всех связок с кнопками- Перешлите пост из связанного канала в личку бота → появятся кнопки управления (направление, удаление)
Команды
Группы (bridge)
| Команда | Описание |
|---|---|
/start, /help |
Инструкция |
/bridge |
Создать ключ для связки |
/bridge <ключ> |
Связать чат по ключу |
/bridge prefix on/off |
Включить/выключить префикс [TG]/[MAX] |
/unbridge |
Удалить связку |
/thread |
Направить сообщения из MAX в текущий топик (форум-группы) |
Каналы (crosspost) — через личку бота
| Команда | Где | Описание |
|---|---|---|
/crosspost |
TG или MAX личка | Список всех связок с кнопками управления |
/crosspost <TG_ID> |
MAX личка | Начать настройку (затем переслать пост из MAX-канала) |
| Переслать пост из канала | TG или MAX личка | Показать ID (если не связан) или кнопки управления |
Кнопки управления позволяют менять направление (TG→MAX, MAX→TG, оба) и удалять связку.
5. Автозамены в кросспостинге
Автоматическая замена текста при пересылке постов. Удобно для UTM-меток, ссылок и любых строк.
/crosspost→ нажмите 🔄 Замены на нужной связке- Выберите направление: + TG→MAX или + MAX→TG
- Выберите тип: Весь текст или Только ссылки
- Отправьте правило:
from | to
Для регулярных выражений: /regex/ | replacement
Пример: utm_source=tg | utm_source=max — при пересылке из TG в MAX все вхождения utm_source=tg заменятся на utm_source=max.
Переменные окружения
| Переменная | Описание | По умолчанию |
|---|---|---|
TG_TOKEN |
Токен Telegram бота | — (обязательно) |
MAX_TOKEN |
Токен MAX бота | — (обязательно) |
DB_PATH |
Путь к SQLite базе | bridge.db |
DATABASE_URL |
DSN для PostgreSQL (если задана — SQLite игнорируется) | — |
TG_BOT_URL |
Ссылка на TG-бота (показывается в /help) |
https://t.me/MaxTelegramBridgeBot |
MAX_BOT_URL |
Ссылка на MAX-бота (показывается в /help) |
https://max.ru/id710708943262_bot |
WEBHOOK_URL |
Базовый URL для webhook, например https://bridge.example.com (если не задан — long polling). Эндпоинты: /tg-webhook, /max-webhook |
— |
WEBHOOK_PORT |
Порт для webhook сервера | 8443 |
LOG_LEVEL |
Уровень логирования: debug, info, warn, error |
info |
TG_API_URL |
URL локального Telegram Bot API сервера, например http://localhost:8081. Снимает лимиты на размер файлов |
— |
ALLOWED_USERS |
Белый список Telegram user ID через запятую. Если не задан — доступ открыт для всех | — |
TG_MAX_FILE_SIZE_MB |
Максимальный размер файла из Telegram в Max. Рекомендуется 20 МБ (если не используется локальный сервер API), если не задано - без ограничений | — |
MAX_MAX_FILE_SIZE_MB |
Максимальный размер файла из Max в Telegram. Рекомендуется 20 МБ (если не используется локальный сервер API), если не задано - без ограничений | — |
MAX_ALLOWED_EXTENSIONS |
Список расширений файлов через запятую, которые разрешены к отправке. Если не задано - без ограничений | — |
MESSAGE_FORMAT |
Формат сообщений. inline (текущий Имя: текст) и newline (Имя:\nтекст) | inline |
Лицензия
CC BY-NC 4.0 — свободное использование и модификация, но коммерческое использование только с письменного разрешения автора.
Разработчик
bearlogin.dev — разработка ботов, сайтов, лендингов и digital-продуктов под ключ. Консультации по автоматизации и AI.