Как работает наш бот
Редакция гримеркиЗачем нужна эта статья
Большинство сообществ, использующих кастомных ботов для "анонимок" - не утруждают себя в том, чтобы доказать доверившимся людям, что их сообщения действительно анонимны.
Учитывая подорванное доверие к таким сообществам, мы посчитали нужным раскрыть внутреннюю кухню и наглядно продемонстрировать, как мы обрабатываем ваши анонимки, и почему мы заявляем, что они анонимны.
Как работает бот
Логика максимально простая для пользователя и прозрачная для админов.
1) Пользователь пишет боту в личку
Бот принимает сообщение (текст, фото, видео, голосовые, документы, альбомы и т.д. - отправляйте как вам удобно) и отвечает:
«Ваша анонимка принята!»

2) Сообщение уходит в админ-чат
В админке появляется копия сообщения и панель действий:
- Опубликовать
- Сгенерировать теги
- Отклонить
- Ответить
- Забанить
Если сообщений несколько, бот собирает их в один кейс и помечает начало/конец блока, чтобы модераторам было удобно.

3) Модерация
Админ выбирает действие:
- Опубликовать — можно вручную выбрать теги;
- Сгенерировать теги — бот получает оценки тегов от LLM, показывает предпросмотр;
- Отклонить — отправляет пользователю заранее заданную причину;
- Ответить — следующее сообщение админа уходит автору;
- Забанить — временно или навсегда.
4) Публикация в канал
После подтверждения бот публикует пост в канал от имени бота, с тегами.

Если пост опубликован — пользователь получает уведомление:
«Ваша анонимка опубликована!»
Почему это анонимно
Анонимность держится на архитектуре, а не на пустых обещаниях и непонятных скриншотах.
1) Используется copy, а не forward
Бот копирует сообщения между чатами, а не пересылает их как «forwarded».
Это важно, потому что при копировании Telegram не показывает исходного автора.
Итог: в админ-чате и в канале нет карточки «кто отправил».
2) Нет постоянной связки «кейс → пользователь» в open_cases
Для восстановления после перезапуска бот хранит открытые кейсы, но без chat_id автора.
То есть даже при доступе к этому файлу нельзя восстановить личность автора для большинства кейсов.
3) После рестарта доступна только публикация
Если бот перезапустился и chat_id автора уже не в памяти процесса, остаётся только безопасный сценарий — публикация из админ-копий.
Reply/ban/reject в таком случае блокируются, потому что требуют прямой идентификатор.
Это осознанный privacy trade-off: меньше «удобства», больше анонимности.
4) В служебных данных нет лишних идентификаторов
В callback-кнопках и внутренних ключах используется короткий case_id, а не user_id/chat_id.
5) В LLM уходит только контент
Для тегирования отправляется только текст/контент сообщения, без идентификаторов пользователя.
6) Мы не собираем логов
Вообще. Даже системных
Что такое chat_id и почему мы так за него трясемся
chat_id в Telegram — это технический идентификатор диалога с пользователем.
Если у кого-то есть chat_id и рабочий бот-токен, теоретически можно связать действия с конкретным аккаунтом в рамках API-сценариев. Поэтому chat_id — чувствительные данные, и мы относимся к нему как к потенциальному деанонимизирующему идентификатору.
Что происходит в боте:
- Когда появляется
chat_id: в момент входящего сообщения в личку бота (Telegram присылает его в update). - Где он “вращается”: только в оперативной памяти процесса, пока кейс живой (нужен для reply/ban/reject в текущей сессии).
- Что мы делаем дальше: не записываем
chat_idвopen_cases.jsonи не держим связку “кейс → пользователь” на диске. - После рестарта: память процесса очищается,
chat_idисчезает, остаётся только возможность публикации из копий в админ-чате.
Почему администрация не может достать chat_id из памяти процесса
В нашей модели размещения бот работает на Bothost как обычный хостинг-процесс без режима live-debug/attach к RAM для админов сообщества.
То есть у модераторов и админов канала нет инструмента “подключиться к памяти процесса и вытащить переменные”.
Практически это означает:
- админка Telegram не даёт доступ к RAM процесса;
- файлы проекта не содержат
chat_idдля открытых кейсов; - после перезапуска процесса даже временный, недоступный админам
chat_idиз памяти пропадает. То есть, если кому-то ударит моча в голову, и он решит сделать бот неанонимным - он не узнает, что и кто писал раньше - этих данных не будет, поскольку бота придется передеплоить.
Итог: чувствительный идентификатор существует только кратко во время обработки апдейта и активного кейса, не сохраняется нигде, ни в постоянном хранилище, ни во временном и недоступен модераторам через интерфейс/файлы на Bothost.
Баны
Единственное место, когда мы оставляем за собой право на стопкран и деанон - это бан. О бане пользователь узнает сразу. Мы не баним за щитпост, мы не баним за набросы. Мы баним только за лютую жесть и спам. Механику такого действия вы можете посмотреть в проекте самостоятельно
Как посмотреть код
Добро пожаловать на анонимное зеркало гитхаба. Там вы можете следить за обновлениями бота, посмотреть его устройство, провести аудит. Мы открыты к предложениям. Если вы считаете, что мы где-то палим пользователя - пожалуйста, сообщите - мы как можно быстрее закроем эту дыру.
Возможно, бот будет обрастать новыми функциями, о них так же будет сообщено
https://anonymous.4open.science/r/CKM_BOT-318B/README.md