Анонимный бот обратной связи для медиа «Голос»: пользователи пишут боту в личку, админы отвечают из группы с топиками (Telegram Forum Topics) — каждый пользователь получает свой топик. https://nikto.media
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-26 18:55:35 +02:00
LICENSE Initial commit 2026-08-26 18:15:12 +02:00
main.py main.py 2026-08-26 18:21:59 +02:00
README.md Обновить README.md 2026-08-26 18:55:35 +02:00
requirements.txt requirements.txt 2026-08-26 18:20:27 +02:00
test_main.py test_main.py 2026-08-26 18:21:12 +02:00

niktome — Telegram Topics Bot

Анонимный бот обратной связи для медиа «Голос»: пользователи пишут боту в личку, админы отвечают из группы с топиками (Telegram Forum Topics) — каждый пользователь получает свой топик.

Возможности

  • Анонимность: реальный Telegram ID пользователя не виден админам
  • 🔒 Защита контента: сообщения защищены от пересылки (protect_content=True)
  • 🔄 Автовосстановление топика: если топик удалили, при следующем сообщении пользователя создаётся новый
  • 🛡️ Защита от форвардов: пользователь не может переслать чужое сообщение вместо своего
  • 🔐 Шифрование: Telegram ID пользователей хранятся в БД в зашифрованном виде (AES)*
  • 🤖 Dependabot: автоматический мониторинг зависимостей

Важно

  • ⚠️ Не создавайте топики вручную — регистрацией пользователей и топиками занимается бот
  • Топики можно спокойно удалять — при следующем сообщении пользователя бот создаст новый

Структура

  • main.py — вся логика бота (aiogram 3)
  • test_main.py — тесты шифрования/дешифрования Telegram ID
  • requirements.txt — зависимости, версии зафиксированы

Настройка

  1. Создать группу с включёнными топиками (Topics) в Telegram
  2. Создать бота через @BotFather, получить токен
  3. Добавить бота в группу и выдать права администратора, включая Manage Topics (без этого бот не сможет создавать топики)
  4. Создать базу данных Postgres
  5. Создать в корне проекта .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
)
  1. Установить зависимости и запустить:
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 — иначе пересылка сообщений админам не будет работать.