Find a file
Andrey Lugovskoy fa11af83a6 Forward MAX→TG: re-attach media from Link.Message for forwards
Issue #44: forwarding a MAX message that contained a file/photo/video
from group A into group B (bridged to TG) delivered only the text to
TG; the media was missing.

The MAX SDK only converts Link.Message.RawAttachments → Attachments
when body.RawAttachments == nil. MAX sends body.RawAttachments=[] (an
empty array, NOT nil) for forwards, so the else-if branch never fires
and Link.Message.Attachments stays empty. Our merge-into-body code in
forwardMaxToTg saw nothing to add.

Parse Link.Message.RawAttachments ourselves: read each entry's "type",
unmarshal to the concrete PhotoAttachment / VideoAttachment / etc., and
prepend to body.Attachments before the downstream send loop. Unknown
types are skipped silently.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-18 00:44:30 +04:00
.github/workflows Fix release workflow: pass changelog via file to avoid shell expansion 2026-04-16 21:40:15 +04:00
docs Restore migration files after revert (schema already applied on prod) 2026-04-02 12:39:01 +03:00
migrations Add created_at to pairs for pair growth stats 2026-04-24 15:40:28 +04:00
.env.example Update .env.example 2026-03-26 18:26:59 +02:00
.gitignore Drop permanent queue errors fast + log MAX bot add/remove events 2026-06-01 13:15:35 +04:00
admin.go Treat anonymous admins as admins for /bridge, /thread etc. 2026-04-20 17:31:37 +04:00
admin_test.go Treat anonymous admins as admins for /bridge, /thread etc. 2026-04-20 17:31:37 +04:00
bridge.go Веб хуки. Разделение для TG и Max (#42) 2026-05-12 11:31:08 +04:00
docker-compose.yml Use env vars for Postgres config in docker-compose 2026-02-15 13:01:59 +03:00
Dockerfile Security hardening and admin check tests 2026-02-15 15:05:41 +03:00
format.go Preserve links in TG→MAX crossposts; deliver text when video fails 2026-04-24 16:26:24 +04:00
format_test.go Migrate TG library to go-telegram/bot with forum topic support 2026-04-02 17:48:33 +03:00
go.mod Migrate TG library to go-telegram/bot with forum topic support 2026-04-02 17:48:33 +03:00
go.sum Migrate TG library to go-telegram/bot with forum topic support 2026-04-02 17:48:33 +03:00
LICENSE Add CC BY-NC 4.0 license 2026-03-17 13:09:35 +03:00
main.go Веб хуки. Разделение для TG и Max (#42) 2026-05-12 11:31:08 +04:00
main_test.go Security hardening and admin check tests 2026-02-15 15:05:41 +03:00
Makefile Load .env in Makefile 2026-02-15 13:03:09 +03:00
markup.go Fix Markdown delimiter rules at TG entity boundaries 2026-06-18 00:36:59 +04:00
markup_test.go Fix Markdown delimiter rules at TG entity boundaries 2026-06-18 00:36:59 +04:00
max.go Forward MAX→TG: re-attach media from Link.Message for forwards 2026-06-18 00:44:30 +04:00
mediagroup.go Add DISABLE_PREFIX env + default OFF for chats not in pairs 2026-04-30 16:06:24 +04:00
migrate.go Initial commit: TG↔MAX bridge 2026-02-15 03:58:24 +03:00
postgres.go Add DISABLE_PREFIX env + default OFF for chats not in pairs 2026-04-30 16:06:24 +04:00
queue.go Drop permanent queue errors fast + log MAX bot add/remove events 2026-06-01 13:15:35 +04:00
README.md Веб хуки. Разделение для TG и Max (#42) 2026-05-12 11:31:08 +04:00
replacements.go Migrate TG library to go-telegram/bot with forum topic support 2026-04-02 17:48:33 +03:00
repository.go Add /thread_bridge: link a single TG forum thread to a separate MAX chat 2026-04-23 17:39:00 +04:00
sqlite.go Add DISABLE_PREFIX env + default OFF for chats not in pairs 2026-04-30 16:06:24 +04:00
telegram.go Fix Markdown delimiter rules at TG entity boundaries 2026-06-18 00:36:59 +04:00
tgsender.go Fix TG webhook: start library workers for update dispatch 2026-04-02 17:52:11 +03:00
tgsender_impl.go Fix TG webhook: start library workers for update dispatch 2026-04-02 17:52:11 +03:00
tgsender_impl_test.go Migrate TG library to go-telegram/bot with forum topic support 2026-04-02 17:48:33 +03:00
upload.go fix: sendTgMediaFromURL: pass parseMode, replyToID for stickers and etc. 2026-06-14 22:07:38 +04:00

Bridge Bot

MaxTelegramBridgeBot

Мост между Telegram и MAX мессенджером. Пересылает сообщения, медиа, файлы и редактирования между связанными чатами.

Сайт: maxtelegrambridge.ru

Боты: Telegram | MAX

❤ Поддержать проект

Возможности

  • Пересылка текстовых сообщений в обе стороны
  • Пересылка медиа: фото, видео, GIF, стикеры, документы, голосовые, аудио, кружки
  • Поддержка ответов (reply) — сохраняется контекст
  • Отслеживание редактирования сообщений. Если при редактировании добавлено медиа — отправляется как новое сообщение (MAX API не поддерживает редактирование вложений)
  • Удаление сообщений (MAX→TG). TG→MAX удаление невозможно — Telegram Bot API не отправляет событие удаления
  • Retry-очередь — при недоступности API сообщения сохраняются в БД и доставляются позже
  • Поддержка локального Telegram Bot API сервера (TG_API_URL)
  • Поддержка форумов (топиков) в TG-группах — сообщения из MAX приходят в нужный топик
  • Команда /thread — выбрать топик по умолчанию для сообщений из MAX
  • Команда /thread_bridge — связать отдельный TG-тред с отдельным MAX-чатом (форум ↔ несколько MAX-групп)
  • Reply из 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. Свяжите чаты

  1. Добавьте бота в Telegram-группу и MAX-группу
  2. В MAX сделайте бота админом группы
  3. В Telegram сделайте бота админом, если группа — супергруппа с темами (форум). В обычных группах админство не требуется (нужно только отключить Bot Privacy Mode через @BotFather, либо сделать бота админом)
  4. В одном из чатов отправьте /bridge
  5. Бот выдаст ключ — отправьте /bridge <ключ> в другом чате (в группе, не в ЛС бота)

4. Кросспостинг каналов

Настройка через личные сообщения с ботами (ничего не публикуется в каналах):

  1. Добавьте бота как админа в TG-канал и MAX-канал
  2. Перешлите любой пост из TG-канала в личку TG-бота → бот покажет ID канала
  3. В личке MAX-бота напишите /crosspost <TG_ID>
  4. Перешлите любой пост из MAX-канала в личку MAX-бота → кросспостинг настроен!

По умолчанию посты идут в обе стороны. Управление:

  • /crosspost (в личке любого бота) — список всех связок с кнопками
  • Перешлите пост из связанного канала в личку бота → появятся кнопки управления (направление, удаление)

Команды

Группы (bridge)

Команда Описание
/start, /help Инструкция
/bridge Создать ключ для связки
/bridge <ключ> Связать чат по ключу
/bridge prefix on/off Включить/выключить префикс [TG]/[MAX]
/unbridge Удалить связку
/thread Направить сообщения из MAX в текущий топик (форум-группы)

Форум-тред ↔ отдельная MAX-группа (thread-bridge)

В MAX нет тредов, но можно связать отдельные MAX-группы с конкретными тредами TG-форума — каждый тред получает своё зеркало.

Команда Где Описание
/thread_bridge TG, внутри треда Создать ключ для связки этого треда (нужны права админа, не работает в General)
/thread_bridge <ключ> MAX, отдельная группа Связать MAX-чат с TG-тредом по ключу
/thread_unbridge TG (в треде) или MAX Удалить связку треда

Один MAX-чат может быть зеркалом максимум одного треда и не может одновременно участвовать в /bridge. В одной форум-группе может быть несколько /thread_bridge (по одной на тред) параллельно с обычным /bridge для General.

Каналы (crosspost) — через личку бота

Команда Где Описание
/crosspost TG или MAX личка Список всех связок с кнопками управления
/crosspost <TG_ID> MAX личка Начать настройку (затем переслать пост из MAX-канала)
Переслать пост из канала TG или MAX личка Показать ID (если не связан) или кнопки управления

Кнопки управления позволяют менять направление (TG→MAX, MAX→TG, оба) и удалять связку.

5. Автозамены в кросспостинге

Автоматическая замена текста при пересылке постов. Удобно для UTM-меток, ссылок и любых строк.

  1. /crosspost → нажмите 🔄 Замены на нужной связке
  2. Выберите направление: + TG→MAX или + MAX→TG
  3. Выберите тип: Весь текст или Только ссылки
  4. Отправьте правило: 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
MAX_WEBHOOK_URL Базовый URL для webhook, например https://bridge.example.com (если не задан — long polling). Эндпоинт: /max-webhook
TG_WEBHOOK_URL Базовый URL для webhook, например https://bridge.example.com (если не задан — long polling). Эндпоинты: /tg-webhook
MAX_WEBHOOK_PORT Порт для webhook сервера MAX. Если порт совпадает с Telegram, значит будет общий сервер 8443
TG_WEBHOOK_PORT Порт для webhook сервера Telegram . Если порт совпадает с Max, значит будет общий сервер 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.