Пишем Telegram-бота на Python: прикручиваем оплату Telegram Stars, систему промокодов и OpenAI
Краткое резюме
В статье описывается создание Telegram-бота на Python с интеграцией оплаты через Telegram Stars, системы промокодов и взаимодействия с OpenAI. Используется библиотека pyTelegramBotAPI и база данных SQLite.
Здравствуйте, читатели Хабра!
В качестве экспериментального проекта для практики работы с API и базами данных я разработал своего ассистента-бота. Основная идея проекта — создать прокси-сервер для взаимодействия с OpenAI, но с некоторыми особенностями. Я хотел изучить принципы работы с новой внутриигровой валютой Telegram Stars, внедрить собственную систему промокодов и административную панель без использования сложных фреймворков, оставаясь в рамках библиотеки telebot (pyTelegramBotAPI).
В этой статье я расскажу о том, как была реализована система биллинга с использованием Telegram Stars, управление пользователями и поделюсь исходным кодом проекта.
**Технические характеристики и задачи**
Целью проекта было создание минимально жизнеспособного продукта (MVP), который можно быстро развернуть. Для этого были выбраны следующие технологии:
* Язык программирования: Python 3.13.
* Библиотека: pyTelegramBotAPI (telebot).
* База данных: SQLite (с использованием самописного менеджера).
* Платёжная система: Telegram Stars (XTR).
**Реализация оплаты через Telegram Stars**
Одним из ключевых моментов проекта является реализация нативной оплаты. Telegram ввёл «Звёзды» относительно давно, и мне было важно понять, как их принимать.
В коде это реализовано через метод send_invoice. Важно отметить, что параметр currency должен быть установлен в «XTR».
Фрагмент обработчика кнопки покупки выглядит следующим образом:
```python
def create_invoice(chat_id, user_id, amount):
prices = [types.LabeledPrice(label=f"{amount} запросов", amount=amount)]
bot.send_invoice(
chat_id=chat_id,
title=f"Покупка {amount} запросов",
description=f"Пополнение баланса на {amount} запросов",
invoice_payload=f"requests_{amount}_{user_id}", # Передаем данные для идентификации платежа
provider_token="", # Для Stars токен не нужен, оставляем пустым
currency="XTR",
prices=prices
)
```
Для подтверждения оплаты необходимо обработать pre_checkout_query и successful_payment:
```python
@bot.pre_checkout_query_handler(func=lambda query: True)
def process_pre_checkout(pre_checkout_query):
# Тут можно добавить проверку доступности товара, но у нас цифровой актив
bot.answer_pre_checkout_query(pre_checkout_query.id, ok=True)
@bot.message_handler(content_types=['successful_payment'])
def process_successful_payment(message):
payment_info = message.successful_payment
# Парсим payload, который мы зашили при создании инвойса
payload_parts = payment_info.invoice_payload.split('_')
amount = int(payload_parts[1])
user_id = int(payload_parts[2])
# Начисляем запросы в БД
db_manager.add_requests(user_id, amount)
# Логируем платеж
db_manager.add_payment(
tg_id=user_id,
amount=amount,
stars_paid=amount,
payment_id=payment_info.telegram_payment_charge_id
)
bot.send_message(message.chat.id, f"✅ Оплата прошла успешно! Баланс пополнен.")
```
**Администрирование и управление пользователями**
Для удобства управления ботом я реализовал простую административную панель прямо внутри него. Основные команды: /stat (статистика), /createpromo (создание промокодов) и /give (ручное начисление запросов).
Команда /give была создана в первую очередь для меня — чтобы можно было быстро добавить тестовые запросы или компенсировать их пользователю в случае сбоя.
В telebot есть удобный механизм register_next_step_handler, который позволяет выстраивать цепочки диалогов (step-by-step) без подключения сложных решений.