(Python / PyTelegramBotApi) Как сделать функцию на инлайн кнопке, при нажатии которой бот бы проверял подписан пользователь на канал или нет?

import telebot
import config

from telebot import types
from telebot.apihelper import ApiTelegramException
 
bot = telebot.TeleBot(config.TOKEN)
 
@bot.message_handler(commands=['start'])
def welcome(message):
    # User_id
    user_id = message.from_user.id
    print(user_id)

    # InlineKeyboard
    markup = types.InlineKeyboardMarkup()
    item1 = types.InlineKeyboardButton(text="👉Подписаться👈", url="https://t.me/freeapp_p")
    item2 = types.InlineKeyboardButton(text="Я подписался!🔥", callback_data="good")

    markup.add(item1, item2)
 
    bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>.\nДля начала подпишись на канал, чтобы получить желаемый Apk: https://t.me/freeapp_p\nНажми на кнопку '👉Подписаться👈' чтобы продолжить".format(message.from_user, bot.get_me()),
        parse_mode='html', reply_markup=markup)
 
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:
        if call.message:
            if call.data == 'good':
                bot.send_message(call.message.chat.id, 'Вот ссылка на канал с Apk\nhttps://t.me/Free_App_apkk')
            
            # show alert
            bot.answer_callback_query(callback_query_id=call.id, show_alert=False,
                text="Спасибо за подписку!")
 
    except Exception as e:
        print(repr(e))
 
# RUN
bot.polling(none_stop=True)

Немного изучил документацию к библиотеке PyTelegramBotApi. И не могу понять, как мне сделать так, чтобы при нажатии на инлайн кнопку, бот проверял, подписан ли пользователь или нет. И в случае подписки (успеха) бот высылал сообщение с ссылкой на закрытый канал, а в случае, если пользователь не подписан (неудаче) просил подписаться. Прошу помочь! Код я приложил.

1 ответ

Решение

Можно так:

import telebot
from telebot import types

TOKEN = ""
# Канал, на который проверяем подписан ли пользователь.
PUBLIC_CHANNEL = "@freeapp_p"
PUBLIC_CHANNEL_URL = "https://t.me/freeapp_p"
PRIVATE_CHANNEL_URL = "https://t.me/Free_App_apkk"

bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start'])
def welcome(message):
    markup = types.InlineKeyboardMarkup()
    item1 = types.InlineKeyboardButton(
        text="👉Подписаться👈",
        callback_data="subscribe_to_channel"
    )
    item2 = types.InlineKeyboardButton(
        text="Я подписался!🔥",
        callback_data="good"
    )
    markup.add(item1, item2)

    bot.send_message(
        message.chat.id,
        "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>.\n"
        "Для начала подпишись на канал, чтобы получить желаемый Apk: {2}\n"
        "Нажми на кнопку '👉Подписаться👈' чтобы продолжить".format(
            message.from_user,
            bot.get_me(),
            PUBLIC_CHANNEL_URL
        ),
        parse_mode='html',
        reply_markup=markup
    )

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:
        if call.message:
            if call.data == 'subscribe_to_channel':
                user_status = bot.get_chat_member(
                    chat_id=PUBLIC_CHANNEL,
                    user_id=call.message.from_user.id
                ).status

                # Если пользователь обладает одним из статусов,
                # тогда он подписан на канал.
                statuses = ('creator', 'administrator', 'member')
                for status in statuses:
                    if status == user_status:
                        # Пользователь подписан.
                        chat_id = call.message.chat.id
                        is_subscribed = True
                        break
                    else:
                        # Пользователь не подписан.
                        chat_id = call.message.chat.id
                        is_subscribed = False
                
                if is_subscribed:
                    # Если пользователь подписан, тогда отсылаем ему ссылку на приватный канал.
                    bot.send_message(
                        chat_id,
                        'Вот ссылка на приватный канал'
                        ' с Apk {0}\n'.format(PRIVATE_CHANNEL_URL)
                    )
            elif call.data == 'good':
                bot.send_message(
                    call.message.chat.id,
                    'Вот ссылка на канал'
                    ' с {0}\n'.format(PRIVATE_CHANNEL_URL)
                )

            # show alert
            bot.answer_callback_query(
                callback_query_id=call.id,
                show_alert=False,
                text="Спасибо за подписку!"
            )
    except Exception as e:
        print(repr(e))

bot.polling(none_stop=True)

 

Другие вопросы по тегам