Анонимный бот обратной связи для медиа «Голос»: пользователи пишут боту в личку, админы отвечают из группы с топиками (Telegram Forum Topics) — каждый пользователь получает свой топик.
https://nikto.media
- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| LICENSE | ||
| main.py | ||
| README.md | ||
| requirements.txt | ||
| test_main.py | ||
niktome — Telegram Topics Bot
Анонимный бот обратной связи для медиа «Голос»: пользователи пишут боту в личку, админы отвечают из группы с топиками (Telegram Forum Topics) — каждый пользователь получает свой топик.
Возможности
- ✨ Анонимность: реальный Telegram ID пользователя не виден админам
- 🔒 Защита контента: сообщения защищены от пересылки (
protect_content=True) - 🔄 Автовосстановление топика: если топик удалили, при следующем сообщении пользователя создаётся новый
- 🛡️ Защита от форвардов: пользователь не может переслать чужое сообщение вместо своего
- 🔐 Шифрование: Telegram ID пользователей хранятся в БД в зашифрованном виде (AES)*
- 🤖 Dependabot: автоматический мониторинг зависимостей
Важно
- ⚠️ Не создавайте топики вручную — регистрацией пользователей и топиками занимается бот
- ✅ Топики можно спокойно удалять — при следующем сообщении пользователя бот создаст новый
Структура
main.py— вся логика бота (aiogram 3)test_main.py— тесты шифрования/дешифрования Telegram IDrequirements.txt— зависимости, версии зафиксированы
Настройка
- Создать группу с включёнными топиками (Topics) в Telegram
- Создать бота через @BotFather, получить токен
- Добавить бота в группу и выдать права администратора, включая Manage Topics (без этого бот не сможет создавать топики)
- Создать базу данных Postgres
- Создать в корне проекта
.envс переменными:
BOT_TOKEN=токен бота от BotFather
GROUP_ID=id группы с топиками (отрицательное число, начинается на -100)
DATABASE_URL=строка подключения к Postgres
TABLE_NAME=имя таблицы (по умолчанию an_users)
ENCRYPTION_KEY=ключ шифрования Telegram ID (16, 24 или 32 байта)
Структура таблицы в БД:
CREATE TABLE an_users (
id SERIAL PRIMARY KEY,
telegram_id TEXT NOT NULL,
anon_id UUID NOT NULL,
created_at TIMESTAMP DEFAULT NOW(),
topic_id INTEGER NOT NULL
)
- Установить зависимости и запустить:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python3 main.py
Деплой
Прод крутится на Railway (проект bundle_bots, сервис MOST). Деплой автоматический — при пуше в master Railway пересобирает и перезапускает сервис. Переменные окружения (BOT_TOKEN, DATABASE_URL и т.д.) заданы отдельно в Railway, а не берутся из .env в репозитории.
При смене токена бота (BotFather): если создаётся не просто новый секрет того же бота, а совсем другой бот-аккаунт (другой числовой ID в токене), нужно:
- обновить
BOT_TOKENв переменных окружения Railway; - добавить новый бот в группу с топиками и выдать права администратора с Manage Topics — иначе пересылка сообщений админам не будет работать.