Telegram бот для решения математических задач на Python

    В этой статье мы подробно разберём код Telegram бота на Python, который помогает пользователям решать математические задачи из первой части ЕГЭ. Бот использует библиотеку pyTelegramBotAPI для взаимодействия с Telegram и SQLite для хранения заданий с изображениями и ответами. Вы узнаете, как настроить инлайн-кнопки, создать базу данных и обрабатывать пользовательские запросы.

    Структура и функциональность бота

    Код состоит из нескольких ключевых блоков: инициализация бота, обработка команды /start, создание таблицы в SQLite, функция вставки задачи и обработчик колбэков. Рассмотрим каждый этап.

    Подключение библиотек и запуск бота

    Первым делом импортируются необходимые модули: telebot для работы с Telegram API, sqlite3 для базы данных, os для работы с путями файлов и types для создания кнопок. Затем создаётся экземпляр бота с токеном:

    import telebot
    import sqlite3
    import os
    from telebot import types
    
    botTimeWeb = telebot.TeleBot('токен')

    Важно заменить 'токен' на реальный токен вашего бота, полученный от BotFather.

    Обработка команды /start

    Когда пользователь отправляет команду /start, бот приветствует его и предлагает начать занятия. Для этого используется инлайн-кнопка с callback_data='yes':

    @botTimeWeb.message_handler(commands=['start'])
    def startBot(message):
        first_mess = f"{message.from_user.first_name} {message.from_user.last_name}, Привет! Ты готов начать заниматься?"
        markup = types.InlineKeyboardMarkup()
        button_yes = types.InlineKeyboardButton(text='Да', callback_data='yes')
        markup.add(button_yes)
        botTimeWeb.send_message(message.chat.id, first_mess, parse_mode='html', reply_markup=markup)

    Создание базы данных SQLite

    Внутри этой же функции выполняется подключение к базе данных и создание таблицы math_tasks. Таблица содержит три поля: id (автоинкремент), task_image (BLOB для хранения изображения) и answer_text (текстовый ответ):

    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS math_tasks (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        task_image BLOB NOT NULL,
        answer_text TEXT NOT NULL
    )
    ''')
    conn.commit()
    conn.close()

    Путь к файлу базы данных формируется динамически с помощью os.path.join, что делает код переносимым между разными операционными системами.

    Функция вставки задачи

    Для добавления новых заданий в базу используется функция insert_task. Она принимает путь к изображению и текст ответа, читает изображение в бинарном формате и выполняет SQL-запрос INSERT:

    def insert_task(image_path, answer_text):
        try:
            with open(image_path, 'rb') as file:
                image_blob = file.read()
            conn = sqlite3.connect(db_path)
            cursor = conn.cursor()
            cursor.execute('''
            INSERT INTO math_tasks (task_image, answer_text)
            VALUES (?, ?)
            ''', (image_blob, answer_text))
            conn.commit()
            conn.close()
            print("Задача успешно добавлена.")
        except Exception as e:
            print(f"Ошибка при вставке задачи: {e}")

    В примере добавляется задача с изображением scale_1200.png и ответом 38,75. Вы можете изменить эти параметры под свои нужды.

    Обработка нажатия кнопок

    Когда пользователь нажимает кнопку «Да», бот спрашивает, какой номер задачи решить, и показывает инлайн-кнопки с цифрами от 1 до 12. Это реализовано через callback_query_handler:

    @botTimeWeb.callback_query_handler(func=lambda call: True)
    def response(call):
        if call.message:
            if call.data == "yes":
                second_mess = "Какой номер ты хочешь решить из первой части?"
                markup = types.InlineKeyboardMarkup()
                buttons = [
                    types.InlineKeyboardButton(text=str(i), callback_data=str(i)) for i in range(1, 13)
                ]
                markup.add(*buttons)
                botTimeWeb.send_message(call.message.chat.id, second_mess, reply_markup=markup)
                botTimeWeb.answer_callback_query(call.id)

    Обратите внимание, что для корректной работы необходимо вызвать answer_callback_query, чтобы уведомить Telegram об обработке callback.

    Запуск и тестирование бота

    В конце кода используется botTimeWeb.infinity_polling(), который запускает бота в режиме постоянного опроса сервера. Убедитесь, что все зависимости установлены (pyTelegramBotAPI, sqlite3 встроен в Python). При первом запуске будет создана база данных и таблица, после чего можно добавлять задачи и тестировать взаимодействие.

    Возможные улучшения и расширения

    Текущая реализация - отличная основа для более сложного бота. Вы можете добавить:

    • Отправку изображения задачи из базы данных при выборе номера.
    • Проверку ответа пользователя и вывод статистики.
    • Админ-панель для добавления задач через самого бота.
    • Логирование действий пользователей в отдельную таблицу.

    Этот код демонстрирует, как легко интегрировать Telegram API с SQLite для создания интерактивных образовательных инструментов.

    Часто задаваемые вопросы