В этой статье я покажу, как сделать Telegram-бота для онлайн-магазина на Python, который позволяет пользователям просматривать каталог товаров, добавлять их в корзину и оформлять заказы. Мы также рассмотрим, как интегрировать платежи и работать с базой данных для хранения информации о товарах и корзинах пользователей.
Шаг 1: Установка необходимых инструментов и библиотек
Для создания Telegram-бота для онлайн-магазина на Python нам понадобятся несколько ключевых инструментов и библиотек.
В этом шаге мы рассмотрим, какие именно библиотеки понадобятся, как их установить и что нужно проверить перед началом работы.
Требования к окружению
Убедитесь, что у вас установлен Python версии 3.7 или выше.
Вы можете проверить версию Python, выполнив следующую команду в терминале:
python --versionЕсли Python не установлен или версия ниже 3.7, скачайте и установите последнюю версию Python с официального сайта python.org.
Настройка виртуального окружения
Для удобства и изоляции проекта рекомендуется использовать виртуальное окружение. Виртуальное окружение позволяет создавать отдельную область, где будут установлены необходимые библиотеки, что предотвращает конфликты между зависимостями разных проектов.
Создание виртуального окружения и его активация:
- 
Создание виртуального окружения: python -m venv venvЗдесь venv— это название папки, в которой будет храниться ваше виртуальное окружение. Вы можете выбрать другое название, если хотите.
- 
Активация виртуального окружения: - 
На Windows: .\\venv\\Scripts\\activate
- 
На macOS и Linux: source venv/bin/activate
 После активации виртуального окружения вы увидите префикс (venv)в начале командной строки.Установка необходимых библиотекМы будем использовать несколько Python-библиотек для создания бота, работы с базой данных и управления переменными окружения. Эти библиотеки можно установить с помощью pip— менеджера пакетов Python.- python-telegram-bot - Это основная библиотека для взаимодействия с API Telegram. 
- SQLAlchemy - ORM библиотека для работы с базами данных. Она позволяет легко создавать, читать, обновлять и удалять записи в базе данных, используя Python-код вместо SQL-запросов. 
- python-dotenv - Эта библиотека используется для загрузки переменных окружения из файла - .env. Это удобно для хранения конфиденциальной информации, такой как токены, пароли и другие данные.
 Чтобы установить эти библиотеки, выполните следующую команду в терминале: pip install python-telegram-bot sqlalchemy python-dotenvПодробности о библиотеке python-telegram-botБиблиотека python-telegram-botпредоставляет полный доступ к API Telegram и облегчает разработку ботов. Она включает обработчики команд, сообщений, inline-режим, поддержку платежей и многое другое.Подробности о SQLAlchemySQLAlchemy — мощный инструмент для работы с базами данных в Python. Он позволяет использовать Python-классы для описания структуры базы данных (модели) и автоматизировать создание и выполнение SQL-запросов. В нашем проекте мы будем использовать SQLAlchemy для хранения информации о товарах и корзине пользователей. Подробности о dotenvpython-dotenvпозволяет загружать переменные окружения из файла.env, что упрощает управление конфиденциальными данными и настройками. Этот файл будет хранить токен вашего бота, токен платежного провайдера и URL базы данных.Проверка установкиПосле установки всех библиотек рекомендуется проверить их успешную установку. Для этого можно использовать следующую команду: pip listЭта команда выведет список всех установленных пакетов, и вы должны увидеть python-telegram-bot,SQLAlchemyиpython-dotenvв этом списке.Теперь ваше окружение готово, и вы можете переходить к следующему шагу — созданию бота и настройке проекта. Шаг 2: Создание бота в TelegramПеред тем как приступить к разработке кода, вам нужно создать Telegram-бота и получить уникальный токен, который будет использоваться для взаимодействия вашего приложения с Telegram API. Для этого мы воспользуемся официальным сервисом Telegram — ботом под названием @BotFather.
- 
Шаги по созданию бота в Telegram
- Откройте Telegram. 
- 
Найдите @BotFather:- В строке поиска введите - @BotFather. Это официальный бот от Telegram, который позволяет создавать и управлять другими ботами.
- Найдите его в списке и откройте чат с ним. 
 
- 
Создание нового бота: - В чате с - @BotFatherвведите команду- /newbotи отправьте сообщение.
- @BotFatherпопросит вас ввести имя вашего бота. Имя должно быть уникальным и отражать назначение вашего бота. Например,- MyShopBotили- StoreAssistantBot.
- После того как вы введете имя, - @BotFatherпопросит вас придумать уникальное имя пользователя для вашего бота (username). Username должен оканчиваться на слово- bot(например,- myshop_botили- store_assistant_bot). Если выбранное имя уже занято,- @BotFatherпредложит вам придумать другое.
 
- 
Получение токена: - После успешного создания бота, - @BotFatherотправит вам сообщение с подтверждением и предоставит уникальный токен.
- Токен выглядит как длинная строка символов, например: - 123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210.
- Этот токен нужен для взаимодействия вашего бота с Telegram API. Сохраните его в надежном месте, так как он будет использоваться в дальнейшем для настройки бота. 
 Пример сообщения от @BotFather:Done! Congratulations on your new bot. You will find it at t.me/Amvera_Shop_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this. Use this token to access the HTTP API: 123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210. Keep your token secure and store it safely, it can be used by anyone to control your bot. For a description of the Bot API, see this page: <https://core.telegram.org/bots/api>
- 
Дополнительные настройки (по желанию): - 
Вы можете настроить описание, профильную картинку, и другие параметры вашего бота через команды, которые предлагает @BotFather. Например:- /setdescription— установить описание бота.
- /setabouttext— установить текст "О боте".
- /setuserpic— установить аватар для бота.
 
 
- 
- 
Использования токена: Токен, который вы получили, необходимо будет добавить в файл .envдля дальнейшего использования в коде. Пример содержимого файла.env:TELEGRAM_TOKEN=123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210Важные моменты:- Не делитесь своим токеном с другими людьми и не публикуйте его в открытом доступе, так как он предоставляет полный доступ к вашему боту. 
- Если вы случайно раскрыли свой токен, вы можете сгенерировать новый, используя команду - /revokeу- @BotFather.
 Теперь, когда вы создали бота и получили токен, можно переходить к следующему шагу — настройке проекта и написанию кода бота. 
Шаг 3: Настройка проекта бота магазина
В этом шаге мы настроим структуру проекта для вашего Telegram-бота, который будет использоваться как онлайн-магазин. Мы создадим необходимые файлы, организуем их правильным образом, а также подготовим конфиденциальные данные, такие как токены и URL базы данных.
1. Создание структуры проекта
Начнем с создания папки для проекта и организации файлов:
- 
Создайте папку проекта: - Выберите удобное место на вашем компьютере и создайте новую папку для проекта. Назовите её, например, - TelegramShopBot.
 Для этого можно использовать команду в терминале: mkdir TelegramShopBot cd TelegramShopBot
- 
Создайте основной файл проекта: - Внутри папки - TelegramShopBotсоздайте файл с именем- main.py. Этот файл будет содержать основной код вашего бота.
 В терминале: touch main.py
- 
Создайте файл для хранения конфиденциальной информации: - Для хранения таких данных, как токен Telegram-бота, токен платежного провайдера и URL базы данных, создадим файл - .env. Этот файл позволяет хранить конфиденциальные данные в одном месте и изолировать их от основного кода.
 В терминале: touch .env
2. Наполнение файла .env
Файл .env будет содержать переменные окружения, которые используются для настройки вашего бота. Эти переменные будут загружаться в коде с помощью библиотеки dotenv.
Откройте файл .env в любом текстовом редакторе (например, VSCode, Sublime Text, Notepad++ или встроенный редактор вашего IDE) и добавьте в него следующие строки:
# Токен вашего Telegram-бота
TELEGRAM_TOKEN=ваш_токен_бота
Токен вашего платежного провайдера
PAYMENT_PROVIDER_TOKEN=ваш_токен_платежного_провайдера
URL для подключения к базе данных SQLite
DATABASE_URL=sqlite:///shop.dbРазъяснение каждой переменной:
TELEGRAM_TOKEN
- 
Это токен, который вы получили от @BotFather. Он нужен для идентификации вашего бота в Telegram и предоставления ему доступа к Telegram API.Пример: TELEGRAM_TOKEN=123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210.
PAYMENT_PROVIDER_TOKEN
- 
- Это токен, который вы получите от вашего платежного провайдера. Он нужен для обработки платежей через Telegram. 
- Токен будет уникален для каждого платежного провайдера и его нужно запросить, следуя их инструкциям. 
 Пример: PAYMENT_PROVIDER_TOKEN=pk_live_12345abcdef.
DATABASE_URL
- 
- Это URL для подключения к базе данных. В данном случае мы используем SQLite, который создаст локальный файл базы данных - shop.dbв папке вашего проекта. SQLite удобен для небольших проектов, поскольку не требует настройки сервера базы данных.
 Пример: DATABASE_URL=sqlite:///shop.db.
3. Организация и защита .env файла
Файл .env содержит конфиденциальные данные, поэтому важно убедиться, что он не попадет в общий доступ, особенно если вы используете системы контроля версий, такие как Git.
- 
Добавьте .envв.gitignore:- Если вы используете Git для контроля версий вашего проекта, добавьте файл - .envв- .gitignore, чтобы он не был случайно закоммичен в репозиторий.
 Для этого создайте файл .gitignoreв корне проекта и добавьте в него строку:.env
Cтруктура проекта после настройки
После выполнения всех шагов, структура вашего проекта должна выглядеть примерно так:
TelegramShopBot/
│
├── .env               # Конфиденциальные данные
├── .gitignore         # Игнорируемый файл для Git
└── main.py            # Основной файл кодаТеперь, когда проект настроен и организован, мы можем перейти к следующему шагу — написанию кода для создания и управления Telegram-ботом.
Шаг 4: Настройка базы данных
В этом шаге мы настроим базу данных для хранения данных о товарах и корзинах пользователей. С помощью библиотеки SQLAlchemy мы создадим две таблицы: Item (для хранения информации о товарах) и CartItem (для хранения товаров, добавленных в корзину пользователями).
1. Настройка SQLAlchemy
SQLAlchemy — это мощная библиотека для работы с базами данных, которая позволяет использовать объектно-реляционное отображение (ORM). Это означает, что вы можете работать с базой данных через Python-объекты, а не писать SQL-запросы вручную.
Импорт необходимых модулей:
Вначале нужно импортировать все необходимые модули и настроить соединение с базой данных. Код для этого шага будет следующим:
from sqlalchemy import create_engine, Column, Integer, String, Float, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
import os- create_engine — создает объект подключения к базе данных. 
- Column, Integer, String, Float, ForeignKey — используются для определения полей в таблицах базы данных. 
- declarative_base — базовый класс для создания классов моделей. 
- sessionmaker — библиотека для создания сессий, через которые вы будете взаимодействовать с базой данных. 
- relationship — позволяет установить связи между таблицами, что упрощает работу с связанными данными. 
- os — используется для загрузки переменной окружения с URL базы данных. 
Затем создайте базовый класс для всех моделей, который будет использоваться как основа для определения таблиц базы данных:
Base = declarative_base()Далее создается движок для подключения к базе данных, используя URL, который вы указали в файле .env. Сессия используется для выполнения запросов к базе данных.
engine = create_engine(os.getenv('DATABASE_URL'))
Session = sessionmaker(bind=engine)
session = Session()- engine — это движок, который управляет соединением с базой данных. Он использует URL, который вы сохранили в переменной окружения - DATABASE_URL.
- Session — это сессия, которая открывает транзакцию с базой данных, позволяет делать запросы и фиксировать изменения. 
Теперь мы определим две модели, которые будут представлять таблицы в нашей базе данных: Item и CartItem.
Модель Item:
Эта модель представляет товар, который можно купить в магазине. Она включает поля id, name и price.
class Item(Base):
    __tablename__ = 'items'
    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True, nullable=False)
    price = Column(Float, nullable=False)- __tablename__— задает имя таблицы в базе данных.
- id— первичный ключ (уникальный идентификатор товара).
- name— название товара, уникальное для каждого товара.
- price— цена товара.
Модель CartItem:
Эта модель представляет товар, добавленный в корзину пользователя. Она включает поля id, user_id, item_id и quantity.
class CartItem(Base):
    __tablename__ = 'cart_items'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, nullable=False)
    item_id = Column(Integer, ForeignKey('items.id'), nullable=False)
    quantity = Column(Integer, default=1)
    item = relationship("Item")
- user_id— идентификатор пользователя, которому принадлежит этот элемент корзины.
- item_id— идентификатор товара, добавленного в корзину. Это поле связано с таблицей- itemsчерез- ForeignKey, что указывает на внешний ключ.
- quantity— количество единиц данного товара в корзине.
- item— это отношение, позволяющее получить объект- Item, связанный с данным элементом корзины.
Связи между таблицами:
- В - CartItemустановлена связь- item_idс- idв таблице- Item. Это позволяет автоматически подтягивать информацию о товаре, когда мы работаем с корзиной пользователя.
3. Создание таблиц в базе данных
После определения моделей, необходимо создать таблицы в базе данных. SQLAlchemy автоматически создаст таблицы на основе определенных моделей:
Base.metadata.create_all(engine)Этот вызов создаст таблицы items и cart_items в базе данных, если они еще не существуют.
Теперь, когда таблицы созданы, можно проверить, все ли работает корректно. Вы можете создать несколько товаров и добавить их в базу данных для тестирования.
# Создаем новый товар
new_item = Item(name="Sample Item", price=19.99)
session.add(new_item)
session.commit()
Проверяем, добавился ли товар
item = session.query(Item).filter_by(name="Sample Item").first()
print(item.name, item.price)Этот код создает новый товар, добавляет его в базу данных и затем выводит его название и цену.
Структура проекта после настройки базы данных
После выполнения всех шагов структура вашего проекта может выглядеть так:
TelegramShopBot/
│
├── .env               # Конфиденциальные данные
├── .gitignore         # Игнорируемый файл для Git
├── main.py            # Основной файл кода
└── shop.db            # Файл базы данных SQLiteТеперь ваша база данных настроена, и вы можете переходить к следующему шагу — написанию функционала бота, который будет взаимодействовать с этой базой данных.
Шаг 5: Создание основного кода бота
На этом этапе мы создадим основную логику бота, которая позволит пользователям взаимодействовать с онлайн-магазином через Telegram. Мы начнем с импорта необходимых модулей и создания обработчиков команд, чтобы бот мог выполнять различные действия, такие как отображение каталога товаров, добавление товаров в корзину, оформление заказа и прием платежей.
В начале файла main.py мы импортируем модули, которые будут использоваться в коде:
import os
from telegram import Update, LabeledPrice
from telegram.ext import Application, CommandHandler, MessageHandler, filters, PreCheckoutQueryHandler, ContextTypes
from dotenv import load_dotenv- os: используется для работы с операционной системой, например, для получения переменных окружения. 
- telegram: предоставляет классы для работы с объектами Telegram, такими как - Update(обновления сообщений) и- LabeledPrice(цена для платежа).
- telegram.ext: включает расширения для упрощения работы с Telegram API, такие как - Application,- CommandHandler,- MessageHandlerи другие.
- dotenv: используется для загрузки переменных окружения из файла - .env.
Для безопасности и удобства хранения конфиденциальных данных, таких как токены, мы используем файл .env. Загрузим эти переменные в наш код:
load_dotenv()
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
PAYMENT_PROVIDER_TOKEN = os.getenv('PAYMENT_PROVIDER_TOKEN')
DATABASE_URL = os.getenv('DATABASE_URL')- load_dotenv(): Загружает переменные окружения из файла - .env.
- TELEGRAM_TOKEN: Токен вашего бота, полученный от @BotFather. 
- PAYMENT_PROVIDER_TOKEN: Токен провайдера платежей, который используется для обработки транзакций. 
- DATABASE_URL: Путь к базе данных, которая хранит информацию о товарах и заказах. 
Теперь создадим функции-обработчики для команд бота. Эти функции будут выполнять определенные действия при получении соответствующих команд от пользователя.
Функция приветствия (/start)
Эта функция будет выполнена, когда пользователь впервые запустит бота. Она отправляет приветственное сообщение:
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("Добро пожаловать в наш магазин! Введите /catalog для просмотра товаров.")- async def start: Определяет асинхронную функцию, которая будет обрабатывать команду - /start.
- update.message.reply_text(): Отправляет сообщение пользователю. 
Функция помощи (/help)
Эта функция отображает пользователю список доступных команд:
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "Доступные команды:\\n"
        "/start - Начать работу с ботом\\n"
        "/help - Показать это меню помощи\\n"
        "/catalog - Показать каталог товаров\\n"
        "/cart - Показать содержимое вашей корзины\\n"
        "/checkout - Оформить заказ\\n"
        "Просто отправьте название товара, чтобы добавить его в корзину."
    )
    await update.message.reply_text(help_text)- help_command: Обрабатывает команду - /help, показывая список доступных команд и их описание.
- help_text: Содержит текст с описанием команд, который будет отправлен пользователю. 
Функция отображения каталога (/catalog)
Эта функция извлекает список товаров из базы данных и отправляет их пользователю:
async def catalog(update: Update, context: ContextTypes.DEFAULT_TYPE):
    items = session.query(Item).all()
    if items:
        message = "Каталог товаров:\\n"
        for item in items:
            message += f"{item.name} - {item.price:.2f} RUB\\n"
        message += "\\nВведите название товара, чтобы добавить его в корзину."
    else:
        message = "Каталог пуст."
    await update.message.reply_text(message)- session.query(Item).all(): Извлекает все товары из базы данных. 
- if items: Проверяет, есть ли товары в базе данных. 
- for item in items: Перебирает каждый товар и формирует сообщение с его названием и ценой. 
- await update.message.reply_text(message): Отправляет сформированное сообщение пользователю. 
Функция добавления товара в корзину
Эта функция позволяет пользователю добавить товар в свою корзину, отправив его название:
async def add_to_cart(update: Update, context: ContextTypes.DEFAULT_TYPE):
    item_name = update.message.text.strip()
    item = session.query(Item).filter_by(name=item_name).first()
if item:
    cart_item = session.query(CartItem).filter_by(user_id=update.message.chat_id, item_id=item.id).first()
    if cart_item:
        cart_item.quantity += 1
    else:
        cart_item = CartItem(user_id=update.message.chat_id, item_id=item.id, quantity=1)
        session.add(cart_item)
    session.commit()
    await update.message.reply_text(f"Товар '{item_name}' добавлен в корзину.")
else:
    await update.message.reply_text("Товар не найден. Пожалуйста, введите корректное название товара.")- item_name = update.message.text.strip(): Получает название товара, отправленное пользователем. 
- session.query(Item).filter_by(name=item_name).first(): Находит товар в базе данных по его названию. 
- if item: Проверяет, найден ли товар в базе данных. 
- session.query(CartItem).filter_by(user_id=update.message.chat_id, item_id=item.id).first(): Ищет, есть ли товар в корзине пользователя. 
- if cart_item: Если товар уже в корзине, увеличивает его количество. 
- session.add(cart_item): Добавляет новый товар в корзину, если его там нет. 
- session.commit(): Сохраняет изменения в базе данных. 
- await update.message.reply_text(): Отправляет пользователю сообщение о том, что товар добавлен в корзину. 
Функция отображения корзины (/cart)
Эта функция показывает пользователю все товары, которые находятся в его корзине, и общую стоимость:
async def view_cart(update: Update, context: ContextTypes.DEFAULT_TYPE):
    cart_items = session.query(CartItem).filter_by(user_id=update.message.chat_id).all()
    if cart_items:
        message = "Ваша корзина:\\n"
        total = 0
        for cart_item in cart_items:
            item_total = cart_item.quantity * cart_item.item.price
            message += f"{cart_item.item.name} - {cart_item.quantity} шт. - {item_total:.2f} RUB\\n"
            total += item_total
        message += f"\\nИтого: {total:.2f} RUB"
        message += "\\nВведите /checkout для оформления заказа."
    else:
        message = "Ваша корзина пуста."
    await update.message.reply_text(message)- session.query(CartItem).filter_by(user_id=update.message.chat_id).all(): Извлекает все товары в корзине пользователя. 
- if cart_items: Проверяет, есть ли товары в корзине. 
- item_total = cart_item.quantity * cart_item.item.price: Вычисляет общую стоимость каждого товара. 
- total += item_total: Подсчитывает общую сумму заказа. 
- await update.message.reply_text(): Отправляет пользователю сообщение с содержимым корзины и общей стоимостью. 
Функция оформления заказа (/checkout)
Эта функция генерирует счет на оплату товаров из корзины и отправляет его пользователю:
async def checkout(update: Update, context: ContextTypes.DEFAULT_TYPE):
    cart_items = session.query(CartItem).filter_by(user_id=update.message.chat_id).all()
    if cart_items:
        title = "Оплата заказа"
        description = "Оплата товаров из вашей корзины"
        payload = "Custom-Payload"
        currency = "RUB"
        prices = [LabeledPrice(f"{item.item.name} ({item.quantity} шт.)", int(item.item.price * 100 * item.quantity)) for item in cart_items]
    await context.bot.send_invoice(
        chat_id=update.message.chat_id,
        title=title,
        description=description,
        payload=payload,
        provider_token=PAYMENT_PROVIDER_TOKEN,
        currency=currency,
        prices=prices,
        start_parameter="test-payment",
    )
else:
    await update.message.reply_text("Ваша корзина пуста.")- title: Заголовок счета. 
- description: Описание счета. 
- payload: Произвольная строка, которая передается провайдеру платежей. 
- currency: Валюта, в которой производится оплата. 
- prices: Список товаров с указанием количества и стоимости. 
- await context.bot.send_invoice(): Отправляет счет пользователю через Telegram. 
Обработчик подтверждения оплаты
Эта функция обрабатывает запрос на подтверждение перед оплатой:
async def precheckout_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.pre_checkout_query
    if query.invoice_payload != "Custom-Payload":
        await query.answer(ok=False, error_message="Что-то пошло не так...")
    else:
        await query.answer(ok=True)- update.pre_checkout_query: Содержит данные о запросе на подтверждение платежа. 
- if query.invoice_payload != "Custom-Payload": Проверяет, совпадает ли полученный payload с ожидаемым. 
- await query.answer(ok=False, error_message="Что-то пошло не так..."): Отправляет ответ с ошибкой, если payload не совпадает. 
- await query.answer(ok=True): Подтверждает готовность к оплате, если все в порядке. 
Обработчик успешного платежа
Эта функция удаляет все товары из корзины пользователя после успешного платежа:
async def successful_payment_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    session.query(CartItem).filter_by(user_id=update.message.chat_id).delete()
    session.commit()
    await update.message.reply_text("Спасибо за покупку! Ваш заказ был успешно оформлен.")- session.query(CartItem).filter_by(user_id=update.message.chat_id).delete(): Удаляет все товары из корзины пользователя. 
