ИИ

Пишем 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) без подключения сложных решений.

Фильтры и сортировка