Промокоды
Промокоды позволяют выдавать доступ пользователям без привязки к Telegram-боту. Администратор генерирует коды, пользователь вводит код на странице авторизации — и сразу получает доступ.
Три режима авторизации
| Режим | Описание |
|---|---|
| Telegram | Стандартный — пользователь отправляет код боту, админ одобряет |
| Без авторизации | TG auth отключен в конфиге — доступ открыт всем |
| Промокоды | Альтернатива без TG — пользователь вводит промокод P-XXXXXX |
Все три режима могут работать одновременно: на странице авторизации отображается и код для Telegram-бота, и поле для промокода.
Генерация промокодов
Через админ-панель
В разделе 🎫 Промокоды (вкладка «Управление» → «Промокоды») доступна генерация и управление промокодами:
| Параметр | Описание | По умолчанию |
|---|---|---|
| Количество | Сколько кодов сгенерировать (1-100) | 1 |
| Срок доступа | На сколько дней выдаётся доступ | 30 |
| Использования | Сколько раз можно использовать код (1 = одноразовый) | 1 |
| Срок действия кода | Через сколько часов код перестанет работать (0 = бессрочный) | 0 |
Через API
# Сгенерировать 5 одноразовых кодов на 30 дней
curl -X POST "https://сервер/{admin_path}/api/promo" \
-H "Content-Type: application/json" \
-d '{"action":"generate","count":5,"days":30,"max_uses":1}'
# Сгенерировать многоразовый код на 90 дней (до 10 использований), действует 48 часов
curl -X POST "https://сервер/{admin_path}/api/promo" \
-H "Content-Type: application/json" \
-d '{"action":"generate","count":1,"days":90,"max_uses":10,"valid_hours":48}'
# Получить список всех промокодов
curl "https://сервер/{admin_path}/api/promo"
# Удалить промокод
curl -X POST "https://сервер/{admin_path}/api/promo" \
-H "Content-Type: application/json" \
-d '{"action":"delete","code":"P-ABC123"}'Активация промокода
На странице авторизации
- Пользователь открывает Lampa и видит страницу авторизации
- Внизу страницы — блок «Или введите промокод»
- Вводит код формата
P-XXXXXXи нажимает Активировать - Доступ выдаётся мгновенно — без ожидания одобрения администратора
В Lampa-приложении (внешний плагин)
Аналогично: экран авторизации показывает поле промокода под основным кодом для бота.
Через API
curl -X POST "https://сервер/tg/auth/promo" \
-H "Content-Type: application/json" \
-d '{"code":"P-ABC123"}'Ответ при успехе:
{
"ok": true,
"token": "uuid-токен",
"days": 30
}Типы промокодов
Одноразовый (max_uses: 1)
Классический промокод — один код = один пользователь. Подходит для:
- Раздача друзьям
- Продажа доступа
- Приглашения
Многоразовый (max_uses: N)
Один код можно использовать N раз. Подходит для:
- Массовое приглашение (например, код для чата)
- Ограниченная акция
Безлимитный (max_uses: 0)
Код можно использовать неограниченное число раз. Подходит для:
- Публичный доступ с контролем (код можно отозвать в любой момент)
- Тестирование
Формат кода
Промокоды имеют формат P-XXXXXX, где X — буквы и цифры (без I и O для избежания путаницы). Префикс P- отличает промокоды от 6-значных кодов авторизации.
Защита от брутфорса
Endpoint активации промокодов (/tg/auth/promo) защищён от перебора:
| Попыток за 5 мин | Реакция |
|---|---|
| 1–4 | Обычный ответ |
| 5–9 | Задержка 2 сек перед ответом (throttle) |
| 10+ | Автоматический бан IP |
При срабатывании бана:
- IP добавляется в список блокировок с причиной «Brute-force промокодов: N попыток за 5 мин»
- Все дальнейшие запросы с этого IP возвращают
403 Forbidden - Бан виден в админке → можно разбанить вручную
- В логах сервера:
promo: IP banned for brute-force
Успешная активация промокода сбрасывает счётчик неудачных попыток.
Хранение
Промокоды хранятся в файле database/tgauth/promo_codes.json в директории сервера.