Бот для Telegram-канала, который публикует пост по расписанию, удаляет предыдущий пост бота и продвигает PRO-подписку.
- Автопостинг в канал каждые
Nсекунд. - Форматированный текст (
HTML,Markdown,MarkdownV2). - Inline-кнопка с настраиваемым стилем:
primary(синий)success(зеленый)danger(красный)
- Публикация с изображением:
- по URL (
IMAGE_URL) - из файла (
IMAGE_PATH)
- по URL (
- Удаление только предыдущего сообщения, отправленного ботом.
- Поддержка SOCKS5-прокси:
- прямой URL (
PROXY_URL) - Telegram-формат (
PROXY_TG_LINK)
- прямой URL (
- Persist state: запоминает
message_idмежду перезапусками.
main.py
└── app/
├── config.py # env-конфиг, валидация, parse mode, proxy
├── runner.py # запуск бота и цикл публикации
├── publisher.py # отправка нового поста и удаление предыдущего
└── state.py # чтение/запись состояния (last_message_id)
- Python
3.11+ - Docker + Docker Compose (для контейнерного запуска)
- Telegram-бот с правами администратора канала:
- публикация сообщений
- удаление сообщений
- Подготовьте
.env:
cp .env.example .env- Проверьте, что есть папки для данных и изображений:
mkdir -p data assets- Запустите бота:
docker compose up -d --build- Просмотр логов:
docker compose logs -f- Остановка:
docker compose downpython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
python3 main.py| Переменная | Обяз. | По умолчанию | Описание |
|---|---|---|---|
BOT_TOKEN |
Да | - | Токен бота от BotFather |
CHANNEL_ID |
Да | - | ID канала (например -1001234567890) |
POST_INTERVAL_SECONDS |
Нет | 3600 |
Интервал публикации в секундах |
POST_TEXT |
Да | - | Текст поста (\\n для переносов) |
BUTTON_TEXT |
Да | - | Текст inline-кнопки |
BUTTON_URL |
Да | - | Ссылка кнопки |
BUTTON_STYLE |
Нет | пусто | primary, success, danger |
IMAGE_URL |
Нет | пусто | Ссылка на изображение |
IMAGE_PATH |
Нет | пусто | Путь к локальному изображению |
PARSE_MODE |
Нет | HTML |
HTML, Markdown, MarkdownV2 |
PROXY_URL |
Нет | пусто | SOCKS5 URL, напр. socks5://user:pass@host:port |
PROXY_TG_LINK |
Нет | пусто | Ссылка формата https://t.me/socks?... |
STATE_FILE |
Нет | .bot_state.json |
Путь к файлу состояния |
SEND_ON_START |
Нет | true |
Публиковать ли сразу после запуска |
Если указаны и PROXY_URL, и PROXY_TG_LINK, используется PROXY_URL.
BOT_TOKEN=123456:ABCDEF
CHANNEL_ID=-1001234567890
POST_INTERVAL_SECONDS=3600
POST_TEXT=🇷🇺 <b>Стабильный доступ в российских сетях</b>\n\nPRO лучше держит соединение при изменениях маршрутизации, ограничениях у операторов и нестабильной сети.\n\n• стабильнее доступ даже при жестких ограничениях\n• выше скорость в нагрузке\n• безопаснее соединение\n• приоритетные серверы\n\n🎁 <b>Попробуйте PRO бесплатно 3 дня</b> — оцените скорость, стабильность и безопасность без риска.\n\n👇 Подключить PRO — по кнопке ниже.
BUTTON_TEXT=Подключить PRO
BUTTON_URL=https://example.com/pro
BUTTON_STYLE=success
IMAGE_PATH=/app/assets/logo.png
# IMAGE_URL=https://example.com/banner.jpg
PARSE_MODE=HTML
PROXY_TG_LINK=https://t.me/socks?server=144.31.164.75&port=2085&user=tgproxy&pass=Kb4forall%21
STATE_FILE=/app/data/.bot_state.json
SEND_ON_START=trueВ docker-compose.yml используются:
./data:/app/data— файл состояния бота./assets:/app/assets:ro— изображения дляIMAGE_PATH
Если в .env указан IMAGE_PATH, используйте путь внутри контейнера, например:
IMAGE_PATH=/app/assets/logo.pngБот удаляет только предыдущее сообщение, которое отправил сам.
Это достигается через сохранение last_message_id в STATE_FILE.
Любые сообщения, созданные вручную или другими ботами, не затрагиваются.
Причина: путь указан на хосте, но недоступен в контейнере.
Решение:
- Убедитесь, что файл существует локально:
./assets/logo.png - Используйте в
.env:IMAGE_PATH=/app/assets/logo.png - Перезапустите контейнер:
docker compose up -d --build
Причина: не задан BUTTON_STYLE или клиент Telegram не применил стиль.
Решение:
- Укажите
BUTTON_STYLE=primary|success|danger - Обновите пост (дождитесь следующего цикла или перезапустите бота)
Причина: у бота нет права удаления сообщений в канале.
Решение:
- Дайте боту права администратора с удалением сообщений.
- Не коммитьте
.envв репозиторий. - Не публикуйте
BOT_TOKENи прокси-учетные данные. - Для production рекомендуется ограничить доступ к серверу и логам.
Внутренний/приватный проект.