Бот-викторина «Своя игра» для Telegram и ВКонтакте. Задаёт вопросы из базы, проверяет ответы с опечатками через нечёткое сравнение, хранит вопросы и текущее состояние игроков в Redis.
| Telegram | VKontakte |
![]() |
![]() |
-
🐍 Python 3.8 – 3.10 (более новые версии не тестировались). Версию можно узнать командой:
python --version
-
🟥 Redis (локально или удалённо).
Проверить, что запущен:
redis-cli ping # → PONG
-
🔑 Telegram Bot Token: инструкция по регистрации бота доступна здесь. Пример токена:
958423683:AAEAtJ5Lde5YYfkjergber. -
🔑 VK Bot Token — инструкция ниже.
Создайте группу в ВКонтакте.
Включить сообщения: Управление сообществом → Сообщения → Сообщения сообщества: Включены.

Включить Long Poll: Управление сообществом → Дополнительно → Работа с API → Long Poll API.
Переключатель в положение «Включено», версию API выберите свежую.

Выбрать типы событий: Там же, на вкладке «Типы событий», поставьте галочку напротив «Входящие сообщения» (message_new).
Включить возможности ботов: Управление сообществом → Сообщения → Настройки для бота → «Возможности ботов»: Включены.
Без этого клавиатура и часть методов будут падать с ошибкой [912].

Создать токен: На вкладке «Ключи доступа» нажмите «Создать ключ» и дайте ему права на сообщения. Этот токен вставьте в переменную VK_BOT_TOKEN.

📦 Установите зависимости:
pip install -r requirements.txt⚙️ Настройте переменные окружения.
Создайте файл .env в корне проекта:
TG_BOT_TOKEN=ваш_токен_телеграм_бота
VK_BOT_TOKEN=ваш_токен_вконтакте
REDIS_URL=redis://localhost:6379/0В папке quiz-questions/ лежат .txt-файлы в кодировке KOI8-R.
Формат блока:
Вопрос 1:
Текст вопроса?
Ответ:
Текст ответа.
Комментарий:
Необязательный комментарий для ведущего.
Блоки разделяются пустой строкой. Парсер:
- склеивает переносы внутри блока,
- вырезает пометки
[чтецу ...],[ведущему ...], - обрезает ответ до первого предложения,
- убирает дубли по «отпечатку» (регистр, пунктуация,
ё/е).
Если у вас UTF-8 вместо KOI8-R — перекодируйте файлы или поменяйте encoding в questions.load_quiz.
После первого запуска (и при изменении .txt) базу надо залить в Redis:
python load_quiz_to_redis.py
# → Залито вопросов: 300000Проверка:
redis-cli LLEN quiz:questions
# → 300000Без этого шага боты ответят «База пуста».
Telegram-бот:
python tg_bot_quiz.pyVK-бот:
python vk_bot_quiz.pyОба бота можно запускать одновременно — они независимы и используют разные префиксы ключей в Redis (tg: и vk:).
- /start — приветствие и клавиатура.
- Новый вопрос — бот задаёт вопрос.
- Ответ текстом — бот сравнит с правильным:
- «Правильно!» — если совпало (или почти).
- «Близко! Попробуй ещё раз.» — если похоже, но не точно.
- «Неверно. Правильный ответ: …» — если мимо.
- Сдаться — бот покажет правильный ответ.
- Мой счёт — пока заглушка.
-
Вопросы хранятся в Redis, ключ
quiz:questions. Бот достаёт случайный вопрос из Redis, не загружая базу в память. -
Каждый игрок имеет свой текущий вопрос, он хранится в Redis:
tg:user:<id>:current_question / current_answer (для Telegram) vk:user:<id>:current_question / current_answer (для VK) -
Проверка ответа —
rapidfuzz.token_sort_ratio:≥ 80→correct(верно)≥ 50→close(близко)- иначе →
wrong(неверно)
MIT License
Код написан в образовательных целях на онлайн-курсе для разработчиков dvmn.org.

