Вступление
На Хабре уже есть статья о Telegram боте, написанном на Python с помощью telebot. Признаться, свое знакомство с чат-ботами в недавно разблокированном мессенджере я начинал с этой статьи. Моя писанина это дополнение, включающее в себя работу с Inline кнопками и базой данных.
Установка библиотеки
Telebot библиотека для взаимодействия с Telegram API, которая привлекла меня простотой, поэтому я считаю, что для новичков она подходит на все 100%.
Чтобы установить библиотеку, введите в терминале следующую команду.
pip install pytelegrambotapi
Получение API-токена
Чтобы создать бота, обратимся к "отцу" всех ботов @BotFather.
Отправьте команду /newbot
, после чего введите имя
бота, затем алиас, оканчивающийся на bot.

Пишем код
Лучше записывать API-токены, номера кошелька и тому подобное в отдельный файл, поэтому создадим файл config.py:
TOKEN = "1176585885:AAH-RA2kZym9E5tR8JFLtYYjNxrMHnsJr0o"
Основной код находится в bot.py
# импорт библиотекиimport telebot# Подтягиваем токен бота и все необходимое для получение средств за пиццуfrom config import TOKEN# Создание ботаbot = telebot.TeleBot(TOKEN)# Декоратор для обработки всех текстовых сообщений@bot.message_handler(content_types=['text'])def all_messages(msg): # Получаем сообщение пользователя message = msg.text # Получаем Telegram id пользователя (очевидно, для каждого пользователя он свой) user_id = msg.chat.id # Отправляем сообщение bot.send_message(user_id, f"Вы написали: {message}")# Запускаем бота, чтобы работал 24/7if __name__ == '__main__': bot.polling(none_stop=True)
Мы создали эхо-бота. Подумаем, что будет в нашем боте:
- База данных. В ней храним информацию по пользователям, а также создадим таблицу для хранения информации о пицце. Для взаимодействия с БД лучше написать отдельные классы для пользователя и пиццы.
- Клавиатуры. Помогут сделать интерфейс удобным.
- Оплата. Для этого будем использовать сервис QIWI.
База данных
Я пользуюсь SQLiteStudio для создания баз данных.
Структура таблицы для пользователя
- id уникальный идентификатор пользователя. Таким выступает id пользователя в мессенджере, поэтому без зазрения совести будем использовать его.
- stat статус работы с ботом. Запоминаем на каком шаге остановился пользователь.
- ord. Здесь мы в виде строки храним заказ пользователя. Пока я не представляю как сделать по-другому, поэтому предлагайте идеи в комментариях.
- random_code. В будущем будем генерировать рандомный код для оплаты через QIWI.
- time. Пользователь выбирает, когда хочет получить заказ, а мы сохраняем в это поле.
Структура таблицы для пиццы
Данные по пиццам:
По name получаем описание пиццы и её стоимость.Осталось добавить фотографию. Создадим директорию data, поместим в нее img, а уже там будут храниться изображения.
Классы для взаимодействия с базой данных
Так, базу данных создали, теперь приступим к классам. Создадим файл user.py, в нём класс User. Сначала напишем пару функций для подключения к базе данных и закрытию соединения.
# Подключаем библиотекуimport sqlite3class User: # Функция для соединения с БД def connect_to_db(self): self.connect = sqlite3.connect('PizzaApplication.db') self.cursor = self.connect.cursor() # Закрываем соединение с БД def close(self): self.connect.close()
Бота открыл пользователь, которого мы не знаем. Поэтому нужны функции добавления нового юзера и получения всех пользователей. Второе нужно для того, чтобы проверять наличие каждого написавшего "/start" в БД.
# Получаем id всех пользователей, позже будем проверять наличие пользователя в этом списке def get_all_id(self): self.connect_to_db() request = "SELECT id FROM user" result = self.cursor.execute(request).fetchall() self.close() return [i[0] for i in result] # Добавляем нового пользователя def add_id_to_db(self, user_id): self.connect_to_db() request = "INSERT INTO user(id, stat) VALUES(?, ?)" self.cursor.execute(request, (user_id, "start")) self.connect.commit() self.close()
Для получения и обновления данных можно написать по две функции на каждое из полей, но я предлагаю поступить по-другому. Структура таких функций будет идентичная, за исключением названия столбца, поэтому в функцию будем передавать поле.
# Получаем заданное поле по пользователю def get_field(self, user_id, field): self.connect_to_db() request = f"SELECT {field} FROM user WHERE id=?" result = self.cursor.execute(request, (user_id,)).fetchone() self.close() return result[0] # Меняем значение поля def set_field(self, user_id, field, value): self.connect_to_db() request = f"UPDATE user SET {field}=? WHERE id=?" self.cursor.execute(request, (value, user_id)) self.connect.commit() self.close()
Основные функции для пользователя написаны. Позже будем возвращаться к этому классу, а пока приступим к пицце. Создадим файл pizza.py, в нём класс Pizza. Начальные функции такие же, как у User.
import sqlite3class Pizza: # Подключение к базе данных def connect_to_db(self): self.connect = sqlite3.connect('PizzaApplication.db') self.cursor = self.connect.cursor() # Закрытие базы данных def close(self): self.connect.close()
Нужно получать данные из БД.
def get_field(self, pizza_name, field): self.connect_to_db() request = f"SELECT {field} FROM pizza WHERE name=?" result = self.cursor.execute(request, (pizza_name,)).fetchone() self.close() return result[0]
Для админ-панели потребуется функция set_field (подобная есть в классе User), но её я пока не предусмотрел.
В следующей статье разберём клавиатуры и начнём писать код в bot.py. Спасибо за внимание!