В этой статье я покажу, как сделать 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-режим, поддержку платежей и многое другое.Подробности о 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
Откройте 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
, который подскажет облаку, как запускать ваш проект.Для упрощения создания этого файла воспользуйтесь графическим инструментом генерации.
![](https://habrastorage.org/getpro/habr/upload_files/223/02c/262/22302c262ca10e60abffa1a924a3a032.png)
-
Выбор окружения и зависимостей:
Укажите версию 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
Сборка и развертывание проекта:
После отправки проекта в систему, на странице проекта статус изменится на "Выполняется сборка".
![](https://habrastorage.org/getpro/habr/upload_files/2e3/dfd/809/2e3dfd809e58e6af4f94500d1f1c2b70.png)
После завершения сборки проект перейдет в стадию "Выполняется развертывание", а затем в статус "Успешно развернуто".
![](https://habrastorage.org/getpro/habr/upload_files/a4a/0e5/405/a4a0e54054aebe1d4f3937405c75c851.png)
Если проект не развернулся, проверьте логи сборки и логи приложения для отладки.
Если проект завис на этапе "Сборка", убедитесь в корректности файла amvera.yml
. И если требуется, перезапустите сборку на странице "Конфигурация".
Заключение
Поздравляем! Теперь у вас есть полноценный Telegram-бот для онлайн-магазина, который может работать круглосуточно, принимая заказы и платежи от пользователей. На этом пути вы узнали, как:
Создать и настроить бота в Telegram, используя @BotFather.
Настроить проект, используя Python и необходимые библиотеки.
Создать базу данных на основе SQLite для хранения товаров и корзин пользователей.
Написать основной код бота, включающий команды для управления корзиной и оформления заказов.
Интегрировать платежную систему, чтобы принимать оплату за заказы прямо через Telegram.
Развернуть бота в облаке Amvera, чтобы он был доступен для пользователей 24/7.
Ваш бот теперь готов к использованию, и вы можете продолжать его развитие, добавляя новые функции и улучшения. Например, вы можете внедрить уведомления о статусе заказов, интегрировать его с системой управления товарными остатками или добавить поддержку нескольких языков.
Автор: Алексей Пономарев
Комментарии (2)
DuhovichSasha
17.08.2024 13:18Спасибо. Попробую создать свой магазин по продаже тыкв, выращенных на даче. Но уж очень они разноколиберные. Но не гарантирую. много отвлекающих факторов. А подойдёт ли эта задача для школ, где изучают питон?
sneg2015
Интересная статья. Отличный вариант для pet проекта.