Skip to content

unlimy-org/unlimy-notificator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Telegram Channel Notification Bot

Python Aiogram Docker License Status

Бот для Telegram-канала, который публикует пост по расписанию, удаляет предыдущий пост бота и продвигает PRO-подписку.


Возможности

  • Автопостинг в канал каждые N секунд.
  • Форматированный текст (HTML, Markdown, MarkdownV2).
  • Inline-кнопка с настраиваемым стилем:
    • primary (синий)
    • success (зеленый)
    • danger (красный)
  • Публикация с изображением:
    • по URL (IMAGE_URL)
    • из файла (IMAGE_PATH)
  • Удаление только предыдущего сообщения, отправленного ботом.
  • Поддержка SOCKS5-прокси:
    • прямой URL (PROXY_URL)
    • Telegram-формат (PROXY_TG_LINK)
  • 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-бот с правами администратора канала:
    • публикация сообщений
    • удаление сообщений

Быстрый старт (Docker)

  1. Подготовьте .env:
cp .env.example .env
  1. Проверьте, что есть папки для данных и изображений:
mkdir -p data assets
  1. Запустите бота:
docker compose up -d --build
  1. Просмотр логов:
docker compose logs -f
  1. Остановка:
docker compose down

Локальный запуск (без Docker)

python3 -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.


Пример .env (PRO-пост)

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 Volumes

В 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. Любые сообщения, созданные вручную или другими ботами, не затрагиваются.


Частые проблемы

IMAGE_PATH does not exist

Причина: путь указан на хосте, но недоступен в контейнере.

Решение:

  • Убедитесь, что файл существует локально: ./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 рекомендуется ограничить доступ к серверу и логам.

Лицензия

Внутренний/приватный проект.

About

Telegram-бот для канала: публикует посты по расписанию, удаляет предыдущий пост бота, поддерживает форматирование, inline-кнопки, прокси и Docker-развертывание.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors