Телеграм-бот магазин на Python. Создание с нуля

В этой статье я покажу, как сделать Telegram-бота для онлайн-магазина на Python, который позволяет пользователям просматривать каталог товаров, добавлять их в корзину и оформлять заказы. Мы также рассмотрим, как интегрировать платежи и работать с базой данных для хранения информации о товарах и корзинах пользователей.

Шаг 1: Установка необходимых инструментов и библиотек

Для создания Telegram-бота для онлайн-магазина на Python нам понадобятся несколько ключевых инструментов и библиотек.

В этом шаге мы рассмотрим, какие именно библиотеки понадобятся, как их установить и что нужно проверить перед началом работы.

Требования к окружению

Убедитесь, что у вас установлен Python версии 3.7 или выше.

Вы можете проверить версию Python, выполнив следующую команду в терминале:

python --version

Если Python не установлен или версия ниже 3.7, скачайте и установите последнюю версию Python с официального сайта python.org.

Настройка виртуального окружения

Для удобства и изоляции проекта рекомендуется использовать виртуальное окружение. Виртуальное окружение позволяет создавать отдельную область, где будут установлены необходимые библиотеки, что предотвращает конфликты между зависимостями разных проектов.

Создание виртуального окружения и его активация:

  1. Создание виртуального окружения:

    python -m venv venv

    Здесь venv — это название папки, в которой будет храниться ваше виртуальное окружение. Вы можете выбрать другое название, если хотите.

  2. Активация виртуального окружения:

    После активации виртуального окружения вы увидите префикс (venv) в начале командной строки.

    Установка необходимых библиотек

    Мы будем использовать несколько Python-библиотек для создания бота, работы с базой данных и управления переменными окружения. Эти библиотеки можно установить с помощью pip — менеджера пакетов Python.

    1. python-telegram-bot - Это основная библиотека для взаимодействия с API Telegram.

    2. SQLAlchemy - ORM библиотека для работы с базами данных. Она позволяет легко создавать, читать, обновлять и удалять записи в базе данных, используя Python-код вместо SQL-запросов.

    3. python-dotenv - Эта библиотека используется для загрузки переменных окружения из файла .env. Это удобно для хранения конфиденциальной информации, такой как токены, пароли и другие данные.

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

    pip install python-telegram-bot sqlalchemy python-dotenv

    Подробности о библиотеке python-telegram-bot

    Библиотека python-telegram-bot предоставляет полный доступ к API Telegram и облегчает разработку ботов. Она включает обработчики команд, сообщений, inline-режим, поддержку платежей и многое другое.

    Подробности о SQLAlchemy

    SQLAlchemy — мощный инструмент для работы с базами данных в Python. Он позволяет использовать Python-классы для описания структуры базы данных (модели) и автоматизировать создание и выполнение SQL-запросов. В нашем проекте мы будем использовать SQLAlchemy для хранения информации о товарах и корзине пользователей.

    Подробности о dotenv

    python-dotenv позволяет загружать переменные окружения из файла .env, что упрощает управление конфиденциальными данными и настройками. Этот файл будет хранить токен вашего бота, токен платежного провайдера и URL базы данных.

    Проверка установки

    После установки всех библиотек рекомендуется проверить их успешную установку. Для этого можно использовать следующую команду:

    pip list

    Эта команда выведет список всех установленных пакетов, и вы должны увидеть python-telegram-bot,  SQLAlchemyи python-dotenv в этом списке.

    Теперь ваше окружение готово, и вы можете переходить к следующему шагу — созданию бота и настройке проекта.

    Шаг 2: Создание бота в Telegram

    Перед тем как приступить к разработке кода, вам нужно создать Telegram-бота и получить уникальный токен, который будет использоваться для взаимодействия вашего приложения с Telegram API. Для этого мы воспользуемся официальным сервисом Telegram — ботом под названием @BotFather.

Шаги по созданию бота в Telegram

  1. Откройте Telegram.

  2. Найдите @BotFather:

    • В строке поиска введите @BotFather. Это официальный бот от Telegram, который позволяет создавать и управлять другими ботами.

    • Найдите его в списке и откройте чат с ним.

  3. Создание нового бота:

    • В чате с @BotFather введите команду /newbot и отправьте сообщение.

    • @BotFather попросит вас ввести имя вашего бота. Имя должно быть уникальным и отражать назначение вашего бота. Например,  MyShopBot или StoreAssistantBot.

    • После того как вы введете имя,  @BotFather попросит вас придумать уникальное имя пользователя для вашего бота (username). Username должен оканчиваться на слово bot (например,  myshop_bot или store_assistant_bot). Если выбранное имя уже занято,  @BotFather предложит вам придумать другое.

  4. Получение токена:

    • После успешного создания бота,  @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: 
    
  5. Дополнительные настройки (по желанию):

    • Вы можете настроить описание, профильную картинку, и другие параметры вашего бота через команды, которые предлагает @BotFather. Например:

      • /setdescription — установить описание бота.

      • /setabouttext — установить текст «О боте».

      • /setuserpic — установить аватар для бота.

  1. Использования токена:

    Токен, который вы получили, необходимо будет добавить в файл .env для дальнейшего использования в коде. Пример содержимого файла .env:

    TELEGRAM_TOKEN=123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210

    Важные моменты:

    • Не делитесь своим токеном с другими людьми и не публикуйте его в открытом доступе, так как он предоставляет полный доступ к вашему боту.

    • Если вы случайно раскрыли свой токен, вы можете сгенерировать новый, используя команду /revoke у @BotFather.

    Теперь, когда вы создали бота и получили токен, можно переходить к следующему шагу — настройке проекта и написанию кода бота.

Шаг 3: Настройка проекта бота магазина

В этом шаге мы настроим структуру проекта для вашего Telegram-бота, который будет использоваться как онлайн-магазин. Мы создадим необходимые файлы, организуем их правильным образом, а также подготовим конфиденциальные данные, такие как токены и URL базы данных.

1. Создание структуры проекта

Начнем с создания папки для проекта и организации файлов:

  1. Создайте папку проекта:

    • Выберите удобное место на вашем компьютере и создайте новую папку для проекта. Назовите её, например,  TelegramShopBot.

    Для этого можно использовать команду в терминале:

    mkdir TelegramShopBot
    cd TelegramShopBot
  2. Создайте основной файл проекта:

    В терминале:

    touch main.py
  3. Создайте файл для хранения конфиденциальной информации:

    • Для хранения таких данных, как токен 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_TOKENDATABASE_URL

3. Организация и защита .env файла

Файл .env содержит конфиденциальные данные, поэтому важно убедиться, что он не попадет в общий доступ, особенно если вы используете системы контроля версий, такие как Git.

  1. Добавьте .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.

Регистрация в сервисе

  1. Создание аккаунта:

    • Перейдите на сайт Amvera и нажмите на кнопку «Регистрация».

    • Заполните все необходимые поля, включая номер телефона, и нажмите на кнопку «Отправить код». После прохождения регистрации будет доступен стартовый баланс на первые недели бесплатного использования.

Создание проекта и размещение бота

  1. Подготовка кода для развертывания:

  • Amvera использует git для доставки кода в облако. Вам потребуется создать файл конфигурации amvera.yml, который подскажет облаку, как запускать ваш проект.

  • Для упрощения создания этого файла воспользуйтесь графическим инструментом генерации.

22302c262ca10e60abffa1a924a3a032.png

  • Выбор окружения и зависимостей:

    • Укажите версию Python и путь до файла requirements.txt, который содержит все необходимые пакеты.

    • Укажите путь до основного файла вашего проекта, например main.py.

  • Хранение данных:

    • Если бот сохраняет данные на диск, они должны размещаться в папке data, чтобы избежать их потери при перезапуске.

  • Генерация и загрузка файла:

Инициализация и отправка проекта в репозиторий:

  • Инициализируйте git репозиторий в корне вашего проекта, если это еще не сделано:

    git init
  • Привяжите локальный репозиторий к удаленному на Amvera:

    git remote add amvera 
  • Добавьте и зафиксируйте изменения:

    git add .
    git commit -m "Initial commit"
  • Отправьте проект в облако:

    git push amvera master

Сборка и развертывание проекта:

2e3dfd809e58e6af4f94500d1f1c2b70.png

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

a4a0e54054aebe1d4f3937405c75c851.png

Если проект не развернулся, проверьте логи сборки и логи приложения для отладки.

Если проект завис на этапе «Сборка», убедитесь в корректности файла amvera.yml. И если требуется, перезапустите сборку на странице «Конфигурация».

Заключение

Поздравляем! Теперь у вас есть полноценный Telegram-бот для онлайн-магазина, который может работать круглосуточно, принимая заказы и платежи от пользователей. На этом пути вы узнали, как:

  1. Создать и настроить бота в Telegram, используя @BotFather.

  2. Настроить проект, используя Python и необходимые библиотеки.

  3. Создать базу данных на основе SQLite для хранения товаров и корзин пользователей.

  4. Написать основной код бота, включающий команды для управления корзиной и оформления заказов.

  5. Интегрировать платежную систему, чтобы принимать оплату за заказы прямо через Telegram.

  6. Развернуть бота в облаке Amvera, чтобы он был доступен для пользователей 24/7.

Ваш бот теперь готов к использованию, и вы можете продолжать его развитие, добавляя новые функции и улучшения. Например, вы можете внедрить уведомления о статусе заказов, интегрировать его с системой управления товарными остатками или добавить поддержку нескольких языков.

Автор: Алексей Пономарев

© Habrahabr.ru