Бот Telegram для пиццерии на Python с помощью telebot

от автора

Вступление

На Хабре уже есть статья о Telegram боте, написанном на Python с помощью telebot. Признаться, свое знакомство с чат-ботами в недавно разблокированном мессенджере я начинал с этой статьи. Моя писанина — это дополнение, включающее в себя работу с Inline кнопками и базой данных.

Установка библиотеки

Telebot — библиотека для взаимодействия с Telegram API, которая привлекла меня простотой, поэтому я считаю, что для новичков она подходит на все 100%.

Чтобы установить библиотеку, введите в терминале следующую команду.

pip install pytelegrambotapi

Получение API-токена

Чтобы создать бота, обратимся к "отцу" всех ботов — @BotFather. Отправьте команду /newbot, после чего введите имя бота, затем алиас, оканчивающийся на bot.

image

Пишем код

Лучше записывать 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/7 if __name__ == '__main__':     bot.polling(none_stop=True)

Мы создали эхо-бота. Подумаем, что будет в нашем боте:

  • База данных. В ней храним информацию по пользователям, а также создадим таблицу для хранения информации о пицце. Для взаимодействия с БД лучше написать отдельные классы — для пользователя и пиццы.
  • Клавиатуры. Помогут сделать интерфейс удобным. 
  • Оплата. Для этого будем использовать сервис QIWI.

База данных

Я пользуюсь SQLiteStudio для создания баз данных.

Структура таблицы для пользователя

  • id — уникальный идентификатор пользователя. Таким выступает id пользователя в мессенджере, поэтому без зазрения совести будем использовать его.
  • stat — статус работы с ботом. Запоминаем на каком шаге остановился пользователь.
  • ord. Здесь мы в виде строки храним заказ пользователя. Пока я не представляю как сделать по-другому, поэтому предлагайте идеи в комментариях.
  • random_code. В будущем будем генерировать рандомный код для оплаты через QIWI.
  • time. Пользователь выбирает, когда хочет получить заказ, а мы сохраняем в это поле.

Структура таблицы для пиццы

Данные по пиццам:

По name получаем описание пиццы и её стоимость.Осталось добавить фотографию. Создадим директорию data, поместим в нее img, а уже там будут храниться изображения.

Классы для взаимодействия с базой данных

Так, базу данных создали, теперь приступим к классам. Создадим файл user.py, в нём класс User. Сначала напишем пару функций для подключения к базе данных и закрытию соединения.

# Подключаем библиотеку import sqlite3  class 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 sqlite3  class 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. Спасибо за внимание!

ссылка на оригинал статьи https://habr.com/ru/post/507840/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *