Как работает наш бот

Как работает наш бот

Редакция гримерки

Зачем нужна эта статья

Большинство сообществ, использующих кастомных ботов для "анонимок" - не утруждают себя в том, чтобы доказать доверившимся людям, что их сообщения действительно анонимны.

Учитывая подорванное доверие к таким сообществам, мы посчитали нужным раскрыть внутреннюю кухню и наглядно продемонстрировать, как мы обрабатываем ваши анонимки, и почему мы заявляем, что они анонимны.


Как работает бот

Логика максимально простая для пользователя и прозрачная для админов.

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


Report Page