- session.commit(): Сохраняет изменения в базе данных. 
- await update.message.reply_text("Спасибо за покупку! Ваш заказ был успешно оформлен."): Отправляет пользователю сообщение о завершении заказа. 
Теперь создадим основную функцию, которая будет инициализировать приложение Telegram и запускать бота:
**def** main():
    app = Application.builder().token(TELEGRAM_TOKEN).build()
# Добавляем обработчики команд
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help_command))
app.add_handler(CommandHandler("catalog", catalog))
app.add_handler(CommandHandler("cart", view_cart))
app.add_handler(CommandHandler("checkout", checkout))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, add_to_cart))
app.add_handler(PreCheckoutQueryHandler(precheckout_callback))
app.add_handler(MessageHandler(filters.SUCCESSFUL_PAYMENT, successful_payment_callback))
# Запуск бота
app.run_polling()- Application.builder().token(TELEGRAM_TOKEN).build(): Создает экземпляр приложения Telegram с использованием токена бота. 
- add_handler(): Добавляет обработчики команд и сообщений, которые будут обрабатывать соответствующие события. 
- run_polling(): Запускает бота в режиме опроса, чтобы он постоянно проверял наличие новых сообщений. 
Наконец, добавим код для инициализации базы данных при первом запуске и запуска основного цикла бота:
if __name__ == '__main__':
    # Создаем несколько товаров при первом запуске
    if not session.query(Item).first():
        session.add_all([
            Item(name="Сервер", price=100.0),
            Item(name="Облако", price=150.0),
            Item(name="Amvera", price=200.0)
        ])
        session.commit()
main()- if name == 'main':: Указывает, что код должен выполняться только при прямом запуске скрипта. 
- if not session.query(Item).first():: Проверяет, есть ли товары в базе данных. 
- session.add_all([...]): Добавляет несколько товаров в базу данных, если она пуста. 
- main(): Запускает бота. 
Структура проекта после настройки основного кода
После выполнения всех шагов ваша структура проекта будет выглядеть следующим образом:
TelegramShopBot/
│
├── .env               # Конфиденциальные данные
├── .gitignore         # Игнорируемый файл для Git
├── main.py            # Основной файл кода
└── shop.db            # Файл базы данных SQLiteШаг 6: Получение токена для платежной системы
Чтобы ваш Telegram-бот мог принимать платежи, нужно подключить платежную систему. Вы можете выбрать любую, механика везде похожа. Главное, вам необходимо получить токен. Этот токен используется для идентификации вашего проекта и обеспечения безопасности транзакций.
Шаги для получения токена платежной системы
Шаги для получения токена
1. Регистрация:
- Перейдите на официальный сайт YooMoney и зарегистрируйтесь, если у вас еще нет аккаунта. 
- Если у вас уже есть аккаунт, войдите в него. 
2. Создание кошелька YooMoney:
- Если у вас еще нет кошелька YooMoney, создайте его. Это ваш личный электронный кошелек, через который будут проходить платежи. 
3. Переход в раздел "API":
- Войдите в свой аккаунт на YooMoney. 
- В верхнем меню найдите и перейдите в раздел "API" или "Для бизнеса" → "Подключить прием платежей". 
- Здесь вам нужно будет создать новое приложение для интеграции с вашим ботом. 
4. Создание приложения:
- В разделе API выберите пункт "Подключить магазин или сервис". 
- Заполните форму для создания нового приложения. Укажите название вашего магазина или сервиса, а также URL-адрес вашего проекта, если у вас есть веб-сайт. 
- Выберите необходимые права доступа для вашего приложения. Для работы с платежами вам нужно будет указать права на совершение платежей и просмотр информации о транзакциях. 
- После успешного создания приложения вам будет предоставлен токен — уникальный идентификатор, который будет использоваться для взаимодействия вашего бота с API YooMoney. 
- Скопируйте этот токен, он вам понадобится для дальнейшей настройки. 
6. Настройка файла .env:
- Откройте ваш проект и найдите файл - .env, где хранятся переменные окружения.
- Добавьте полученный токен в этот файл: 
PAYMENT_PROVIDER_TOKEN=ваш_токенШаг 7: Запускаем бот магазин в облаке Amvera
Теперь, когда мы настроили и протестировали нашего Telegram-бота на локальной машине, самое время запустить его в облаке, чтобы он был доступен 24/7. В этом шаге мы развернем бота на платформе Amvera.
Почему Amvera?
- Это наш блог, как иначе; 
- Развертывание и обновление проекта идет всего тремя командами в IDE. "git push amvera master" и проект сам соберется, настроится и развернется. Это намного проще и удобнее самостоятельной настройки VPS. 
Регистрация в сервисе
- 
Создание аккаунта: - Перейдите на сайт Amvera и нажмите на кнопку "Регистрация". 
- Заполните все необходимые поля, включая номер телефона, и нажмите на кнопку "Отправить код". После прохождения регистрации будет доступен стартовый баланс на первые недели бесплатного использования. 
 
