Автоматический переводчик постов из одного канала на другой Telegram: переводит русскоязычные посты на английский с помощью GPT‑4o и публикует их с сохранением форматирования и медиа.
- Онлайн‑мониторинг указанного канала.
- Перевод GPT‑4o текста с сохранением форматирования HTML/Markdown, списков, эмодзи и ссылок.
- Медиа (фото, видео) публикуются с оригинальным файлом и переведённой подписью.
- Маппинг русских ссылок на англоязычные
- Фильтр хэштегов — можно игнорировать определённые сообщения.
- Управление состоянием: Администраторы могут активировать или деактивировать бота; состояние сохраняется между перезапусками.
- Подробное логирование в файл (и при желании в отдельный канал).
# 1. Клонируем репозиторий
$ git clone https://github.com/yourname/telegram-translation-bot.git && cd telegram-translation-bot
# 2. Создаём и активируем виртуальное окружение
$ python -m venv venv
$ source venv/bin/activate # Windows: venv\Scripts\activate
# 3. Ставим зависимости
$ pip install -r requirements.txt
# 4. Настраиваем переменные
$ cp .env.example .env
# → Заполняем .env своими данными Telegram и OpenAI
# 5. Запускаем бота
$ python main.py
$ docker build -t telegram-translation-bot .
$ docker run --env-file .env telegram-translation-bot
Для проверки корректности работы ключевых модулей проекта, в частности модуля translation.py
, используются автоматизированные тесты.
- Убедитесь, что
pytest
установлен (он должен быть включен вrequirements.txt
):$ pip install pytest # Если еще не установлен через requirements.txt
- Для запуска всех тестов выполните команду из корневой директории проекта:
Для более детального вывода можно использовать флаг
$ pytest
-v
:$ pytest -v
Тесты находятся в директории tests/
. По состоянию на Май 2025, все тесты для модуля перевода успешно проходят.
main.py — точка входа
config.py — все настройки/переменные окружения
translation.py — переводчик (OpenAI)
publisher.py — публикация сообщений (и медиа) в целевой канал
handlers/ — обработчики сообщений (текст, медиа, фильтры, команды управления)
bot_state.py — асинхронное управление состоянием активности бота (вкл/выкл) с использованием aiosqlite
(SQLite)
logger.py — логирование с ротацией файлов
А. Управление состоянием бота (Администратор):
- Администратор бота (указанный в
ADMIN_IDS
в файле.env
) может отправить боту команду/control
в личном чате. - В ответ бот покажет текущее состояние (активен/неактивен для перевода) и предложит кнопки для активации или деактивации.
- Выбранное состояние сохраняется в локальной базе данных (
bot_state.db
) и будет учитываться даже после перезапуска бота.
Б. Обработка входящих сообщений из исходного канала (когда бот запущен):
- В исходном Telegram-канале (указанном в
SOURCE_CHANNEL_ID
) появляется новое сообщение или медиа (например, текст или фото с подписью). - Проверка состояния активности: Бот сначала проверяет свое текущее состояние (активен/неактивен), установленное администратором.
- Если бот деактивирован, он игнорирует новое сообщение и никаких дальнейших действий не предпринимает.
- Если бот активен, он переходит к следующему шагу.
- Проверка фильтров: Бот анализирует сообщение на наличие исключённых хэштегов или ключевых слов (заданных в
EXCLUDED_HASHTAGS
иEXCLUDED_KEYWORDS
).- Если обнаружен исключающий хэштег или ключевое слово, сообщение пропускается. Информация об этом логируется.
- Перевод и обработка (если не пропущено):
- Для текстовых сообщений: Текст сообщения (с сохранением HTML-структуры) отправляется на перевод через OpenAI API (используется модель, указанная в
translation.py
, например, GPT-4o). - Для медиа (фото/видео): Если у медиа есть подпись, эта подпись переводится аналогично текстовому сообщению. Сам медиафайл (фото/видео) остается оригинальным.
- Для текстовых сообщений: Текст сообщения (с сохранением HTML-структуры) отправляется на перевод через OpenAI API (используется модель, указанная в
- Публикация: Переведённое сообщение (или медиа с переведённой подписью) публикуется в целевом Telegram-канале (указанном в
TARGET_CHANNEL_ID
). Бот старается максимально сохранить исходное форматирование. - Логирование: Все ключевые действия, этапы обработки, а также возможные ошибки подробно записываются в консоль и/или в лог-файл (
LOG_FILE
), и опционально в специальный лог-канал (LOG_CHANNEL_ID
).
Переменная | Описание |
---|---|
TELEGRAM_BOT_TOKEN |
Токен Telegram-бота, полученный у @BotFather |
SOURCE_CHANNEL_ID |
ID русского канала для чтения (например -100123… ) |
TARGET_CHANNEL_ID |
ID англоязычного канала для публикации перевода |
LOG_CHANNEL_ID |
опционально — канал для логов |
OPENAI_API_KEY |
API‑ключ OpenAI |
EXCLUDED_HASHTAGS |
Список хэштегов, по которым сообщение пропускается |
LOG_FILE |
опционально — имя лог-файла. |
- Другие типы медиа — добавьте соответствующие хэндлеры в
handlers/media.py
. - Дополнительные правила для ссылок — расширьте
LINK_MAP
вtranslation.py
. - Смена модели — измените параметр
model
вtranslation.py
. - Webhook‑деплой — вместо
start_polling
используйтеstart_webhook
.
- Бот должен быть админом в обоих каналах.
- Для OpenAI нужен активный аккаунт и оплаченное API.
MIT License © 2025 Bosi4ok & AndrChu Company Сделано с ❤️ на Python и aiogram.