← Все вопросы

Где боту хранить данные пользователей (баллы, ответы)?

Задан 25 месяцев назад543 просмотров2 ответа
6

Делаю бота-викторину, он должен помнить, сколько баллов набрал каждый пользователь. Сейчас храню в обычной переменной-словаре, но после перезапуска бота всё обнуляется. Как сохранять данные по-нормальному?

2 ответа

10
✓ Принятый ответ — помог автору

Переменная живёт только пока работает программа, поэтому после перезапуска данные теряются. Для учебного бота простейший надёжный вариант — сохранять словарь в JSON-файл.

import json
import os

DATA_FILE = "scores.json"

def load_scores():
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, encoding="utf-8") as f:
            return json.load(f)
    return {}

def save_scores(scores):
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(scores, f, ensure_ascii=False)

scores = load_scores()

@dp.message(Command("win"))
async def win(message: Message):
    uid = str(message.from_user.id)
    scores[uid] = scores.get(uid, 0) + 1
    save_scores(scores)
    await message.answer(f"Твои баллы: {scores[uid]}")

Ключ — message.from_user.id (уникальный номер пользователя), приводи его к строке, потому что в JSON ключи всегда строки. Теперь данные переживают перезапуск.

4

JSON хорош, пока пользователей немного. Когда их станут тысячи и данные сложнее (история, связи), переходи на базу — для бота обычно берут SQLite (встроена в Python, файл *.db). Но не усложняй раньше времени: для викторины в классе JSON-файла за глаза.

Ваш ответ

Войдите, чтобы ответить на вопрос.