Где боту хранить данные пользователей (баллы, ответы)?
Делаю бота-викторину, он должен помнить, сколько баллов набрал каждый пользователь. Сейчас храню в обычной переменной-словаре, но после перезапуска бота всё обнуляется. Как сохранять данные по-нормальному?
2 ответа
Переменная живёт только пока работает программа, поэтому после перезапуска данные теряются. Для учебного бота простейший надёжный вариант — сохранять словарь в 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 ключи всегда строки. Теперь данные переживают перезапуск.
JSON хорош, пока пользователей немного. Когда их станут тысячи и данные сложнее (история, связи), переходи на базу — для бота обычно берут SQLite (встроена в Python, файл *.db). Но не усложняй раньше времени: для викторины в классе JSON-файла за глаза.