Бот: @membrane_chat_bot
Membrane-chat - это простой способ найти новые знакомства и общение в своём окружении. Разместите пригласительную ссылку в группе или канале, или QR-код на видном месте где его заметят (в лифте около кнопок, около домофона и т.д.).
Слоган: "Membrane Chat - твой собственный анонимный чат!"
Чат представляет из себя телеграм-бот для анонимного общения «один на один» внутри изолированных групп — мембран, доступ к которым осуществляется по уникальному 20-символьному ключу. Перед началом общения пользователь настраивает пол и предпочтения по собеседнику, после чего попадает в очередь поиска внутри выбранной мембраны. Сообщения пересылаются в обезличенном виде, без сохранения истории. Мембраны и профили автоматически удаляются через 7 дней неактивности. Ключи генерируются/восстанавливаются по принципу «ключ — это всё»: система хранит только активные мембраны, а сами ключи находятся исключительно у пользователей, что обеспечивает децентрализацию и отсутствие административной нагрузки.
- Разрешены: текст, emoji, стикеры, GIF, голосовые сообщения (только прямые, не пересланные)
- Запрещены: фото, видео, видео-сообщения (video notes), контакты, геолокация, файлы любого типа.
- Стек: Python 3.11+, Redis, Docker
- Хранилище: Все данные хранятся временно в Redis и удаляются при неактивности
- Формат: 20 символов (A-Z, a-z, 0-9), визуально группируется как
xxxxx-xxxxx-xxxxx-xxxxx - Пространство ключей: ≈7.0×10³⁵ уникальных комбинаций
- Вероятность коллизии: Практически нулевая (≤7.14×10⁻²⁵% при 1 млн ключей)
- Атака на коллизии: Для достижения 50% вероятности потребуется создавать 1 млрд ключей/день в течение 6000 лет
- Лимит создания: создание/возобновление 1 мембраны в час на пользователя
- TTL мембран: Автоматическое удаление через 168 часов (7 дней) неактивности
- TTL профилей: Удаление через 7 дней без активности
- Ежедневная очистка: Автоматическое удаление "мертвых" мембран и не активных профилей
- Redis хранит только: Активные сессии, активные мембраны, профили с TTL
- Не хранится: История сообщений, архив ключей, метаданные переписки
- Полная анонимность: Сообщения пересылаются без идентификаторов отправителя
- Децентрализованное хранение: Ключи хранятся у пользователей (сохраненные сообщения, заметки и т.д.)
- Доступность: Любой пользователь может использовать любой корректный по формату ключ для входа в комнату.
- Возобновление: Восстановление пользователем мембраны которая ранее была удалена из системы
- Глубокие ссылки: Поддержка deep-link для удобного приглашения
- QR-коды: Генерация QR-кодов для быстрого доступа
- Единовременное присутствие: Пользователь может находиться только в одной мембране одновременно
- Ключ = пароль: Храните ключи как конфиденциальную информацию
- Не публикуйте открыто: Избегайте публикации ключей в общих чатах/каналах
- Ротация ключей: При компрометации создайте новую мембрану
- Естественный цикл: Неиспользуемые ключи автоматически освобождаются через неделю
- Нет единой точки отказа: Ключи распределены между пользователями
- Нет административного доступа: Невозможно принудительно удалить или изменить чужую мембрану
- Самоочищение: Система автоматически освобождает ресурсы
- Масштабируемость: Количество активных ключей = количеству мест активности пользователей
- Нулевая административная нагрузка — не нужно управлять ключами вручную
- Естественная безопасность — ключи живут только пока их помнят и используют
- Математическая надежность — коллизии практически невозможны
- Простота понимания — пользователи интуитивно понимают модель "ключ-пароль"
- Автоматическое восстановление ресурсов — неактивные ключи освобождаются системой
Пользователи (TTL = 7 дней с момента последнего использования):
- Telegram ID
- Указанный пол
- Предпочтение по полу собеседника
- Время последней активности
Мембраны (TTL = 7 дней с момента последнего успешного match’а):
- 20-символьный ключ (алфавит: A–Z, a–z, 0–9)
- Формат ключа:
xxxxx-xxxxx-xxxxx-xxxxx(визуальное разделение на 4 блока по 5 символов; в Redis хранится как единая строка из 20 символов). - Время последнего match’а
- Пользователь должен настроить профиль (пол и предпочтения) перед поиском собеседника.
- Можно находиться только в одной мембране одновременно.
- Лимит: не более 1 мембраны в час на пользователя (общее количество — не ограничено).
- При подключении к новой мембране через deep-link из другой мембраны требуется подтверждение выхода.
1. Главное меню (/start)
- Приветственное сообщение с описанием возможностей
- Кнопки: "Поиск собеседника", "Профиль", "Создать мембрану", "Выйти из мембраны"
2. Настройка профиля (/profile)
- Текущие настройки: пол, предпочтения по полу, текущая мембрана
- Инлайн-кнопки для выбора пола (мужской/женский)
- Инлайн-кнопки для выбора предпочтений (мужской/женский/любой)
3. Создание мембраны (/create)
- QR-код мембраны (размер 400×400 px)
- Ключ мембраны в формате
xxxxx-xxxxx-xxxxx-xxxxx - Инлайн-кнопка "Пригласить" с deep-link
4. Состояние поиска
- Статус "Ищем собеседника..."
- Кнопка "Отменить поиск"
- Таймер ожидания
5. Активный диалог
- Индикатор "Диалог активен"
- Кнопки: "Следующий собеседник", "Завершить диалог"
- Автоматическое получение и отправка сообщений
6. Пустая мембрана (когда собеседник вышел)
- Уведомление "Собеседник покинул диалог"
- Кнопки: "Искать снова", "Выйти из мембраны"
7. Подтверждение выхода (при подключении по deep-link)
- Запрос подтверждения при переходе в новую мембрану
- Уведомление о потере текущего диалога/поиска
- Кнопки: "Выйти и перейти", "Остаться"
- Автоматический переход после подтверждения
Общие команды:
/start— главное меню или перезапуск/start <ключ>— подключение к мембране по ключу/help— справка по командам
Команды профиля:
/profile— просмотр и настройка пола и предпочтений
Команды мембран:
/create— создать новую мембрану (автовход)/exit— выйти из текущей мембраны
Команды чата:
/search— начать поиск собеседника в текущей мембране/next— завершить диалог и вернуться в поиск/stop— выйти из диалога без возврата в очередь
Ограничения доступа:
/search— доступна только в мембране, но не в диалоге/next,/stop— доступны только в активном диалоге/create— недоступна при нахождении в другой мембране
Интерфейс использует Reply-клавиатуры для основных действий и Inline-кнопки для настроек. Все сообщения лаконичные, без лишней информации.
membrane-chat/
│
├── bot/
│ ├── config.py # Конфигурация (переменные окружения)
│ ├── handlers.py # Обработчики команд и сообщений
│ ├── keyboards.py # Клавиатуры и кнопки
│ ├── logger.py # Настройка логгера
│ ├── main.py # Запуск приложения
│ ├── redis.py # Клиент Redis
│ ├── repositories.py # Работа с данными (Redis CRUD)
│ ├── services.py # Бизнес-логика
│ └── utils.py # Вспомогательные утилиты
│
├── docker-compose.yml
├── requirements.txt
└── README.md/start— запуск/перезапуск бота/start <ключ>— подключение к мембране/help— справка по командам
/profile— настройка пола и предпочтений
/create— создать новую мембрану и войти в неё/exit— выйти из текущей мембраны (прерывает диалог и поиск)
/search— начать поиск собеседника (если не в диалоге)/next— завершить текущий диалог и вернуться в поиск/stop— просто выйти из диалога без возврата в очередь
Очистить и перезапустить бота:
docker-compose down -v;docker-compose up -d; python -m bot.main- Установить зависимости проекта:
pip install -r requirements.txt- Запустить Redis через Docker:
docker-compose up -d- Запустить бота:
docker-compose up -d; python -m bot.mainpython -m bot.main- Остановить бота:
docker-compose downdocker-compose down -v- Проверка статуса контейнеров:
docker-compose psdocker psdocker-compose exec redis redis-cli pingdocker statsКаждый раз, когда меняешь код, ты делаешь:
Просто перезапуск
docker-compose down;docker-compose up -d --buildПерезапуск с логами
docker-compose down;docker-compose up -d --build;docker-compose logs -fПерезапуск с логами и очисткой redis
docker-compose down -v;docker-compose up -d --build;docker-compose logs -fПлюсы:
- Просто.
- Всегда гарантированно работает.
Минусы:
- Бот делает перезапуск (1–3 секунды).
- Пользователь, который как раз писал сообщение → может получить «бот не отвечает».
Для разработки вполне ок 👍
Redis не нужно трогать, он хранит данные. Можно пересобрать только бот — без разрушения сети/томов:
docker-compose build bot;docker-compose up -d bot;docker-compose logs -fПлюсы:
- Redis не перезапускается (данные сохранены).
- Бот будет перезапущен быстрее.
Минусы:
- Всё ещё небольшая пауза в работе.
# Через docker-compose
docker-compose logs -fНадо делать:
- Добавить возможность опционально генерировать qr-код или не генерировать
- Добавить возможность добавлять своё изображение для обложки приглашения
- Добавить что пользователь может не указывать пол - будет пол по умолчанию - "Не указан". Будет соединяться с теми - кому пол "Не важен".
- Добавить подключение к мембране по умолчанию что бы пользователь мог ознакомиться с функционалом и возможностями. - это хорошая идея велком мембраны в канале мембрана чата
- При подключении к мембране сразу запускается поиск в ней, не надо — останавливаем поиск