Создание проекта и размещение бота
- Подготовка кода для развертывания: 
- Amvera использует git для доставки кода в облако. Вам потребуется создать файл конфигурации - amvera.yml, который подскажет облаку, как запускать ваш проект.
- Для упрощения создания этого файла воспользуйтесь графическим инструментом генерации. 

- 
Выбор окружения и зависимостей: - Укажите версию Python и путь до файла - requirements.txt, который содержит все необходимые пакеты.
- Укажите путь до основного файла вашего проекта, например - main.py.
 
- 
Хранение данных: - Если бот сохраняет данные на диск, они должны размещаться в папке - data, чтобы избежать их потери при перезапуске.
 
- 
Генерация и загрузка файла: - Нажмите "Generate YAML" для создания файла - amvera.ymlи загрузите его в корень вашего проекта.
 
Инициализация и отправка проекта в репозиторий:
- 
Инициализируйте git репозиторий в корне вашего проекта, если это еще не сделано: git init
- 
Привяжите локальный репозиторий к удаленному на Amvera: git remote add amvera <https://git.amvera.ru/ваш_юзернейм/ваш_проект>
- 
Добавьте и зафиксируйте изменения: git add . git commit -m "Initial commit"
- 
Отправьте проект в облако: git push amvera master
Сборка и развертывание проекта:
- После отправки проекта в систему, на странице проекта статус изменится на "Выполняется сборка". 

После завершения сборки проект перейдет в стадию "Выполняется развертывание", а затем в статус "Успешно развернуто".

Если проект не развернулся, проверьте логи сборки и логи приложения для отладки.
Если проект завис на этапе "Сборка", убедитесь в корректности файла amvera.yml. И если требуется, перезапустите сборку на странице "Конфигурация".
Заключение
Поздравляем! Теперь у вас есть полноценный Telegram-бот для онлайн-магазина, который может работать круглосуточно, принимая заказы и платежи от пользователей. На этом пути вы узнали, как:
- Создать и настроить бота в Telegram, используя @BotFather. 
- Настроить проект, используя Python и необходимые библиотеки. 
- Создать базу данных на основе SQLite для хранения товаров и корзин пользователей. 
- Написать основной код бота, включающий команды для управления корзиной и оформления заказов. 
- Интегрировать платежную систему, чтобы принимать оплату за заказы прямо через Telegram. 
- Развернуть бота в облаке Amvera, чтобы он был доступен для пользователей 24/7. 
Ваш бот теперь готов к использованию, и вы можете продолжать его развитие, добавляя новые функции и улучшения. Например, вы можете внедрить уведомления о статусе заказов, интегрировать его с системой управления товарными остатками или добавить поддержку нескольких языков.
Автор: Алексей Пономарев
Комментарии (2)
 - DuhovichSasha17.08.2024 13:18- Спасибо. Попробую создать свой магазин по продаже тыкв, выращенных на даче. Но уж очень они разноколиберные. Но не гарантирую. много отвлекающих факторов. А подойдёт ли эта задача для школ, где изучают питон? 
 
           
 
sneg2015
Интересная статья. Отличный вариант для pet проекта.