Загрузка данных
import telebot
from telebot import types
import logging
# Настройка логгирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Токен бота (замени на свой)
TOKEN = 'ТВОЙ_ТОКЕН'
# ID закрытого канала (можно получить через @getidsbot)
CHANNEL_ID = -1001234567890
# Цена в рублях
PRICE = 500
bot = telebot.TeleBot(TOKEN)
# Команда /start
@bot.message_handler(commands=['start'])
def start(message):
markup = types.InlineKeyboardMarkup()
btn_buy = types.InlineKeyboardButton("Купить доступ", callback_data='buy_access')
btn_info = types.InlineKeyboardButton("Подробнее", callback_data='info')
markup.add(btn_buy)
markup.add(btn_info)
bot.send_message(message.chat.id,
f"Продажа доступа в закрытый канал.\n\n"
f"Цена: {PRICE} руб.\n"
f"После оплаты доступ навсегда.\n\n"
f"Выбери действие:",
reply_markup=markup)
# Обработка инлайн кнопок
@bot.callback_query_handler(func=lambda call: True)
def callback_handler(call):
if call.data == 'buy_access':
# Создание ссылки на оплату (замени на свою платёжную систему)
markup = types.InlineKeyboardMarkup()
btn_pay = types.InlineKeyboardButton("Оплатить", url='https://yoomoney.ru/...') # Замени на свою ссылку оплаты
btn_check = types.InlineKeyboardButton("Я оплатил", callback_data='check_payment')
markup.add(btn_pay)
markup.add(btn_check)
bot.edit_message_text(chat_id=call.message.chat.id,
message_id=call.message.message_id,
text=f"Для получения доступа:\n"
f"1. Оплати {PRICE} руб.\n"
f"2. Нажми 'Я оплатил'\n"
f"3. Ожидай подтверждения\n\n"
f"После проверки придёт ссылка-приглашение.",
reply_markup=markup)
elif call.data == 'info':
bot.answer_callback_query(call.id,
"Закрытый канал с эксклюзивным контентом. "
"Доступ навсегда после однократной оплаты.",
show_alert=True)
elif call.data == 'check_payment':
# Здесь должна быть проверка оплаты через API платёжной системы
# Для примера - сразу выдаём ссылку (в реальности нужна проверка)
try:
invite_link = bot.create_chat_invite_link(CHANNEL_ID, member_limit=1)
markup = types.InlineKeyboardMarkup()
btn_join = types.InlineKeyboardButton("Войти в канал", url=invite_link.invite_link)
markup.add(btn_join)
bot.edit_message_text(chat_id=call.message.chat.id,
message_id=call.message.message_id,
text=f"Оплата подтверждена!\n"
f"Твоя персональная ссылка (одноразовая):\n\n"
f"{invite_link.invite_link}\n\n"
f"Нажми кнопку ниже для входа.",
reply_markup=markup)
# Уведомление админу
bot.send_message(ADMIN_ID,
f"Новый покупатель!\n"
f"User ID: {call.from_user.id}\n"
f"Username: @{call.from_user.username}\n"
f"Имя: {call.from_user.first_name}")
except Exception as e:
logger.error(f"Ошибка создания ссылки: {e}")
bot.send_message(call.message.chat.id, "Ошибка. Свяжись с админом.")
elif call.data == 'admin_approve':
# Обработка подтверждения оплаты админом вручную
pass
# Команда для админа - проверка ручных платежей
@bot.message_handler(commands=['approve'])
def approve_payment(message):
if message.from_user.id != ADMIN_ID:
return
try:
parts = message.text.split()
user_id = int(parts[1])
invite_link = bot.create_chat_invite_link(CHANNEL_ID, member_limit=1)
bot.send_message(user_id,
f"Твой платёж подтверждён админом!\n"
f"Ссылка для входа:\n"
f"{invite_link.invite_link}")
bot.send_message(ADMIN_ID, f"Ссылка отправлена пользователю {user_id}")
except Exception as e:
logger.error(f"Ошибка: {e}")
# Запуск бота
if __name__ == '__main__':
logger.info("Бот запущен")
bot.polling(none_stop=True)