Собираем Бот-Памятку (JSON)

Ты умеешь сохранять словарь в файл и читать обратно. Соберём из этого Бот-Памятку: бот спросит имя, запишет его на диск и будет встречать тебя по имени даже после перезапуска. Это артефакт модуля и первый бот, который по-настоящему тебя помнит.

После урока сможешь: объяснить тему «Собираем Бот-Памятку (JSON)» и выполнить связанный с ней учебный шаг без подсказки.

Иллюстрация: бот помнит — робот с блокнотом и облачком-воспоминанием

Две функции-помощника

Загружать и сохранять память придётся часто, вынесем это в две маленькие функции. Заодно решим проблему «файла ещё нет».

import json

def zagruzit():
    try:
        with open("pamyat.json", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return {}

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

Функция zagruzit пытается прочитать файл. Есть файл — возвращает словарь из него. Нет файла — ловит FileNotFoundError и возвращает пустой словарь {}. Это аккуратное начало с чистого листа на первом запуске. sohranit просто пишет словарь в файл.

Бот, который помнит имя

import telebot
import json
from config import TOKEN

bot = telebot.TeleBot(TOKEN)

def zagruzit():
    try:
        with open("pamyat.json", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return {}

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

@bot.message_handler(commands=['start'])
def start(message):
    pamyat = zagruzit()
    user = str(message.chat.id)
    if user in pamyat:
        bot.send_message(message.chat.id, f"С возвращением, {pamyat[user]}!")
    else:
        bot.send_message(message.chat.id, "Привет! Как тебя зовут? Напиши имя.")

@bot.message_handler(func=lambda message: True)
def zapomnit(message):
    pamyat = zagruzit()
    user = str(message.chat.id)
    pamyat[user] = message.text
    sohranit(pamyat)
    bot.send_message(message.chat.id, f"Запомнил, {message.text}! Теперь не забуду даже после перезапуска.")

bot.infinity_polling()

Заметил str(message.chat.id)? У формата JSON правило: ключи только строки. А chat.id это число. Поэтому превращаем его в строку через str(...), иначе при сохранении будет путаница. Мелочь, на которой спотыкаются многие.

Главная проверка

Запусти бота, назови ему имя. Потом останови программу совсем (Ctrl+C) и запусти заново. Напиши /start. Бот встретит тебя по имени. Раньше перезапуск стирал всё, теперь бот помнит. Имя лежит в файле pamyat.json, можешь открыть и убедиться.

Контрольный вопрос. Функция zagruzit пытается открыть файл, а если его ещё нет — ловит ошибку ____ и возвращает пустой словарь. Напиши имя ошибки.

Подсказка: try/except на случай «файла ещё нет».

Онлайн-проверка ответа появится позже

Задание. Собери Бот-Памятку: функции zagruzit и sohranit, память об имени. Назови боту имя, перезапусти программу, напиши /start, убедись что помнит. Прокачай: добавь память о лучшем счёте и показывай рекорд при старте. Пришли видео или скриншоты, где бот встречает тебя по имени после перезапуска.

Подсказка: На /start читаем pamyat и здороваемся по имени, если оно есть. Любой текст сохраняем как имя. Ключ — str(chat.id).

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Зачёт, если:
✅ бот запускается без красных ошибок;
✅ бот запомнил имя и после полного перезапуска (Ctrl+C → запустить заново) встречает тебя по имени;
✅ проверено на твоём боте;
✅ прислано видео или скриншот, где бот встречает по имени после перезапуска.

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

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева