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 для создания интерактивных образовательных инструментов.